我是否可以编写一个javascript文件,该文件可选地使用require.js来指定依赖项何时可用?

时间:2014-01-25 14:13:51

标签: javascript requirejs amd

我需要编写一个javascript插件,既可以用作AMD模块,也可以用作非AMD(同步加载)的javascript文件。

它依赖于“Jockey.js”和jquery库。

换句话说,我想构建文件,以便它在传统的非异步html结构中使用时不会失败(通过脚本标记加载,在通过脚本标记加载依赖项之后),但它也可以在没有垫片的情况下作为AMD模块工作,并指定其依赖性。可以这样做,还是垫片是唯一的方法呢?

1 个答案:

答案 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之外还需要其他东西的插件会使用上面的结构并进行以下修改:

  1. define的调用,其中列出了所需的其他模块。

  2. factory(jQuery)调用(在非AMD分支中,在RequireJS未加载插件时使用),在jQuery之后传递来自全局空间的其他值。

  3. 工厂函数function ($),它有其他参数来接收传递给它的其他值。

  4. 因此,如果插件需要模块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();
        };
    }));