在设计JS库时,我应该使它与RequireJS / AMD兼容吗?

时间:2013-07-30 01:18:04

标签: javascript requirejs amd

如果我正在制作一般用途的JavaScript库,我该如何处理RequireJS支持?

据我所知,让你的代码更多或更少地符合RequireJS,使得没有RequireJS就无法使用。那我为什么要这样做呢?

  • 没有要求的人如何使用此代码?

  • 有没有办法在不分叉/分支的情况下支持两者?我应该提供垫片代码吗?

  • 我能理解这一点吗?

1 个答案:

答案 0 :(得分:23)

如果您只处理浏览器(而不是node.js),那么只有少数几行可以使该库支持AMD和非AMD。

例如,here is the file from jQuery that does it,其中除了四个以外都是评论:

// Execute the factory to produce jQuery
var jQuery = factory( window );

// Register as a named AMD module, since jQuery can be concatenated with other
// files that may use define, but not via a proper concatenation script that
// understands anonymous AMD modules. A named AMD is safest and most robust
// way to register. Lowercase jquery is used because AMD module names are
// derived from file names, and jQuery is normally delivered in a lowercase
// file name. Do this after creating the global so that if an AMD module wants
// to call noConflict to hide this version of jQuery, it will work.
if ( typeof define === "function" && define.amd ) {
    define( "jquery", [], function() {
        return jQuery;
    });
}

可以找到来自Knockout的非常相似的片段here

} else if (typeof define === 'function' && define['amd']) {
    // [2] AMD anonymous module
    define(['exports'], factory);
}

请注意,jQuery采用named module方法,而knockout使用匿名模块。 jQuery还将$jQuery留在全局命名空间even when AMD is detected中,而Knockout(可能还有许多其他人)在检测到AMD时将放在全局命名空间中。每种方法都有利弊,如这些问题所示: