2013-06-26 4 views
1

Я использую RequireJs для загрузки модулей AMD на основной веб-сайт моей компании. Мы также используем requireJS для загрузки модулей, размещенных на отдельных доменах. requireJS поддерживает это с использованием поля «context»; то есть. создайте отдельную изолированную среду с отдельным базовымUrl.Многоконтекстные требования и наследование зависимостей между контекстами

Проблема заключается в том, когда мы хотим, чтобы два отдельных контекста имели общий объект; например. jquery (чтобы не загружать его дважды) или реализация 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($); 
    }); 

}); 

Проблемы в том, что если Im определяющий JQuery (или любой другой модуль, который возвращает функцию), TjE «requreJS» -way (не используя глобал), он всегда будет выдавать ошибку

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

Это ошибка или функция?

ответ

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); 
}