1. 程式人生 > 實用技巧 >package-lock.json的作用

package-lock.json的作用


1、package.json 檔案裡記錄有專案所安裝的依賴項,當node_modules 被刪除時,可以再根據該檔案安裝所需的依賴項; 2、npm 5 以前不會有 package-lock.json 這個檔案,npm5 之後才加入這個檔案; 3、當安裝包的時候,npm 都會生成或者更新package-lock.json 這個檔案; 4、npm 5 之後的版本安裝包的時候不需要加 --save 引數,它會自動儲存依賴的資訊; 5、當安裝包的時候,會自動建立或者更新package-lock.json 檔案; 6、package-lock.json 檔案會儲存 node_modules 中所有包的資訊(版本、下載地址),重新 npm install 的時候速度會提升; 7、檔案的名稱有 lock ,表示該檔案可以用來鎖定版本號,防止自動升級新版。

package-lock.json的作用就是鎖定安裝時的版本號並上傳到git上,保證其他人在npm install時下載的依賴都保持一直。

根據官方文件,這個package-lock.json 是在 npm install時候生成一份檔案,用以記錄當前狀態下實際安裝的各個npm package的具體來源和版本號。

為什麼要有這個檔案呢?
npm是一個管理package之間依賴關係的管理器,它允許開發者在package.json裡標出自己專案對npm各庫包的依賴,如

"dependencies": {
"@types/node": "^8.0.33",
},
^表示向後(新)相容依賴,上面已經指出,所以實際npm i 下載下來版本可能是8.0.35.

大多數情況這種向新相容依賴下載最新庫包的時候都沒有問題,可是因為npm是開源世界,各庫包的版本語義可能並不相同,有的庫包開發者並不遵守嚴格這一原則:相同大版本號的同一個庫包,其介面符合相容要求。這時候使用者就很頭疼了:在完全相同的一個nodejs的程式碼庫,在不同時間或者不同npm下載源之下,下到的各依賴庫包版本可能有所不同,因此其依賴庫包行為特徵也不同有時候甚至完全不相容。

因此npm最新的版本就開始提供自動生成package-lock.json功能,為的是讓開發者知道只要你儲存了原始檔,到一個新的機器上、或者新的下載源,只要按照這個package-lock.json所標示的具體版本下載依賴庫包,就能確保所有庫包與你上次安裝的完全一樣。

總結一下就是,package.json檔案只能鎖定大版本,也就是版本號的第一位,並不能鎖定後面的小版本,你每次npm install都是拉取的該大版本下的最新的版本,為了穩定性考慮我們幾乎是不敢隨意升級依賴包的,這將導致多出來很多工作量,測試/適配等,所以package-lock.json檔案出來了,當你每次安裝一個依賴的時候就鎖定在你安裝的這個版本。

安裝時包有bug怎麼辦?
不能直接去package.json裡改,然後再npm install,(據知乎網友測試,這時候package-lock.json檔案也會更新為修改的版本號,但是npm install安裝到node_modules裡的依賴並不是手改的版本。。所以還是不要手改了。)
只能通過 npm install xxx(更新小版本)或者npm install xxx@xxx(指定版本號)來更新依賴,然後package-lock.json隨之更新。

package.json檔案裡的各種版本符號
version
必須匹配某個版本

^version

//^此符號表示向後相容新版本,會把當前庫的版本更新到第一位數(不是0的第一位)的最新版本;
//如第一個,會更新到4.X.X,也就是>=4.1.4 < 5.0.0;

"webpack-merge": "^4.1.4",  //>=4.1.4 < 5.0.0
"shelljs": "^0.8.2",  //>=0.8.2 <0.9.0

~version
他會更新到當前minor version(中間那位數)中的最新版本。

~1.15.2    >=1.15.2  <1.16.0

>=version
大於或等於某版本