RequireJS:如何动态定义/添加包

时间:2013-08-28 18:33:41

标签: javascript dynamic module 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]);
  }
});

1 个答案:

答案 0 :(得分:3)

在siteMap告诉您应该加载什么之后,您可以嵌套另一个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
    });
});