我想使用Require.js来创建可插拔模块。我对可插拔模块的意图是我可以拥有一个界面,例如" Module1应该有method1(x,y)
和method2(a,b)
"。
然后,在某些配置中,我可以使用该接口加载不同的Require.js模块。
因此,例如,如果在暂存环境中运行代码,我将使用'app/stage/mymodule'
,如果在生产中运行,我将使用'app/prod/mymodule'
- 两者都遵循给定的接口,尽管两者都映射到变量
示例:
Env =分期:define(['app/stage/mymodule'], function(mod1) { ... });
Env =生产:define(['app/prod/mymodule'], function(mod1) { ... });
现在,我知道在JS中无法实现真正的界面 - 这很好。我对第二部分感兴趣 - 使用基于通过require.config
传递的一些初始配置的模块将影响整个应用程序。
答案 0 :(得分:1)
你可以这样做:
define(function (require, exports, module) {
// module.config returns only that section of the configuration that
// pertains to **this** module; not the whole configuraiton.
var config = module.config();
var env = config.env;
// Compute the dependency...
var env_to_module_map = {
stage: 'app/stage/mymodule',
production: 'app/prod/mymodule'
};
var dep = env_to_module_map[env];
if (!dep)
// configuration error
throw new Error("..."); // Whatever appropriate.
require([dep], function (mod) {
mod.method1(1, 2);
});
});
假设上面的模块名为main
,那么您的RequireJS配置将具有以下内容:
require.config({
....,
config: {
main: {
env: "stage" // Or "production".
}
}
});
请注意,这会使优化变得复杂,因为r.js
无法遵循在运行时计算的依赖关系。您将必须在您为'app/stage/mymodule'
提供的构建配置中明确列出一个或两个模块('app/prod/mymodule'
和r.js
),否则两者都不会被包含在内。< / p>
此方法允许在运行时具有最大的灵活性。您可以创建一个包含所需内容的包,让负责任的人决定何时安装捆绑包,以及他们想要使用的env
值,并加载正确的模块。