2

私は以下で正しく一緒jqueryに働いています。jquery-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」というモジュールを探すjquery-cookie ソース コードの次の行を参照してください。

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

元の例で示したように、jQuery を nc-query としてラップして、グローバルな $. あなたがしなければならないかもしれないもう1つのことは、自動的に使用したいライブラリの「マップ」エントリを作成することです。

したがって、例の修正版は次のようになります。

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」を指定することを意味します。この方法で作業したいライブラリに必要なだけこれらを作成できます。map の 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 に答える