将 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 的任何值,然后将加载正确的模块。