我正在尝试动态加载模块,如本文开头所述:
这是我的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函数内的代码永远不会被执行,并且#34;加载模块"永远不会打印到控制台。在This link阅读了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
如何从我正在加载的模块中访问这些功能?
答案 0 :(得分:1)
您应该使用 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
答案 1 :(得分:0)
为什么要以这种方式加载模块?你试图在一个循环中进行异步调用,基本上你每次用另一个需要重写你的“mod”变量,即使没有要求返回的异步调用。
// 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
});