package-lock.json
會在 npm 修改 node_modules
樹狀結構或 package.json
時自動產生。它會描述已產生的確切樹狀結構,讓後續安裝能產生相同的樹狀結構,不論中間相依性更新與否。
此檔案預計會提交到原始程式碼存放庫,並提供各種用途
-
描述相依性樹狀結構的單一表示,讓團隊成員、部署和持續整合保證安裝完全相同的相依性。
-
提供使用者「時光旅行」到 node_modules
的先前狀態,而不用提交目錄本身。
-
透過可讀取的原始程式碼控制差異,促進樹狀結構變更的更大可視性。
-
透過讓 npm 略過先前已安裝套件的重複元資料解析,最佳化安裝程序。
-
從 npm v7 開始,鎖定檔包含足夠資訊,可完整了解套件樹狀結構,減少讀取 package.json
檔案的需求,並大幅提升效能。
這兩個檔案格式相同,且在專案根目錄中執行類似功能。
差異在於 package-lock.json
無法發布,且如果在根目錄專案以外的任何地方找到,它將會被忽略。
相反地,npm-shrinkwrap.json 允許發布,並從遇到的點定義相依性樹狀結構。除非部署 CLI 工具或使用發布程序來製作生產套件,否則不建議這樣做。
如果 package-lock.json
和 npm-shrinkwrap.json
都存在於專案的根目錄中,npm-shrinkwrap.json
將優先,而 package-lock.json
將會被忽略。
為了避免重複處理 node_modules
資料夾,v7 版本的 npm 使用存在於 node_modules/.package-lock.json
中的「隱藏」鎖定檔。這包含有關樹狀結構的資訊,並用於代替讀取整個 node_modules
層級結構,前提是符合下列條件
- 它所參考的所有套件資料夾都存在於
node_modules
層級結構中。
- 在
node_modules
層級結構中不存在未列於鎖定檔中的套件資料夾。
- 檔案的修改時間至少與其所參考的所有套件資料夾一樣新。
也就是說,只有在隱藏鎖定檔作為套件樹狀結構最近一次更新的一部分建立時,它才會相關。如果另一個 CLI 以任何方式變更樹狀結構,這將會被偵測到,而隱藏鎖定檔將會被忽略。
請注意,可以 手動變更套件的內容,使其不受套件資料夾修改時間的影響。例如,如果你將檔案新增到 node_modules/foo/lib/bar.js
,則 node_modules/foo
的修改時間將不會反映此變更。如果你手動編輯 node_modules
中的檔案,通常最好刪除 node_modules/.package-lock.json
中的檔案。
由於隱藏鎖定檔會被舊版 npm 忽略,因此它不包含「一般」鎖定檔中存在的向下相容性功能。也就是說,它是 lockfileVersion: 3
,而不是 lockfileVersion: 2
。
當 npm 在套件安裝程序期間偵測到 npm v6 或更早版本的鎖定檔時,它會自動更新以從 node_modules
樹或(在 node_modules
樹為空或鎖定檔格式非常舊的情況下)npm 登錄取得遺失的資訊。
這是套件鎖定的套件名稱。它會與 package.json
中的內容相符。
這是套件鎖定的套件版本。它會與 package.json
中的內容相符。
一個整數版本,從 1
開始,其版本號為產生此 package-lock.json
時所使用的文件語意。
請注意,檔案格式在 npm v7 中大幅變更,以追蹤原本需要在 node_modules
或 npm 登錄中尋找的資訊。npm v7 產生的鎖定檔將包含 lockfileVersion: 2
。
- 未提供版本:來自 npm v5 之前 npm 版本的「舊式」shrinkwrap 檔案。
1
:npm v5 和 v6 使用的鎖定檔版本。
2
:npm v7 和 v8 使用的鎖定檔版本。向下相容於 v1 鎖定檔。
3
:npm v9 以上版本使用的鎖定檔版本。向下相容於 npm v7。
即使鎖定檔不是 npm 設計支援的版本,npm 仍會嘗試取得任何資料。
這是一個物件,它將套件位置對應到包含該套件資訊的物件。
根目錄專案通常列在 ""
的金鑰下,而所有其他套件則列在它們從根目錄資料夾的相對路徑中。
套件描述具有下列欄位
-
version:在 package.json
中找到的版本
-
resolved:實際解析套件的位置。對於從登錄取得的套件,這將是 tarball 的網址。對於 git 相依關係,這將是完整的 git 網址,包含提交 sha。對於連結相依關係,這將是連結目標的位置。 registry.npmjs.org
是表示「目前設定的登錄」的魔術值。
-
integrity:sha512
或 sha1
標準子資源完整性字串,用於在這個位置解壓縮的人工製品。
-
link:表示這是符號連結的旗標。如果存在此旗標,不會指定其他欄位,因為連結目標也會包含在鎖定檔中。
-
dev、optional、devOptional:如果套件嚴格來說是 devDependencies
樹的一部分,dev
會為 true。如果嚴格來說是 optionalDependencies
樹的一部分,optional
會設定。如果同時是 dev
相依性和非 dev 相依性的 optional
相依性,devOptional
會設定。(dev
相依性的 optional
相依性會同時設定 dev
和 optional
。)
-
inBundle:表示套件是已套件化的相依性的旗標。
-
hasInstallScript:表示套件有 preinstall
、install
或 postinstall
腳本的旗標。
-
hasShrinkwrap:表示套件有 npm-shrinkwrap.json
檔案的旗標。
-
bin、license、engines、dependencies、optionalDependencies:package.json
的欄位
支援使用 lockfileVersion: 1
的 npm 版本的舊資料。這是套件名稱對應相依性物件的對應。由於物件結構嚴格來說是階層式的,在某些情況下,符號連結相依性有點難以表示。
如果存在 packages
區段,npm v7 會完全忽略此區段,但會持續更新它,以支援在 npm v6 和 npm v7 之間切換。
相依性物件有下列欄位
-
version:規格說明,會依套件的性質而有所不同,可用於取得新副本。
- 已套件化的相依性:不論來源為何,這是一個純粹用於提供資訊的版本號碼。
- 註冊來源:這是版本號碼。(例如,
1.2.3
)
- git 來源:這是已解析 committish 的 git 規格。(例如,
git+https://example.com/foo/bar#115311855adb0789a0466714ed48a1499ffea97e
)
- http tarball 來源:這是 tarball 的 URL。(例如,
https://example.com/example-1.3.0.tgz
)
- 本機 tarball 來源:這是 tarball 的檔案 URL。(例如
file:///opt/storage/example-1.3.0.tgz
)
- 本機連結來源:這是連結的檔案 URL。(例如
file:libs/our-module
)
-
完整性:sha512
或 sha1
標準子資源完整性字串,用於在此位置解壓縮的人工製品。對於 git 相依性,這是 commit sha。
-
已解析:對於註冊來源,這是 tarball 相對於註冊 URL 的路徑。如果 tarball URL 不在與註冊 URL 相同的伺服器上,則這是一個完整的 URL。 registry.npmjs.org
是表示「目前設定的註冊」的魔術值。
-
已綑綁:如果為 true,這是已綑綁的相依性,且將由父模組安裝。在安裝時,此模組將在提取階段從父模組中提取,而不是作為獨立的相依性安裝。
-
開發:如果為 true,則此相依性是頂層模組的開發相依性,或是一個相依性的遞移相依性。對於同時是頂層的開發相依性,以及頂層非開發相依性的遞移相依性的相依性,此值為 false。
-
選用:如果為 true,則此相依性是頂層模組的選用相依性,或是一個相依性的遞移相依性。對於同時是頂層的選用相依性,以及頂層非選用相依性的遞移相依性的相依性,此值為 false。
-
需要:這是模組名稱對應版本的對應。這是此模組所需的所有內容的清單,無論將安裝在哪裡。版本應透過正常的比對規則比對,即我們的 dependencies
中的相依性,或比我們高一層的相依性。
-
相依性:此相依性的相依性,與頂層完全相同。