将 Require.js 与可插拔模块一起使用
Using Require.js with pluggable modules
我想使用 Require.js 创建可插入模块。我对可插拔模块的意图是我可以有一个接口,例如 "Module1 should have method1(x,y)
and method2(a,b)
".
然后,在某些配置上,我可以使用该接口加载不同的 Require.js 模块。
例如,如果 运行 暂存环境中的代码我会使用 'app/stage/mymodule'
,如果 运行 在生产环境中我会使用 'app/prod/mymodule'
- 两者都遵守到给定的接口,尽管都映射到变量。
示例:
环境=暂存:define(['app/stage/mymodule'], function(mod1) { ... });
环境=生产:define(['app/prod/mymodule'], function(mod1) { ... });
现在,我明白了在 JS 中无法实现真正的接口 - 这很好。我只对第二部分感兴趣 - 使用基于通过 require.config
传递的一些初始配置的模块,这将影响整个应用程序。
你可以这样做:
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
无法遵循在 运行 时计算的依赖关系。您 将 必须在您提供给 r.js
的构建配置中明确列出一个或两个模块('app/stage/mymodule'
和 'app/prod/mymodule'
),否则两者都不会包括在内。
这种方法在 运行 时间允许最大的灵活性。您可以创建一个包含所有所需内容的捆绑包,并让负责人决定何时安装捆绑包,无论他们想使用 env
的任何值,然后将加载正确的模块。
我想使用 Require.js 创建可插入模块。我对可插拔模块的意图是我可以有一个接口,例如 "Module1 should have method1(x,y)
and method2(a,b)
".
然后,在某些配置上,我可以使用该接口加载不同的 Require.js 模块。
例如,如果 运行 暂存环境中的代码我会使用 'app/stage/mymodule'
,如果 运行 在生产环境中我会使用 'app/prod/mymodule'
- 两者都遵守到给定的接口,尽管都映射到变量。
示例:
环境=暂存:define(['app/stage/mymodule'], function(mod1) { ... });
环境=生产:define(['app/prod/mymodule'], function(mod1) { ... });
现在,我明白了在 JS 中无法实现真正的接口 - 这很好。我只对第二部分感兴趣 - 使用基于通过 require.config
传递的一些初始配置的模块,这将影响整个应用程序。
你可以这样做:
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
无法遵循在 运行 时计算的依赖关系。您 将 必须在您提供给 r.js
的构建配置中明确列出一个或两个模块('app/stage/mymodule'
和 'app/prod/mymodule'
),否则两者都不会包括在内。
这种方法在 运行 时间允许最大的灵活性。您可以创建一个包含所有所需内容的捆绑包,并让负责人决定何时安装捆绑包,无论他们想使用 env
的任何值,然后将加载正确的模块。