前言
模塊化開發(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)你每次安裝一個依賴的時候就鎖定在你安裝的這個版本。