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