使用Require.js动态加载模块

我正在尝试动态加载模块,如本文开头所述:

参考链接

这是我的scripts/main.js

 require.config({ baseUrl: 'scripts', paths: { jquery: 'lib/jquery-2.0.3' }, config: { 'main': { modules: ['mod1', 'mod2', 'mod3'] } } }); require(function(require, exports, module) { console.log("Loading modules"); require(module.config().modules); }); 

当main.js被加载时,外部require函数内的代码永远不会被执行,并且“加载模块”永远不会被打印到控制台。 阅读了这个链接的AMD文档,我看不出我做错了什么。 动态加载数组外部定义的模块的正确方法是什么?

谢谢!

更新:

这就是我现在拥有的:

 // main.js require.config({ ... config: { 'some_module': { modules: ['mod1'] } } }); require(['some_module'], function(some_module) { }); // some_module.js define(function(require, exports, module) { var mods = module.config().modules; var mod; for (var i=0; i < mods.length; i++) { mod = require(mods[i]); mod.fn_call(); } }); 

当我执行require(module.config().modules)mod1确实被加载了。 但是,我不知道如何使用require的返回值来调用mod1返回的函数。

有了上面的代码,我明白了

 Uncaught Error: Module name "mod1" has not been loaded yet for context: _ http://requirejs.org/docs/errors.html#notloaded 

如何从我加载的模块中访问这些function?

你应该使用define指令:

 define(function(require, exports, module) { console.log("Loading modules"); require(module.config().modules); }); 

通过RequireJS配置的config属性,您可以为每个模块定义配置。 然后,在模块定义中,您可以访问该配置,在您的情况下加载依赖项。

在任何情况下,我认为您不需要将应用程序的主要入口点作为AMD模块公开,因为它没有任何意义。 它应该是这样的:

 // some_module.js (or path for some_module alias) define(function(require, exports, module) { require(module.config().modules); ... return function () {}; }); // main.js require.config({ ... config: { 'some_module': { modules: ['mod1', 'mod2', 'mod3'] } } }); require('some_module'); // loads some_module, mod1, mod2, mod3 

为什么要以这种方式加载模块? 你试图在循环中进行异步调用,基本上你每次都用另一个需要重写你的“mod”变量,即使没有require返回的异步调用。

 // some_module.js define(function(require, exports, module) { var mods = module.config().modules; var mod; for (var i=0; i < mods.length; i++) { mod = require(mods[i]);//your loop doesn't will wait for it... mod.fn_call(); } }); 

以这种方式加载你的模块,如果你想放置一些依赖项,你用config( http://requirejs.org/docs/api.html#config )来做,我没有看到任何理由不这样做。 ..

 define(['mod1', 'mod2', 'mod3'], function(mod1, mod2, mod3) { //do whatever you want with your modules });