与require.js实现jQuery的正确方法(Correct way to implement

2019-07-23 05:41发布

我同时使用require.js和jQuery的稳定版本,我目前包括jQuery的这样

requirejs.config({
paths: {
    'jQuery': 'vendor/jquery',
}
});

require(['jQuery'], function(jQuery) {
    log(jQuery); // working
});

我不明白的是,我并不真的需要明确给予回复jQuery的,因为这仍然可以工作(也是在其他模块):

require(['jQuery'], function( // nothing here ) {
    log(jQuery); // working
});

现在,我不知道这是否是这样做的,因为使用$美元符号参照jQuery的不工作也是正确的方法!

Answer 1:

要点是我看到它:

  1. jQuery的使用时与RequireJS自身注册为名为模块“的jquery”(全部小写)。 在您的例子,你要使用它作为“jQuery的”,这混淆了事情有点,因为这也是加载时,它注册一个全局函数的名称(见点#2)。
  2. 默认情况下,使用jQuery的全局性功能与AMD / RequireJS即使使用“$”和“jQuery的”,自行注册。 如果你想关闭这个行为,你必须调用noConflict功能。
  3. 你可以用你的RequireJS参考的jQuery在noConflict调用,如下面的例子。 据我所知,这是推荐的方法,当你不具备这需要全球$或jQuery的其它模块:

     requirejs.config({ paths: { 'jquery': 'vendor/jquery', } }); define('jquery-private', ['jquery'], function (jq) { return jq.noConflict( true ); }); require(['jquery-private'], function(jq) { console.log(jq); // working console.log($); // undefined console.log(jQuery); // undefined }); 

另请参阅我的答案在这个问题上就如何与其他模块映射到使用私有(noConflict)版本。

对于更多的背景,参见从jQuery源代码是我上述一切的原因这些行:

    // Expose jQuery to the global object
    window.jQuery = window.$ = jQuery;

    // Expose jQuery as an AMD module, but only for AMD loaders that
    // understand the issues with loading multiple versions of jQuery
    // in a page that all might call define(). The loader will indicate
    // they have special allowances for multiple jQuery versions by
    // specifying define.amd.jQuery = true. Register as a named module,
    // since jQuery can be concatenated with other files that may use define,
    // but not use 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.amd.jQuery ) {
        define( "jquery", [], function () { return jQuery; } );
    }

更新: 与RequireJS网站的jQuery的部分使用已更新,以反映上述信息。 另见这个答案的一步一步的,包括优化。 只是想再次强调的是,如果你所有的插件都是AMD兼容这种noConflict方法才有效。



文章来源: Correct way to implement jQuery with require.js