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

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

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

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