2013-10-01 65 views
0

在我的節點的應用程序,有一個配置文件是這樣的:不修改加載的節點模塊

module.exports = { 
    BUILD_DIR: '/some.path', 
    OTHER_CONFIG: 42, 
    // ... 
}; 

我也有一些測試,做這樣的事情

var appConfig = require('./path/to/appConfig'); 
appConfig.BUILD_DIR = 'tmp/some/path'; 
// and stuff done with appConfig 

要我很大的驚喜顯然這樣做修改模塊的狀態。我的下一個測試,要求它必須BUILD_DIR設置爲「TMP /一些/路徑」。我沒有意識到模塊有這種狀態需要。我如何在測試中擺脫這種影響?另外,如何防止人們修改此模塊的狀態?如果有人包含它,他們應該總是得到它所定義的內容,而不可能是其他代碼寫給它的東西。

回答

1

爲什麼is explained here原因:

模塊是他們第一次加載後緩存。這意味着 (除其他事項外),爲require('foo')每次調用會得到 完全相同的對象返回,如果它會解析爲同 文件。

(重點煤礦)

所以,你要導出緩存和使用它的代碼共享的對象。

如果這不是你想要的,你可以導出函數:

module.exports = function() { 
    return { 
    BUILD_DIR: '/some.path', 
    OTHER_CONFIG: 42, 
    // ... 
    }; 
}; 

而且require它像這樣:

var appConfig = require('./path/to/appConfig')(); 
+0

這並不實際工作,我還是結了我的修改顯示在我的其他測試了。如果我「返回擴展({},{..config ..})」的功能,那麼它的工作。 –

+1

我測試過它,它爲我的作品([要點](https://gist.github.com/robertklep/c58a3da939d6c18d07aa))。它應該,因爲該函數返回的對象是每一個函數被調用時新建的,即使函數本身緩存。 – robertklep

+0

啊,的確如此。我把配置放入一個var,然後通過函數返回。一步到位做到了這一點。 –

1

假設你的模塊被稱爲「配置」,和你原來:

var Config=require('Config'); 

你可以:

delete require.cache[require.resolve('Config')]; 

這將從require的緩存中移除該模塊,導致在您下一個'需要'時重新加載它。

要點:https://gist.github.com/raisch/6786930

+0

有趣通過了「關聯數組」。然而,這確實將所有呼叫者的責任放在需要時刪除。容易出現位錯誤,並且引起的錯誤可能不是非常局部的。 –

+0

實際上,這樣做的唯一影響是能夠重新加載模塊。刪除緩存後,原始加載仍然可用,因此如果您以非兼容方式更改了對系統操作特別重要的某些內容,則唯一可能的副作用是。 –