为requirejs软件包预设软件包范围的配置

时间:2012-10-02 08:16:54

标签: javascript configuration package requirejs

我目前正在使用requirejs,为此我开始编写一个小包。该软件包包含一个main.js,应用程序的入口点以及将通过调用main.js加载到require的其他几个模块。

该软件包有几个可以在运行时配置的选项,以便于维护我有一个在需要时加载的中心configuration.jsconfiguration.js的内容只是一个将键映射到值,没有功能或任何东西的对象。只是一个键值映射。

现在requirejs允许将选项传递给包,配置通过requirejs配置完成。我遇到的问题是,它只能在main.js中使用,而不能在包中的其他模块中使用,除非我将它们硬编码到main.js,否则我找不到设置默认值的方法。

我当前的方法(具有configuration.js的方法)是将给予requirejs的配置与configuration.jsmain.js的内容合并。

main.js

define(function(require, exports, module) {
    var $ = require('jquery'); // Could be any library that offers an "extend"
                               // feature that allows "deep" copies.

    var config = require('configuration'); // Load configuration file

    $.extend(true, config, module.config()); // Overwrite default values with 
                                             // set values


    var otherfile = require('anyotherfile);
    otherfile();
});

anyotherfile.js

define(function(require, exports, module) {
    var config = require('config'); // Loads configuration, package-wide
                                    // options are set

    // module.config() will be empty. Unless I explicicy specify the
    // configuration for this one module in the "requirejs.config"

    return function() {
        // Something that can be configured
    };
});

这种设置配置选项的方式使我依赖于一个额外的库或我自己的extend功能实现(代码不多,但代码多于无代码)加上我有两点寻找可能的配置错误,这使得更难找到错误。

所以现在我正在寻找一种更好的方法来传递一个包范围的配置,同时试图避免多个故障点。 (如果我不想对它们进行硬编码,这可能很难在某处我存储默认值。)当然,解决方案不应该依赖于任何其他库或我自己的extend功能。

1 个答案:

答案 0 :(得分:0)

在与jrburke讨论问题之后,最好的解决方案是在configuration.js中扩展配置数组。

文件configuration.js

的示例
define(function(require, exports, module) {
    var $ = require('jquery'); // need jQuery for extend
    var config = {
        key: value,
        ...
    };
    return $.extend(true, config, module.config());
});

因此不再需要在main.js

中执行此操作

这种方法的唯一缺点是在requirejs.config中你必须解决 package/configuration而非package

requirejs.config

的示例
requirejs.config({
    config: {
        "package/configuration": {
             key: value
        }
    }
});