2

我在下面正确地一起工作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"));
});
4

2 回答 2

2

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 以消除全局 $. 您可能需要做的另一件事是为您想要自动使用它的任何库创建一个“地图”条目。

因此,您的示例的修改版本将如下所示:

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 文档

于 2013-03-22T18:47:01.180 回答
0

我发现这行得通,我只是不认为这是最好的解决方案。

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

我对这段代码及其工作原理的解释如下。在它的代码中jquery-cookie使用它,并且它是全局的,足以让 jquery 和 cookie 都加载。我将其设置为本地,noConflict 允许在此要求内使用。$$$

于 2013-03-22T15:57:49.200 回答