如果我正在制作一般用途的JavaScript库,我该如何处理RequireJS支持?
据我所知,让你的代码更多或更少地符合RequireJS,使得没有RequireJS就无法使用。那我为什么要这样做呢?
没有要求的人如何使用此代码?
有没有办法在不分叉/分支的情况下支持两者?我应该提供垫片代码吗?
我能理解这一点吗?
答案 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时将不放在全局命名空间中。每种方法都有利弊,如这些问题所示: