10

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

据我所知,使您的代码或多或少地与 RequireJS 兼容使得没有 RequireJS 就无法使用。那我为什么要这么做?

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

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

  • 我理解正确吗?

4

1 回答 1

23

如果您只处理浏览器(而不是 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 时不会在全局命名空间中放置任何内容。每种方法都有利有弊,如以下问题所示:

于 2013-07-30T18:41:45.303 回答