npm2和npm3安裝機(jī)制的差異
npm install后馁害,npm會(huì)依賴dependencies和devDependencies中指定的包來(lái)確定第一層依賴,執(zhí)行完畢后蹂匹,我們會(huì)看到 ./node_modules 這層目錄中包含有我們 package.json 文件中所有的依賴包碘菜。
- npm 2 會(huì)根據(jù)第一層依賴的子依賴,遞歸安裝各個(gè)包到子依賴的 node_modules 中,直到子依賴不再依賴其他模塊炉媒。
層級(jí)結(jié)構(gòu)明顯;在知道自己所需包的名字和版本號(hào)時(shí)昆烁,可以復(fù)制粘貼相應(yīng)的文件到 node_modules 中吊骤,然后手動(dòng)更改 package.json 中的配置;刪除某個(gè)包時(shí)静尼,可直接刪除 package.json 中對(duì)應(yīng)的某一行白粉,然后刪除 node_modules 中的文件。
當(dāng)ABC三個(gè)包都依賴D時(shí)鼠渺,執(zhí)行npm install鸭巴,D會(huì)被下載三次,造成大量冗余
- npm3 為了解決這種問(wèn)題拦盹,目錄改成了扁平狀的層級(jí)結(jié)構(gòu)鹃祖,盡量把依賴以及依賴的依賴平鋪在 node_modules 文件夾下共享使用
會(huì)遍歷所有節(jié)點(diǎn),將模塊都放在node_modules第一層普舆,當(dāng)重復(fù)時(shí)恬口,丟棄,如果遇到依賴版本不兼容時(shí)沼侣,采用npm2處理方式祖能,前面的放在 node_modules 目錄中,后面的放在依賴樹中蛾洛。
但在執(zhí)行 npm install 的時(shí)候养铸,按照 package.json 里依賴的順序依次解析,如果A轧膘,B钞螟,依賴 D(v 0.0.1),C 依賴 D(v 0.0.2)扶供,但c在在 A筛圆,B 的前邊.
package.json
npm 無(wú)法固定依賴的版本
在 npm 5.0 版本后,npm install 后都會(huì)自動(dòng)生成一個(gè) package-lock.json 文件 椿浓。如果package.json 和 package-lock.json 中的版本兼容太援,會(huì)根據(jù) package-lock.json 中的版本下載,如果不兼容扳碍,將會(huì)根據(jù) package.json 的版本提岔,更新 package-lock.json 中的版本。使 package-lock.json 中的版本兼容 package.json笋敞。
package-lock.json 文件的結(jié)構(gòu)
version:版本碱蒙,即包安裝在 node_modules 中的版本。
resolved:安裝來(lái)源。
integrity:對(duì)應(yīng)子依賴的依賴赛惩,與子依賴的 package.json 中 dependencies 的依賴項(xiàng)相同
dependencies:結(jié)構(gòu)和外層的 dependencies 結(jié)構(gòu)相同
并不是所有的子依賴都有 dependencies 屬性哀墓,只有子依賴的依賴和當(dāng)前已安裝在根目錄的 node_modules 中的依賴沖突之后,才會(huì)有這個(gè)屬性喷兼。
package-lock.json 可以提交到代碼庫(kù),當(dāng)想回溯到某一天的目錄狀態(tài)時(shí)篮绰,只需將package.json和package-lock.json這兩個(gè)文件回退到某一天就好
npm 會(huì)比較 node_modules 已有的包,和 package-lock.json 進(jìn)行比較季惯,如果重復(fù)的話吠各,就跳過(guò)安裝 ,從而優(yōu)化了安裝的過(guò)程勉抓。
依賴的區(qū)別與使用場(chǎng)景
dependencies
無(wú)論在開發(fā)環(huán)境還是生產(chǎn)環(huán)境都需使用的依賴贾漏,通過(guò) npm install XXX 下載的包都會(huì)默認(rèn)安裝在 dependencies 對(duì)象中,或者通過(guò)npm install XXX --save 下載
devDependencies
在開發(fā)環(huán)境使用的依賴藕筋,例如 eslint纵散,debug 等,通過(guò) npm install packageName --save-dev 下載
區(qū)別
在打包運(yùn)行時(shí)念逞,執(zhí)行npm install 時(shí)默認(rèn)會(huì)把所有依賴全部安裝困食,但使用 npm install --production 時(shí)就只會(huì)安裝 dependencies 中的依賴。
node項(xiàng)目可以采用這種服務(wù)運(yùn)行時(shí)安裝和打包翎承,減少包大小
optionalDependencies
可以選擇的依賴硕盹,當(dāng)某些依賴下載失敗或者沒有找到時(shí),項(xiàng)目依然可以正常運(yùn)行或者 npm 繼續(xù)運(yùn)行的時(shí)叨咖,可以把依賴放在optionalDependencies中瘩例,但optionalDependencies 會(huì)覆蓋 dependencies 中的同名依賴包
類似保護(hù)機(jī)制,如果包存在的話就走存在的邏輯甸各,不存在的就走不存在的邏輯垛贤。
peerDependencies
指定當(dāng)前的插件兼容的宿主必須要安裝的包的版本,例如:我們創(chuàng)建了項(xiàng)目趣倾,在此項(xiàng)目中我們要使用 ant-design@3.x 這個(gè)插件聘惦,此時(shí)我們的項(xiàng)目就必須先安裝 React >= 16.9.0 和 React-dom >= 16.9.0 的版本
回滾
git log
git revert 81720a380331ea14bfcb7d3eec7aff4ccd716376
或
git reset --hard 81720a380331ea14bfcb7d3eec7aff4ccd716376
git push -f