作者: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.json
與package-lock.json
要確保你不去直接更改 package-lock.json
。這將由 NPM 自動處理。它將對 package.json
的更改反映到package-lock.json
,並保持最新。
但是只有在使用 NPM 的 CLI 進行更改時,纔會發生這種情況。如果你手動更改 package.json
,則不要期望 package-lock.json
會更新。要始終使用 CLI 命令,例如 install
,uninstall
等。
如何使用NPM CLI
當你首次在新項目中使用 NPM 時,它會自動生成 package-lock.json
。
然後,你就可以正常使用 NPM 了。
npm install(使用特定模塊作爲參數)
可以將 install
與要安裝的模塊名一起使用,這將更改 package.json
和 package-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.json
和 package-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 之類的服務,但請確保測試覆蓋率良好)。
這樣,你可以確保你的依存關係是最新的,並避免技術債。
更多參考
-
npm install
和npm ci
之間的區別:https://stackoverflow.com/que... - NPM CLI 源代碼:https://github.com/npm/cli/bl...
- 語義版本控制:https://blog.npmjs.org/post/1...
本文首發微信公衆號:前端先鋒
歡迎掃描二維碼關注公衆號,每天都給你推送新鮮的前端技術文章
歡迎繼續閱讀本專欄其它高贊文章:
- 深入理解Shadow DOM v1
- 一步步教你用 WebVR 實現虛擬現實遊戲
- 13個幫你提高開發效率的現代CSS框架
- 快速上手BootstrapVue
- JavaScript引擎是如何工作的?從調用棧到Promise你需要知道的一切
- WebSocket實戰:在 Node 和 React 之間進行實時通信
- 關於 Git 的 20 個面試題
- 深入解析 Node.js 的 console.log
- Node.js 究竟是什麼?
- 30分鐘用Node.js構建一個API服務器
- Javascript的對象拷貝
- 程序員30歲前月薪達不到30K,該何去何從
- 14個最好的 JavaScript 數據可視化庫
- 8 個給前端的頂級 VS Code 擴展插件
- Node.js 多線程完全指南
- 把HTML轉成PDF的4個方案及實現