使用requirejs中的插件停止全局jquery

我在下面正确地使用了jqueryjquery-cookie 。 我想让jquery不是全局的。 现在是。 我试过的任何方法似乎打破了jquery-cookie

 require.config({ paths: { "jquery": '../components/jquery/jquery', "jquery-cookie": "../components/jquery-cookie/jquery.cookie", }, shim: { "jquery-cookie": { deps: ['jquery'] } } }); require(["jquery", "jquery-cookie"], function($) { console.log($().jquery); // 1.7.2 console.log($.cookie("hello")); // null }); 

以下更改将使jquery本地和中断cookie:

 define("nc-jquery",['jquery'], function () { return jQuery.noConflict(true); }); require(["nc-jquery", "jquery-cookie"], function($) { console.log($().jquery); console.log($.cookie("hello")); }); 

jquery和jquery-cookie都与AMD兼容,因此不需要进行任何shim配置。 只要您定义了一个名为’jquery’的路径(您可以这样做),jquery-cookie模块将需要它并在没有全局$的情况下加载依赖项。 在jquery-cookie源代码中查看此行,在该代码中查找名为“jquery”的模块:

 if (typeof define === 'function' && define.amd) { // AMD. Register as anonymous module. define(['jquery'], factory); 

正如您在原始示例中所示,您可以将jQuery包装为nc-query以消除全局$。 您可能需要做的另一件事是为您想要自动使用它的库创建一个“map”条目。

那么你的例子的修改版本看起来像这样:

 require.config({ paths: { 'jquery': '../components/jquery/jquery', 'jquery-cookie': '../components/jquery-cookie/jquery.cookie' }, map: { 'jquery-cookie': { 'jquery': 'nc-jquery' } } }); define('nc-jquery', ['jquery'], function (jq) { return jq.noConflict( true ); }); require(['nc-jquery', 'jquery-cookie'], function(myNonGlobaljQuery) { console.log(myNonGlobaljQuery().jquery); console.log(myNonGlobaljQuery.cookie("hello")); }); 

这意味着当jquery-cookie要求’jquery’时,你会给它’nc-jquery’。 您可以根据需要为这些方式创建所需的库。 请参阅地图的API文档 。

我发现这有效,我认为这不是最好的解决方案。

 require(["jquery", "jquery-cookie"], function() { var $ = jQuery.noConflict(true); console.log($().jquery); console.log($.cookie("hello")); }); 

我对此代码的解释及其工作原理如下。 jquery-cookie使用$ in的代码,并且这个$是全局的,只需要足够的时间来加载jquery和cookie。 我使用noConflict将其设置为本地,允许在此要求范围内使用$