爲何要使用 package-lock.json

做者:Kostas Bariotis

翻譯:瘋狂的技術宅前端

原文:https://blog.logrocket.com/wh...git

未經容許嚴禁轉載程序員

在本文中,咱們將介紹 package-lock.json 爲何重要,以及如何與 NPM CLI 一塊兒使用。github

歷史

NPM v5 引入了 package-lock.json, 將其做爲捕獲在任意時刻安裝的確切依賴樹的機制。面試

這會有助於在不一樣環境中進行協做,在這種環境中,你但願每一個人都爲項目的特定版本獲取依賴項以獲得同一棵依賴樹。express

package.json 使用語義版本定義所需的依賴項及其各自的版本。可是語義版本控制可能很棘手。npm

考慮一個表示爲 "express": "^4.16.4" 的依賴項。json

該模塊的發佈者(不使用 package-lock.json )將安裝版本爲 4.16.4 的 Express ,由於他們安裝了最新版本。segmentfault

若是 express 在我下載該模塊並嘗試安裝依賴項時發佈了新版本,則能夠下載最新版本。bash

這些信息 caret 符號能夠準確地告訴咱們

上面的問題是,若是 4.17.x 版本存在一個錯誤,則個人本地設置將會失敗,可是發佈商的版本將繼續在舊版本上正常運行。

在生產環境中可能會發生一樣的事情,而且你不知道爲何它會失敗。

在 NPM v5 以前,你須要使用 shrinkwrap。它與 package-lock.json 不一樣,由於它能夠與模塊一塊兒發佈到 NPM 註冊表中,而 package-lock.json 則不容許。

若是全部成員均可以使用 NPM+5,則最好對未發佈的項目使用 package-lock.json

可是,若是你正在開發模塊並打算髮布它,則須要考慮是否要讓客戶端安裝你指定的確切依賴關係樹,或者是否但願靈活一些。 這裏是該主題的更詳細的版本

所以, package-lock.json 將描述當前安裝的確切依賴樹。該格式在NPM文檔中進行了描述。

經過將其提交到你的 VCS(絕對應該這樣作),能夠返回歷史記錄並複製確切的依賴關係樹。

確保始終向你的 VCS 提交 package-lock.json,以在任何給定時間跟蹤確切的依賴樹。

它將確保下載你項目並嘗試安裝依賴項的全部客戶端都可以得到徹底相同的依賴樹。此外這也確保你可以檢出先前的提交併複製每一個提交的依賴狀態。

package.jsonpackage-lock.json

要確保你不去直接更改 package-lock.json。這將由 NPM 自動處理。它將對 package.json 的更改反映到package-lock.json,並保持最新。

可是隻有在使用 NPM 的 CLI 進行更改時,纔會發生這種狀況。若是你手動更改 package.json,則不要指望 package-lock.json 會更新。要始終使用 CLI 命令,例如 installuninstall 等。

如何使用NPM CLI

當你首次在新項目中使用 NPM 時,它會自動生成 package-lock.json

而後,你就能夠正常使用 NPM 了。

npm install(使用特定模塊做爲參數)

能夠將 install 與要安裝的模塊名一塊兒使用,這將更改 package.jsonpackage-lock.json,由於依賴關係樹將會發生變化。

考慮下面的例子:

npm install express body-parser cors

npm install(不帶參數)

install 將嘗試安裝與 package-lock.json 相關的全部依賴項。

這裏的關鍵是,若是 install 註冊已通過期,則能夠更改 package-lock.json

若是有人手動更改 package.json(例如,他們刪除了一個軟件包,由於這只是刪掉一行),那麼下次有人運行 npm install 時,它將更改 package-lock.json 以反映對先前軟件包的刪除。

這可能很棘手。想象一下,拉取項目的最新版本,當運行 npm install 獲取最新信息時,卻發現樹中進行了許多毫無心義的更改。

你樹中的更改極可能對審覈你的代碼更改的人沒有意義。

npm uninstall

install 相似,但須要用要被刪除的模塊名稱做爲參數。這將同時更改 package.jsonpackage-lock.json

npm update

update 將會讀取 package.json,用來查找能夠更新的全部依賴項。隨後它將構造一個新的依賴關係樹並更新 package-lock.json

還記得語義版本控制嗎?假設咱們在 package.json 中有一個依賴項,狀態爲 ^1.4.5

字符 ^ 告訴 NPM 檢查在 1.X.X 範圍內是否有較新版本,若是有,則進行安裝。相似地,字符只會出如今熱修復程序或 1.4.X 上。

你也能夠省略特殊字符並保留固定版本,這會減小 package-lock.json 的幫助(但並不是沒有用)。

npm ci

ci 將安裝與 package-lock.json 有關的全部依賴項,相似於 install。這裏的主要區別在於,在任何狀況下都不會更改 package-lock.json

其目的是要在某些環境中使用,例如構建服務器時以自動方式進行安裝等。

結論

使用 package-lock.json 時,請記住如下關鍵要點:

不要在沒有參數的狀況下使用 npm install 來獲取依賴關係,因此請使用 npm ci。你能夠用 npm install 安裝特定的依賴項。

僅在須要本地依賴關係樹時,甚至在本地開發環境中,均可以在全部地方使用 npm ci

爲你依賴關係的更新作一個重複的任務,例如每個月一次。 (或者,你能夠用 dependabot 之類的服務,但請確保測試覆蓋率良好)。

這樣,你能夠確保你的依存關係是最新的,並避免技術債。

更多參考


本文首發微信公衆號:前端先鋒

歡迎掃描二維碼關注公衆號,天天都給你推送新鮮的前端技術文章

歡迎掃描二維碼關注公衆號,天天都給你推送新鮮的前端技術文章

歡迎繼續閱讀本專欄其它高贊文章:


相關文章
相關標籤/搜索