2012-10-02 109 views
1

我目前正在將自己的工作轉移到requirejs,爲此我開始編寫一個小軟件包。該軟件包由一個main.js(應用程序的入口點)和若干其他模塊組成,這些模塊將通過致電require加載到main.js中。requirejs軟件包的預置軟件包配置

該軟件包有幾個選項,可以在運行時配置,以便於維護我有一箇中心的configuration.js,隨時加載。 configuration.js的內容只是一個將鍵映射到值,無功能或任何東西的對象。只是一個鍵值地圖。

現在requirejs允許將選項傳遞給包,配置通過requirejs配置完成。我遇到的問題是,它僅在main.js中可用,而不是包中的其他模塊中,除非我將它們硬編碼到main.js中,否則我找不到設置默認值的方法。

我目前的方法(configuration.js)是將給requirejs的配置與configuration.js的內容合併到main.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

回答

0

在與jrburke討論這個問題之後,最好的解決方案是在configuration.js中進行config數組的擴展。文件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 
     } 
    } 
}); 
實施例