我同时使用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的不工作也是正确的方法!
要点是我看到它:
- jQuery的使用时与RequireJS自身注册为名为模块“的jquery”(全部小写)。 在您的例子,你要使用它作为“jQuery的”,这混淆了事情有点,因为这也是加载时,它注册一个全局函数的名称(见点#2)。
- 默认情况下,使用jQuery的全局性功能与AMD / RequireJS即使使用“$”和“jQuery的”,自行注册。 如果你想关闭这个行为,你必须调用noConflict功能。
你可以用你的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方法才有效。