問題
假設(shè)我們安裝 eslint:
npm install --save-dev eslint
安裝完后,在 package.json 里面生成如下模塊版本:
{
"devDependencies": {
"eslint": "^5.13.0"
}
}
然后你把 package.json 提交到代碼庫。過了一段時間,有新人加入到項目里面。他克隆出了代碼,然后本地安裝依賴包 npm install。在他安裝的時候 eslint 已經(jīng)發(fā)布了新的版本5.16.0。那么新人本地安裝的 eslint 版本就會變成5.16.0。這個機制意味著同一份 package.json 在不同時間安裝出來的依賴包有可能不一樣。可能造成的后果就是依賴不一致程序不 work(一種環(huán)境不一致導(dǎo)致的問題)。
解決方案
那么你說我把 package.json 里面的版本寫死不就可以了嗎?雖然這樣,你項目的直接依賴版本固定了,但是你不能保證你安裝的包自己也寫死它的依賴,也就是說 eslint 模塊依賴的包可能會隨著時間升級。為了解決這個問題出現(xiàn)了 package-lock.json。當(dāng)你 npm install 的時候,同時會生成一個 package-lock.json,這個文件記錄了你運行 npm install 命令那一個時刻的模塊依賴樹(就是你安裝的所有包的版本等信息)。當(dāng)你把這個文件提交到代碼庫之后,其他人在其他時間克隆出代碼再 npm install 的時候,npm 會看到有 package-lock.json 文件,那么就會按照其描述的依賴樹安裝包。也就是說通過這一個機制保證同一份 package.json 在不同時間安裝出的包依賴樹是一致的。
但是我要更新我依賴的包呢?當(dāng)你使用 npm update 更新現(xiàn)有包,或者 npm install 安裝新包后,如果改變了 package.json 那么 npm 同時會更新 package-lock.json。使 package.json 和 package-lock.json 保持某一時刻的一致。
歷史
以上是現(xiàn)有 npm-v6.10.2 的機制,但是這個機制也是經(jīng)過演化,一開始出來 package-lock.json 的時候,其行為并不完全按上面的機制運行,具體歷史可以看這個貼子:https://www.zhihu.com/question/62331583/answer/275248129