1

RequireJs を使用して、会社のメイン Web サイトに AMD モジュールをロードしています。また、requireJS を使用して、別のドメインでホストされているモジュールをロードしています。requireJS は、「コンテキスト」フィールドを使用してこれをサポートします。すなわち。別の baseUrl を使用して別のサンドボックス環境を作成します。

当面の問題は、2 つの別個のコンテキストに共通のオブジェクトを共有させたい場合です。例えば。jquery (2 回のロードを避けるため) またはウィジェット間でイベントをトリガーする pubsub 実装。

グローバルなrequireJSとともに定義関数を使用して、コンテキスト間にモジュールを挿入する方法を考え出しました

main.js - http://example.com/src/main.jsでホストされています

require(['jquery'], functin($){

    // create sandbox/contexted instance of requireJs 
    var sandbox = requireJS.config({
        context: "myContext",
        baseUrl : 'http://otherdomain.com/src'
    });

    // load module (with internal dependencies) from other domain
    sandbox.require(['modules/bootstrap.js'], function(bootstrap){
        bootstrap.run();
    });

});

bootstrap.js - 例。http://widgets.com/src/modules/bootstrap.jsでホストされています

define(function(){

    // define jquery into sandboxed environemnt
    requireJs('jquery', function($) {
        define('jquery', function(){
            return window.jQuery;
       });
    });

    // obtain sandboxed instance from parent
    var sandbox = requireJs.config({
        context: "myContext"
    });

    sandbox(['jquery'], function($){
        console.log($);
    });

});

問題は、jquery(または関数を返す他のモジュール)を定義すると、「requreJS」の方法で(グローバルを使用しないで)、常にエラーがスローされることです。

    // define jquery into sandboxed environemnt
    requireJs('jquery', function($) {
        define('jquery', $);
    });

これはバグですか、それとも機能ですか?

4

1 に答える 1

0

私は実際にこれを自分で解決しました。秘訣は、返された関数を新しい無名関数内にラップすることです。

// inject global module into contexted require
function injectContext(moduleId, module){
    var m = module;
    if(typeof module === 'function') {
        m = function() {
            return module;
        };
    } 
    define(moduleId, m);
}
于 2013-09-18T10:07:44.600 に答える