我需要编写一个javascript插件,既可以用作AMD模块,也可以用作非AMD(同步加载)的javascript文件。
它依赖于“Jockey.js”和jquery库。
换句话说,我想构建文件,以便它在传统的非异步html结构中使用时不会失败(通过脚本标记加载,在通过脚本标记加载依赖项之后),但它也可以在没有垫片的情况下作为AMD模块工作,并指定其依赖性。可以这样做,还是垫片是唯一的方法呢?
答案 0 :(得分:3)
可以做到。我有一个这样的插件right here。这是一般结构:
(function (factory) {
// If in an AMD environment, define() our module, else use the
// jQuery global.
'use strict';
if (typeof define === 'function' && define.amd)
define(['jquery'], factory);
else
factory(jQuery);
}(function ($) {
'use strict';
// This is the plugin proper.
$.fn.myMethod = function(/* ... */) {
// Code for the method...
};
}));
除了jQuery之外还需要其他东西的插件会使用上面的结构并进行以下修改:
对define
的调用,其中列出了所需的其他模块。
factory(jQuery)
调用(在非AMD分支中,在RequireJS未加载插件时使用),在jQuery
之后传递来自全局空间的其他值。
工厂函数function ($)
,它有其他参数来接收传递给它的其他值。
因此,如果插件需要模块foo
,它在全局空间中将自己导出为foo
并且使用RequireJS配置将其命名为"foo"
,那么:
(function (factory) {
// If in an AMD environment, define() our module, else use the
// jQuery global.
'use strict';
if (typeof define === 'function' && define.amd)
define(['jquery', 'foo'], factory);
else
factory(jQuery, foo);
}(function ($, foo) {
'use strict';
// This is the plugin proper.
$.fn.myMethod = function(/* ... */) {
// Code for the method...
foo.blah();
};
}));