npm2下的模塊安裝機(jī)制
npm2安裝多級的依賴模塊采用嵌套的安裝方式:

優(yōu)點和弊端
優(yōu)點:解決了版本單一時存在的存在的不兼容問題,實現(xiàn)多版本兼容
弊端:可能造成相同模塊大量冗余的問題,如下:

npm3下的模塊安裝機(jī)制:
1.在安裝某個二級模塊時,若發(fā)現(xiàn)第一層級還沒有相同名稱的模塊,便把這第二層級的模塊放在第一層級
2.在安裝某個二級模塊時,若發(fā)現(xiàn)第一層級有相同名稱,相同版本的模塊,便直接復(fù)用那個模塊
3.在安裝某個二級模塊時,若發(fā)現(xiàn)第一層級有相同名稱,但版本不同的模塊,便只能嵌套在自身的父模塊下方
npm3是否已經(jīng)把npm2的模塊冗余的缺陷優(yōu)化到極致了呢? ———答案是沒有,請往下看:
實際上:npm3中仍然可能出現(xiàn)模塊冗余的情況,因為一級目錄下已經(jīng)有v1.0的C模塊了,所以所有的v2.0只能作為二級依賴模塊被安裝,這樣你就會看到如下的情況:

那么這有沒有什么解決的方式呢?當(dāng)然是有的,當(dāng)A模塊下的C v1.0模塊被更新至C v2.0的前提下,我們可以通過npm dedupe把所有C v2.0的二級依賴模塊“重定向”到一級目錄下的那個C v1.0。
雖然 npm v3 解決了目錄長度的嵌套過深,相同的依賴存儲多份這兩個問題,但是此時的 npm 仍然存在諸多問題,被人詬病最多的應(yīng)該就是它的不確定性了。
npm v5
什么是確定性。在 JavaScript 包管理的背景下,確定性是指在給定的 package.json 和 lock 文件下始終能得到一致的 node_modules 目錄結(jié)構(gòu)。簡單點說就是無論在何種環(huán)境下執(zhí)行 npm install 都能得到相同的 node_modules 目錄結(jié)構(gòu)。npm v5 正是為解決這個問題而產(chǎn)生的,npm v5 生成的 node_modules 目錄和 v3 是一致的,區(qū)別是 v5 會默認(rèn)生成一個 package-lock.json 文件,來保證安裝的依賴的確定性。
package-lock.json 文件里記錄了安裝的每一個依賴的確定版本,這樣在下次安裝時就能通過這個文件來安裝一樣的依賴了。