Javascript 在设计JS库时,我应该让它与RequireJS/AMD兼容还是不兼容?

Javascript 在设计JS库时,我应该让它与RequireJS/AMD兼容还是不兼容?,javascript,requirejs,amd,Javascript,Requirejs,Amd,如果我正在制作一个通用的JavaScript库,我应该如何处理RequireJS支持 据我所知,使您的代码或多或少符合RequireJS会使您在没有RequireJS的情况下无法使用。那我为什么要这么做 没有要求的人如何使用此代码 有没有一种方法可以在不分叉/分支的情况下支持这两种方法?我应该提供垫片代码吗 我理解正确吗 如果您只处理浏览器(而不是node.js),那么要使库同时支持AMD和非AMD,只需几行代码 例如,除四条外,其余均为注释: // Execute the factory t

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

据我所知,使您的代码或多或少符合RequireJS会使您在没有RequireJS的情况下无法使用。那我为什么要这么做

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

  • 有没有一种方法可以在不分叉/分支的情况下支持这两种方法?我应该提供垫片代码吗

  • 我理解正确吗


如果您只处理浏览器(而不是node.js),那么要使库同时支持AMD和非AMD,只需几行代码

例如,除四条外,其余均为注释:

// 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;
    });
}
我们可以找到一个非常类似的基因敲除片段:

请注意,jQuery采用这种方法,而knockout使用匿名模块。jQuery还将
$
jQuery
保留在全局命名空间中,而Knockout(可能还有许多其他)在检测到AMD时不会在全局命名空间中放置任何内容。每种方法都有利弊,如以下问题所示:


请参阅许多常见库(如jQuery和Knockout)的源代码,这些库支持AMD和非AMDUMD,看起来它试图通过增加大量复杂性来修复每种情况。有没有更简单、更灵活的最佳实践?太好了!那么,这种方法是否违反了任何规则,将全局名称空间与其肮脏的jQuery变量弄脏了呢?请注意,amd导出功能的位置已移动到
} else if (typeof define === 'function' && define['amd']) {
    // [2] AMD anonymous module
    define(['exports'], factory);
}