2016-01-07 110 views
0

首先,我在Node.js中沒有那麼有經驗。我對Node.js模塊的理解是,這些模塊與Python的模塊非常相似。我的意思是隻執行一次代碼並保持內部狀態。直到我讀過this article可以依賴node.js模塊狀態嗎?

但你可能不知道,如果你的項目是 基於NPM模塊都需要在「共享」模塊作爲 依賴,就像(我肯定沒有!)這樣的:

node_modules/one/index.js: 
var shared = require('shared');  

node_modules/two/index.js: 
var shared = require('shared'); 

...而 安裝它們的依賴與NPM,將有 「共享/ index.js」 兩個副本晾一下:

node_modules/one/node_modules/shared/index.js 
node_modules/two/node_modules/shared/index.js 

讀完之後,我不確定是否可以依賴模塊的內部狀態,因爲在不同路徑上存在一個模塊的可能性,因此在緩存中有相同模塊的兩個或多個實例。這意味着至少「通過本地模塊機制不再有單身人士」。同時,我還沒有聽說過Python中的這個問題。

這是否意味着幾乎所有模塊都只返回函數/構造函數(如express.js應用程序創建流程)並避免內部狀態?

回答

1

只有當這些模塊從不同路徑加載時,節點模塊上的內部狀態纔會有所不同,因此它的類型取決於您使用的是哪個版本的NPM以及如何管理依賴關係。

這實際上更像是一個NPM問題,因爲您可能會使用它來管理您的依賴關係。

NPM 2具有安裝依賴性的多個嵌套的方式,這意味着你會喜歡有一個單一的模塊的比你多很多的副本,如果你安裝使用NPM 3.

例。比方說,你安裝模塊A和模塊B這都取決於模塊C的1.4版本,NPM 2你:

+- Module A 
| | 
| + Module C v 1.4 
| 
+- Module B 
    | 
    + Module C v 1.4 

這意味着模塊A和B將具有加載模塊的C完全不同的版本。

如果運行npm dedupe,應該理想化此樹是:

+- Module A 
| 
+- Module C v 1.4 
| 
+- Module B 

這平坦的樹也被什麼NPM 3次創造。

在試圖依賴共享模塊的固有單實例存在的系統上工作後,我建議不要那樣做。 NPM 2 dedupe有其公平的份額,NPM 3仍然存在一些性能問題。

+0

那麼,如果同一個模塊同時出現兩個不同狀態是一個問題,那麼重點就是避免模塊的狀態?因此,在需求期間,應該通過依賴注入來在模塊之間顯式地傳遞實例。 –

+0

@Ostrovski我儘量避免依賴注入,因爲它有點魔法,可能會讓人困惑。如果我需要共享狀態,我嘗試使用共享的狀態對象或某種消息傳遞(事件總線或類似memcached或redis的東西) - 這樣您可以更好地控制情況。 – tkone