2013-08-28 2 views
2

У меня есть конфигурация для requirejs, которая совместно используется несколькими приложениями. Когда приложение загружается, приложение получает объект с макетом приложения (и различными другими параметрами). Я хочу использовать этот объект для определения модулей/пакетов для приложения.RequireJS: как динамически определять/добавлять пакеты

siteMap = { modules: { "foo": { … }, "bar": { … }, … }, other: "stuff" }

/shared/ 
    libs/ 
    bootstrap.js 
    jquery.js 
    … 
    app.js 

/$appName/ 
    foo/ 
    index.html 
    edit.html 
    main.js 
    bar/ 
    index.html 
    stuff.html 
    main.js 
    … 

Я предполагаю, что должен быть способ, чтобы добавить пакеты, выходит что-то вроде этого:

// /shared/app.js 
require.config({ 
    paths: { 
    "bootstrap": ["//hosted.bootstrap.js","/shared/libs/bootstrap.js"], 
    "jquery": ["//hosted.jquery.js","/shared/libs/jquery.js"], 
    "siteMap": "//appName.example.com/api/siteMap" 
    }, 
    … 
}); 

require(['jquery','siteMap','bootstrap'], function($,siteMap) { 
    for (var module in siteMap.modules) 
    { 
    require.config.packages[module] = siteMap.modules[module]; 
    // OR 
    require.addPackage(siteMap.modules[module]); 
    } 
}); 
+0

Что должно произойти в результате вызова 'addPackage' (или что-то еще)? – explunit

+0

@explunit, пакет добавляется к требованию, и его содержимое выполняется (и доступно), как если бы оно находилось в 'app.js' – jacob

+0

, что-то должно произойти с .html в этих папках или просто нужно загрузить (например) foo/main.js? – explunit

ответ

2

Вы можете гнездо другой require() вызов, чтобы загрузить дополнительные модули после Карта сайта говорит вам что должно быть загружено. Что-то вроде этого:

require(['jquery','siteMap','bootstrap'], function($,siteMap) { 
    // .map assumes modern browser or use of something like es5-shim 
    var modulesToLoad = siteMap.modules.map(function(m) { return m + '/main'; }); 
    require(modulesToLoad, function() { 
     // kick off the rest of app logic 
    }); 
}); 
+0

Где метод map() используется в 'siteMap.modules.map()'? Кроме того, предполагается, что в конце строки № 2 есть полуколона, не так ли? – jacob

+0

ах, понял. благодаря! Я попробую сейчас. – jacob

+0

Что делать, если загруженные модули имеют неизвестное количество зависимостей? Я думаю, что 'require (modulesToLoad, function()' должны иметь параметры, объявленные в конструкторе функций. Кроме того, мои приложения: я слишком упрощен SiteMap; 'siteMap.modules' на самом деле является объектом, а не массивом. – jacob

Смежные вопросы