1. 程式人生 > >Node.js 依賴管理(三)—package-lock.json詳解

Node.js 依賴管理(三)—package-lock.json詳解

end 發現 json詳解 ever arr 文章 效果 樹形結構 例如

原文鏈接:https://www.novenblog.xin/detail?id=68

本文拜讀百度@小蘑菇哥哥Node.js 中的依賴管理正文從這裏開始~

papackage.json

nodeJs項目中都會有package.json的存在,這個文件會記錄運行該項目所有依賴,並且以平級的形式展示出來,文件內容與下圖類似:

技術分享圖片

但是在實際中,一個npm包往往會依賴於其他幾個甚至幾十個包,這些被額外依賴的包是不會記錄在項目的package.json中,只會記錄在node_modules安裝包下的package.json文件中,由於node_modules對於所有的依賴都是並行存放,這樣會導致依賴過多不好管理。

papackage-lock.json

package-lock.json 內部記錄的是每一個依賴的實際安裝信息,例如名字,安裝的版本號,安裝的地址 (npm registry 上的 tar 包地址)等等。額外的,它會把依賴的依賴也記錄起來,因此整個文件是一個樹形結構,保存依賴嵌套關系。一個簡單的例子如下:

{
\"name\": \"my-lib\",
\"version\": \"1.0.0\",
\"lockfileVersion\": 1,
\"requires\": true,
\"dependencies\": {
\"array-union\": {
\"version\": \"1.0.2\",
\"resolved\": \"http://registry.npm.taobao.org/array-union/download/array-union-1.0.2.tgz\",
\"integrity\": \"sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=\",
\"dev\": true,
\"requires\": {
\"array-uniq\": \"^1.0.1\"
}
}
}
}

在執行 npm i 的時候,如果發現根目錄下只有 package.json 存在(這通常發生在剛創建項目時),就按照它的記錄逐層遞歸安裝依賴,並生成一個 package-lock.json 文件。如果發現根目錄下兩者皆有(這通常發生在開發同事把項目 checkout 到本地之後),則 npm 會比較兩者。如果兩者所示含義不同,則以 package.json 為準,並更新 package-lock.json;否則就直接按 package-lock 所示的版本號安裝。

它存在的意義主要有 4 點:

  • 1、在團隊開發中,確保每個團隊成員安裝的依賴版本是一致的。否則因為依賴版本不一致導致的效果差異,一般很難查出來。

  • 2、通常 node_modules 目錄都不會提交到代碼庫,因此要回溯到某一天的狀態是不可能的。但現在 node_modules 目錄和 package.json 以及 package-lock.json 是一一對應的。所以如果開發者想回退到之前某一天的目錄狀態,只要把這兩個文件回退到那一天的狀態,再 npm i 就行了。

  • 3、因為 package-lock.json 已經足以描述 node_modules 的大概信息(尤其是深層嵌套依賴),所以通過這個文件就可以查閱某個依賴包是被誰依賴進來的,而不用去翻 node_modules 目錄(事實上現在目錄結構打平而非嵌套,翻也翻不出來了)

  • 4、在安裝過程中,npm 內部會檢查 node_modules 目錄中已有的依賴包,並和 package-lock.json 進行比較。如果重復,則跳過安裝,能大大優化安裝時間。

npm 官網建議:把 package-lock.json 一起提交到代碼庫中,不要 ignore。但是在執行 npm publish 的時候,它會被忽略而不會發布出去。

下面是其他相關文章推薦:

  • Node.js 依賴管理(一)—區分dependencies和devDependencies

  • Node.js 依賴管理(二)—版本號管理1.x.x

Node.js 依賴管理(三)—package-lock.json詳解