将Require.js与可插拔模块一起使用

时间:2015-02-18 17:25:04

标签: javascript requirejs

我想使用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传递的一些初始配置的模块将影响整个应用程序。

1 个答案:

答案 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值,并加载正确的模块。