7

如果我在文档中错过了这一点,我们深表歉意。基本上我想使用 RequireJS 模块配置功能。我想集中管理给包中模块的配置值。

这是文档中的一个示例:

requirejs.config({
    config: {
        'bar': {
            size: 'large'
        },
        'baz': {
            color: 'blue'
        }
    }
});

//bar.js, which uses simplified CJS wrapping:
define(function (require, exports, module) {
    //Will be the value 'large'
    var size = module.config().size;
});

//baz.js which uses a dependency array,
define(['module'], function (module) {
    //Will be the value 'blue'
    var color = module.config().color;
});

我的问题是我的配置信息会更复杂一些,并且本身会有依赖关系。我想要做:

requirejs.config({
    config: {
        'bar': {
            path: path.dirname(module.uri)
            key: crypto.randomBytes(64)
        },
    }
});

我的配置中的变量需要使用 requireJS 来评估。

对我来说,在 RequireJS 配置(加载模块所需的配置)和用户的模块配置之间进行逻辑分离是有意义的。但我目前正在努力寻找这个:(

4

4 回答 4

6

对于这种解决方案,我会让模块依赖于“配置”模块,您可以使用路径配置将其换成不同的模块。所以如果“bar”需要一些配置,“bar.js”看起来像:

define(['barConfig'], function (config) {
});

然后 barConfig.js 可以有你的其他依赖项:

define(['crypto'], function (crypto) {
    return {
      key: crypto.randomBytes(64)
    }
});

然后,如果您需要不同的配置,例如生产与开发,请使用路径配置将 barConfig 映射到其他值:

requirejs.config({
  paths: {
    barConfig: 'barConfig-prod'
  }
});
于 2013-01-28T21:42:39.567 回答
2

我认为正确的方法是制作一个配置模块......

// config.js
define(['module', 'path', 'crypto'], function(module, path, crypto) {
    return {
        path: path.dirname(module.uri)
        key: crypto.randomBytes(64)
    };
}); 

然后在其他模块中使用它...

// bar.js
define(['config'], function (config) {
    var key = config.key;
});

然后你可以让它变得像你喜欢的那样复杂!

编辑:你可能会污染这个特殊类的全局命名空间......

define(['module', 'path', 'crypto'], function(module, path, crypto) {
    window.config = {
        path: path.dirname(module.uri)
        key: crypto.randomBytes(64)
    };
}); 

将其添加到顶层 require 调用:

require(['config', 'main']);

然后你可以使用它而不总是将它添加到你的定义中:

// bar.js
define([], function() {
    var key = config.key;
});
于 2013-01-26T08:33:12.863 回答
0

考虑到这一点,我想出了一个解决方法。它不是特别漂亮,但似乎确实有效。

我只需要两次 requireJS(...),第一次是创建配置,第二次是使用配置加载应用程序模块。

requireJSConfig = 
    baseUrl: __dirname
    nodeRequire: require

# Create the require function with basic config
requireJS = require('requirejs').config(requireJSConfig)  
requireJS ['module', 'node.extend', 'crypto', 'path'], (module, extend, crypto, path) ->
    # Application configuration 
    appConfig =
        'bar':
            path:   path.dirname(module.uri)
            key:    crypto.randomBytes(64) # for doing cookie encryption

    # get a new requireJS function with CONFIG data
    requireJS = require('requirejs').config(extend(requireJSConfig, config: appConfig))
    requireJS ['bar'], (app) ->
        ###
            Load and start the server
        ###
        appServer = new app()

        #  And start the app on that interface (and port).
        appServer.start()

在 bar.coffee

# bar.coffee
define ['module'], (module) ->
    # config is now available in this module
    console.log(module.config().key)
于 2013-01-26T11:39:08.890 回答
0

回顾@jrburke 所说的内容,我发现以下模式非常有用:main.js在调用require.config().

main.js

define('config', ['crypto'], function (crypto) {
  return {
    'bar': {
      key: crypto.randomBytes(64)
    },
  };
});

requirejs.config({
  deps: ['app'],
});

应用程序.js

require(['config'], function (config){

  // outputs value of: crypto.bar.key
  console.log(config.bar.key);
});

Plnkr 演示:http ://plnkr.co/edit/I35bEgaazEAMD0u4cNuj

于 2015-12-05T17:26:46.143 回答