1

我目前正在研究 requirejs,为此我开始编写一个小包。该包由一个main.js、应用程序的入口点和几个其他模块组成,这些模块将main.js通过调用require.

该包有几个可以在运行时配置的选项,为了便于维护,我有一个configuration.js可以在需要时加载的中心。的内容configuration.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功能。

4

1 回答 1

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
        }
    }
});
于 2012-10-03T09:58:35.837 回答