假設咱們安裝 eslint:html
npm install --save-dev eslint
安裝完後,在 package.json 裏面生成以下模塊版本:npm
{ "devDependencies": { "eslint": "^5.13.0" } }
而後你把 package.json 提交到代碼庫。過了一段時間,有新人加入到項目裏面。他克隆出了代碼,而後本地安裝依賴包 npm install
。在他安裝的時候 eslint 已經發布了新的版本5.16.0。那麼新人本地安裝的 eslint 版本就會變成5.16.0。這個機制意味着同一份 package.json 在不一樣時間安裝出來的依賴包有可能不同。可能形成的後果就是依賴不一致程序不 work(一種環境不一致致使的問題)。json
那麼你說我把 package.json 裏面的版本寫死不就能夠了嗎?雖然這樣,你項目的直接依賴版本固定了,可是你不能保證你安裝的包本身也寫死它的依賴,也就是說 eslint 模塊依賴的包可能會隨着時間升級。爲了解決這個問題出現了 package-lock.json。當你 npm install 的時候,同時會生成一個 package-lock.json,這個文件記錄了你運行 npm install 命令那一個時刻的模塊依賴樹(就是你安裝的全部包的版本等信息)。當你把這個文件提交到代碼庫以後,其餘人在其餘時間克隆出代碼再 npm install 的時候,npm 會看到有 package-lock.json 文件,那麼就會按照其描述的依賴樹安裝包。也就是說經過這一個機制保證同一份 package.json 在不一樣時間安裝出的包依賴樹是一致的。eslint
可是我要更新我依賴的包呢?當你使用 npm update 更新現有包,或者 npm install 安裝新包後,若是改變了 package.json 那麼 npm 同時會更新 package-lock.json。使 package.json 和 package-lock.json 保持某一時刻的一致。code
以上是現有 npm-v6.10.2 的機制,可是這個機制也是通過演化,一開始出來 package-lock.json 的時候,其行爲並不徹底按上面的機制運行,具體歷史能夠看這個貼子:https://www.zhihu.com/questio...htm