[英]Load modules dynamically with 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
如何從我正在加載的模塊訪問功能?
您應該使用定義指令:
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
為什么要以這種方式加載模塊? 您正在嘗試在循環內進行異步調用,基本上您每次都使用另一個 require 重寫“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
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.