package-lock.json的作用

前言

模塊化開發(fā)在前端越來越流行,使用 node 和 npm 可以很方便的下載管理項(xiàng)目所需的依賴模塊。package.json 用來描述項(xiàng)目及項(xiàng)目所依賴的模塊信息。
。那 package-lock.json 和 package.json 有啥關(guān)系和聯(lián)系呢?

package.json

在控制臺執(zhí)行 npm init 命令就會誕生 package.json 文件,默認(rèn)情況下是這樣的:

{
  "name": "practice",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

package-lock.json

官方是這樣解釋的:
package-lock.json它會在npm更改node_modules目錄樹或者package.json時自動生成的,它準(zhǔn)確的描述了當(dāng)前項(xiàng)目npm包的依賴樹,并且在隨后的安裝中會根據(jù)package-lock.json來安裝,保證是相同的一個依賴樹,不考慮這個過程中是否有某個依賴有小版本的更新。

它的產(chǎn)生就是來對整個依賴樹進(jìn)行版本固定的(鎖死)。

當(dāng)我們在一個項(xiàng)目中npm install時候,會自動生成一個package-lock.json文件,和package.json在同一級目錄下。package-lock.json記錄了項(xiàng)目的一些信息和所依賴的模塊。這樣在每次安裝都會出現(xiàn)相同的結(jié)果. 不管你在什么機(jī)器上面或什么時候安裝。

當(dāng)我們下次再npm install時候,npm發(fā)現(xiàn)如果項(xiàng)目中有package-lock.json文件,會根據(jù)package-lock.json里的內(nèi)容來處理和安裝依賴而不再根據(jù)package.json。注意,使用cnpm install時候,并不會生成package-lock.json文件,也不會根據(jù)package-lock.json來安裝依賴包,還是會使用package.json來安裝。

package-lock.json的作用

比如說我們要安裝個依賴:

"dependencies": {
 "@types/node": "^8.0.33",
}

這里面的 向上標(biāo)號^是定義了向后(新)兼容依賴,指如果 types/node的版本是超過8.0.33,并在大版本號(8)上相同,就允許下載最新版本的 types/node庫包,例如實(shí)際上可能運(yùn)行npm install時候下載的具體版本是8.0.35。

大多數(shù)情況這種向新兼容依賴下載最新庫包的時候都沒有問題,可是因?yàn)閚pm是開源世界,各庫包的版本語義可能并不相同,有的庫包開發(fā)者并不遵守嚴(yán)格這一原則:相同大版本號的同一個庫包,其接口符合兼容要求。這時候用戶就很頭疼了:在完全相同的一個nodejs的代碼庫,在不同時間或者不同npm下載源之下,下到的各依賴庫包版本可能有所不同,因此其依賴庫包行為特征也不同有時候甚至完全不兼容。

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

其實(shí),package.json文件只能鎖定大版本,也就是版本號的第一位,并不能鎖定后面的小版本,每次npm install都是拉取的該大版本下的最新的版本,為了穩(wěn)定性考慮我們幾乎是不敢隨意升級依賴包的,這將導(dǎo)致多出來很多工作量,測試/適配等,所以package-lock.json文件出來了,當(dāng)你每次安裝一個依賴的時候就鎖定在你安裝的這個版本。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容