2013-01-25 117 views
7

如果我在文檔中遺漏了這些,請致歉。基本上我想使用RequireJS模塊配置功能。我想集中管理給包中模塊的配置值。配置依賴於RequireJS配置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配置(加載模塊所需的配置)和用戶的模塊配置之間存在邏輯上的分離是有意義的。但我目前正在努力找到這個:(

回答

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) 
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(['config', 'main']); 

然後你可以使用它,而總是將其添加到您的定義:

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

沒錯這就是我目前有,但它意味着我需要需要'配置'從每個模塊。這也意味着我無法以集中方式爲不同的模塊指定不同的配置。我真的希望能夠使用requireJS配置功能,但也許這是不可能的 – greTech

+0

檢查我的編輯,全局變量是適當的,如果你使用的東西無處不在 – Felix

+0

不要感謝污染全局,即時通訊也使用Node.js :) – greTech

6

對於這種解決方案,我希望模塊依賴於一個「配置」模塊,您可以使用路徑配置交換不同的模塊。所以,如果「欄」需要一些配置,「bar.js」看起來像:

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

然後barConfig.js可以有你的其他依賴關係:

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

然後,如果你需要不同的CONFIGS爲說,生產與開發,利用路徑配置到barConfig映射到其他值:

requirejs.config({ 
    paths: { 
    barConfig: 'barConfig-prod' 
    } 
}); 
0

Riffing什麼@jrburke是說,我發現下面的模式是非常有用的:定義配置模塊,並將其之前剛剛是在main.js依賴調用require.config()

main.js

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

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

app.js

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

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

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