這是我參與8月更文挑戰的第4天,活動詳情查看:8月更文挑戰node
在npm(v2)以及以前的版本中,npm處理依賴的方式是經過遞歸,依次安裝模塊的依賴,以此造成一顆龐大的依賴樹。這個機制能夠解決依賴包的衝突問題,可是也會致使如下問題:npm
1.依賴的層級過深,刪除緩慢。markdown
2.不一樣的模塊會依賴相同的包,有冗餘,甚至可能形成bugpost
在項目中可能出現項目依賴A包和B包,同時B包依賴A包的狀況。spa
npm v2首先會判斷A包是否兼容,若是兼容就只會在項目路徑下安裝A包,若不兼容則會在B包中再安裝一個A包code
在 npm v3 版本以後,npm 採用了更合理的方式去解決以前的依賴地獄的問題。npm v3 嘗試把依賴以及依賴的依賴都儘可能的平鋪在項目根目錄下的 node_modules
文件夾下以共享使用;若是遇到由於須要的版本要求不一致致使衝突,沒辦法放在平鋪目錄下的,回退到 npm v2 的處理方式,在該模塊下的 node_modules
裏存放衝突的模塊。orm
例如,當前項目有依賴的模塊 A@1.0.0
, B@1.0.0
, A@1.0.0
依賴於模塊 C@1.0.0
, D@0.6.5
, B@1.0.0
又依賴於模塊 C@2.0.0
, E@1.0.3
。注意,此時因爲模塊 C
的兩個版本 C@1.0.0
和 C@2.0.0
被分別依賴,鑑於模塊在同一個 node_modules
目錄中是按照模塊名目錄存放,所以這兩個版本沒辦法同時平鋪在同一目錄,所以,其中一個版本的 C
模塊將會以 npm v2 的處理方式放入子 node_modules
目錄中。對象
若是A包在window下注冊對象,會出現衝突遞歸
當一個依賴模塊X定義在peerDependencies中而不是devDependencies或dependencies中時,依賴該模塊的項目就不會自動下載該依賴。ci