2012-12-17 37 views
5

我正在開發一個節點模塊my-module,而這又取決於另一個模塊other-module。因此,other-module是我的模塊的package.json中明確列出的依賴項。如何避免節點需要加載相同的模塊兩次

正如我的模塊只是作爲require d修改的other-module的行爲,是非常重要的other-module只加載一次,而這,一個和唯一的「實例」是既需要my整個任何應用程序所引用的一個和other

我預計今年根據節點的模塊緩存策略持有真實的,但我已經遇到在寫一個簡單的測試程序是這樣的:

如果my-modulenpm installother-module然後之前,後者被帶到作爲前者的依賴。 npm install ing other-module之後再次將其帶入node_modules層次結構中。然後,當我的模塊需要other-module時,節點加載我的模塊的「本地」副本,並且當應用程序require第二次節點加載它再次(此時由於第二個npm install而安裝的版本)。這顯然不是預期的結果。

如果my-modulenpm installe d other-module然後我結束了在node_modules的other-module只有一個副本和我的測試應用程序工作正常。

這種行爲讓我翻翻節點的相關政策再次果然我碰到了「模塊緩存注意事項」:

模塊都是基於他們解決文件名緩存。由於模塊可能會根據調用模塊的位置(從node_modules文件夾加載)解析爲不同的文件名,因此它不能保證require('foo')總是返回完全相同的對象,如果它解析爲不同的文件。

在這一點上,它看起來像我的模塊可能會或可能不會按預期的行爲取決於npm install s的順序。

我錯過了哪些最佳做法?有沒有什麼辦法可以避免這種混亂而不改變我的模塊的工作方式?

回答

4

簡短的回答:你不能。

正如您所指出的那樣,節點將從最本地的地方加載所需的模塊。就我所知,這是包管理器獨有的,它使您不必關心模塊的確切依賴關係樹。 Node和npm會爲你解決這個問題。在我看來,這是非常好的。

簡單地避免依賴地獄,讓模塊有機會要求他們需要的確切版本。

我認爲你正在嘗試做什麼,除非我完全不瞭解你的問題,不是很好的節點練習。模塊被加載並分配給一個局部變量。應該避免全局狀態,因爲這可能導致相當尷尬和不可測的代碼。此外,如果您成功地將注入將您的修改後的模塊插入到其他人的代碼中,則不能保證其代碼仍能正常工作。這將會像在舊的Prototype.js _天可以利用JavaScript內置的全局變量像字符串數組,這導致一些災難性的代碼。

但請記住,這篇文章只是一個人的意見。如果您在這裏找不到更多答案,請在其他地方發佈您的問題,如節點的IRC頻道。

0

我用開玩笑開發測試時遇到了類似的問題。

下面的語句將允許你在不同的上下文中再加載相同的模塊:

jest.resetModules(); 
相關問題