如果我正在制作一个通用的 JavaScript 库,我应该如何处理 RequireJS 支持?
据我所知,使您的代码或多或少地与 RequireJS 兼容使得没有 RequireJS 就无法使用。那我为什么要这么做?
没有 Require 的人如何使用此代码?
有没有办法在不分叉/分支的情况下支持两者?我应该提供垫片代码吗?
我理解正确吗?
如果我正在制作一个通用的 JavaScript 库,我应该如何处理 RequireJS 支持?
据我所知,使您的代码或多或少地与 RequireJS 兼容使得没有 RequireJS 就无法使用。那我为什么要这么做?
没有 Require 的人如何使用此代码?
有没有办法在不分叉/分支的情况下支持两者?我应该提供垫片代码吗?
我理解正确吗?
如果您只处理浏览器(而不是 node.js),那么只需几行代码就可以使库同时支持 AMD 和非 AMD。
例如,这是来自 jQuery 的文件,其中除了四个之外都是注释:
// 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 的非常相似的片段:
} else if (typeof define === 'function' && define['amd']) {
// [2] AMD anonymous module
define(['exports'], factory);
}
请注意,jQuery 采用命名模块方法,而 Knockout 使用匿名模块。即使检测到 AMD 时$
,jQuery 也会离开jQuery
全局命名空间,而 Knockout(可能还有许多其他人)在检测到 AMD 时不会在全局命名空间中放置任何内容。每种方法都有利有弊,如以下问题所示: