爲什麼要使用 package-lock.json

作者:Kostas Bariotis

翻譯:瘋狂的技術宅

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

未經允許嚴禁轉載

在本文中,我們將介紹 package-lock.json 爲什麼重要,以及如何與 NPM CLI 一起使用。

歷史

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

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

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

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

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

如果 express 在我下載該模塊並嘗試安裝依賴項時發佈了新版本,則可以下載最新版本。

這些信息 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 之類的服務,但請確保測試覆蓋率良好)。

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

更多參考


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

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

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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章