package.json與package-lock.json的區(qū)別及詳細(xì)解釋
package.json
記錄當(dāng)前項(xiàng)目所依賴(lài)模塊的版本信息,更新模塊時(shí)鎖定模塊的大版本號(hào)(版本號(hào)的第一位),不能鎖定后面的小版本,
package-lock.json
package-lock.json 是在 `npm install`時(shí)候生成一份文件。記錄了node_modules目錄下所有模塊(包)的名稱(chēng)、版本號(hào)、下載地址、及這個(gè)模塊又依賴(lài)了哪些依賴(lài)。
兩者區(qū)別:
npm5以前
npm5以前,沒(méi)有package-lock.json這個(gè)文件。package.json文件會(huì)記錄你項(xiàng)目中所需要的所有模塊。當(dāng)你執(zhí)行npm install的時(shí)候,node會(huì)先從package.json文件中讀取所有dependencies信息,然后根據(jù)dependencies中的信息與node_modules中的模塊進(jìn)行對(duì)比,沒(méi)有的直接下載,已有的檢查更新。
因?yàn)閜ackage.json只能鎖定模塊的大版本號(hào)(版本號(hào)的第一位),不能鎖定后面的小版本,所以你每次重新npm install時(shí)候拉取的都是該大版本下面最新的版本。一般我們?yōu)榱朔€(wěn)定性考慮我們不能隨意升級(jí)依賴(lài)包,因?yàn)槿绻麚Q包導(dǎo)致兼容性bug出現(xiàn)很難排查,這樣很容易出現(xiàn)問(wèn)題,所以package-lock.json就是來(lái)解決包鎖定不升級(jí)問(wèn)題的
另外,package.json文件只記錄你通過(guò)npm install方式安裝的模塊信息,而這些模塊所依賴(lài)的其他子模塊的信息不會(huì)記錄。
npm5以后
package-lock.json文件鎖定所有模塊的版本號(hào),包括主模塊和所有依賴(lài)子模塊。當(dāng)你執(zhí)行npm install的時(shí)候,node從package.json文件讀取模塊名稱(chēng),從package-lock.json文件中獲取版本號(hào),然后進(jìn)行下載或者更新。
因此,正因?yàn)橛辛藀ackage-lock.json文件鎖定版本號(hào),所以當(dāng)你執(zhí)行npm install的時(shí)候,node不會(huì)自動(dòng)更新package.json文件中的模塊,必須用npm install packagename@x.x.x(指定版本號(hào))來(lái)進(jìn)行安裝才會(huì)更新,package-lock.json文件中的版本號(hào)也會(huì)隨著更新。
package-lock.json的作用
如果重新 npm install 的時(shí)候以及當(dāng)node_modules文件夾并不存在或被刪除時(shí),需要用到npm install重新裝載全部依賴(lài)時(shí),通過(guò)package-lock.json可以直接表明下載地址和相關(guān)依賴(lài),就無(wú)需再?gòu)膒ackage.json逐個(gè)分析包的依賴(lài)項(xiàng),因此會(huì)大大加快安裝速度,package-lock.json目的就是確保所有庫(kù)包與你上次安裝的完全一樣。
如果要升級(jí)package-lock.json里面的庫(kù)包
npm install XXX@x.x.x
補(bǔ)充:關(guān)于package-lock.json的詳細(xì)解釋
關(guān)于package-lock.json的解釋
npm官方文檔: http://caibaojian.com/npm/files/package.json.html
Node.js v8.0 后,自帶的 npm 也升級(jí)到了5.0的確帶來(lái)了不少便利,大概講一下 npm 5 的一些大的變化:
- 使用npm install xxx命令安裝模塊時(shí),不再需要–save選項(xiàng),會(huì)自動(dòng)將模塊依賴(lài)信息保存到 package.json 文件;
- 安裝模塊操作(改變 node_modules 文件夾內(nèi)容)會(huì)生成或更新 package-lock.json 文件;
- 發(fā)布的模塊不會(huì)包含 package-lock.json 文件;
- 如果手動(dòng)修改了 package.json 文件中已有模塊的版本,直接執(zhí)行npm install不會(huì)安裝新指定的版本,只能通過(guò)npm install xxx@yy更新
重新安裝模塊之所以快,是因?yàn)?package-lock.json 文件中已經(jīng)記錄了整個(gè) node_modules 文件夾的樹(shù)狀結(jié)構(gòu),甚至連模塊的下載地址都記錄了,再重新安裝的時(shí)候只需要直接下載文件即可(這樣看起來(lái) facebook 的 yarn 好像沒(méi)有啥優(yōu)勢(shì)了);
package-lock.json文件的產(chǎn)生:
- package.json文件下載到的依賴(lài)包可能在不同的情況下,各庫(kù)包的版本語(yǔ)義可能并不相同,有的庫(kù)包開(kāi)發(fā)者并不嚴(yán)格遵守這一原則:相同大版本號(hào)的同一個(gè)庫(kù)包,其接口符合兼容要求。
- 產(chǎn)生問(wèn)題:在不同時(shí)間或者不同npm下載源之下,下載的各依賴(lài)包版本可能有所不同,因此其依賴(lài)庫(kù)包行為特征也不同,有時(shí)候甚至完全不兼容。
- npm5開(kāi)始提供自動(dòng)生成package-lock.json文件的功能,為的是讓開(kāi)發(fā)者知道只要你保存了源文件,到一個(gè)新的機(jī)器上、或者新的下載源,只要按照這個(gè)package-lock.json文件所標(biāo)識(shí)的具體版本下載依賴(lài)庫(kù)包,就能確保所有庫(kù)包與上次的安裝完全一樣;
- npm的下載源改為私服地址,這樣產(chǎn)生的package-lock.json文件的版本號(hào)是這個(gè)私服上設(shè)置好的版本號(hào)
以下是 package-lock.json 文件的例子:
package-lock.json是當(dāng) node_modules 或 package.json發(fā)生變化時(shí)自動(dòng)生成的文件。這個(gè)文件主要功能是確定當(dāng)前安裝的包的依賴(lài),以便后續(xù)重新安裝的時(shí)候生成相同的依賴(lài),而忽略項(xiàng)目開(kāi)發(fā)過(guò)程中有些依賴(lài)已經(jīng)發(fā)生的更新
{
"name": "test_pkg_lock",
"version": "1.0.0",
"lockfileVersion": 1,
"dependencies": {
"commander": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
"integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q="
},
"cssfilter": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.8.tgz",
"integrity": "sha1-ZWTKzLqKdt2bS5IGaLn7f9pQ5Uw="
},
"graceful-readlink": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
"integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
},
"xss": {
"version": "0.2.18",
"resolved": "https://registry.npmjs.org/xss/-/xss-0.2.18.tgz",
"integrity": "sha1-bfX7XKKL3FHnhiT/Y/GeE+vXO6s="
}
}}
帶來(lái)速度的同時(shí),npm 也挖了個(gè)大大的坑:
以后直接改 package.json 文件相應(yīng)模塊的版本號(hào),再執(zhí)行npm install不會(huì)更新了(好可怕),你只能手動(dòng)用npm install xxx@yy指定版本號(hào)來(lái)安裝,然后它會(huì)自動(dòng)更新 package-lock.json 文件。直接執(zhí)行npm install時(shí),如果不存在 package-lock.json 文件,它會(huì)根據(jù)安裝模塊后的 node_modules 目錄結(jié)構(gòu)來(lái)創(chuàng)建;如果已經(jīng)存在 package-lock.json 文件,則它只會(huì)根據(jù) package-lock.json 文件指定的結(jié)構(gòu)來(lái)下載模塊,并不會(huì)理會(huì) package.json 文件
網(wǎng)上已經(jīng)有很多人反應(yīng)這個(gè)問(wèn)題了:GitHub 上的 issue:package-lock.json file not updated after package.json file is changed
clean project with some deps in package.json.you run npm imodules are
installed and package-lock.json file is created.say you update module
A in package.json file.you run npm i. I would expect this updates the
package-lock.json file but it doesn’t. which results in module A not
being updated.
總結(jié)
到此這篇關(guān)于package.json與package-lock.json的區(qū)別及詳細(xì)解釋的文章就介紹到這了,更多相關(guān)package.json與package-lock.json內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- package.json與package-lock.json創(chuàng)建及使用詳解
- npm script和package-lock.json使用示例詳解
- 前端必會(huì)的package.json創(chuàng)建及常見(jiàn)屬性用法示例詳解
- package.json中browser?module?main字段優(yōu)先級(jí)對(duì)比
- 詳解npm與package.json之間的聯(lián)系
- package.json的版本號(hào)更新優(yōu)化方法
- npm?start運(yùn)行項(xiàng)目過(guò)程package.json字段詳解
- package-lock.json解決依賴(lài)的版本管理使用詳解
相關(guān)文章
JavaScript中Object.values()的用法舉例
這篇文章主要給大家介紹了關(guān)于JavaScript中Object.values()的用法舉例,Object.values()是JavaScript中一個(gè)內(nèi)置的靜態(tài)函數(shù),用于返回一個(gè)對(duì)象中所有屬性值的數(shù)組,需要的朋友可以參考下2023-09-09
關(guān)于uniapp的request封裝保姆級(jí)教程
這篇文章主要給大家介紹了關(guān)于uniapp的request封裝保姆級(jí)教程,request是基于uni-app框架封裝的一個(gè)網(wǎng)絡(luò)請(qǐng)求庫(kù),可以用于發(fā)送http請(qǐng)求和處理響應(yīng)數(shù)據(jù),需要的朋友可以參考下2023-07-07
javascript 實(shí)現(xiàn)劃詞標(biāo)記劃詞搜索功能
在頁(yè)面中加上這串代碼就行了,同時(shí)還有搜索功能。2009-10-10
JavaScript實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊后層展開(kāi)效果的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊后層展開(kāi)效果的方法,可實(shí)現(xiàn)點(diǎn)擊文字緩慢展開(kāi)層的效果,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-05-05
使用 Jest 和 Supertest 進(jìn)行接口端點(diǎn)測(cè)試實(shí)例詳解
這篇文章主要介紹了使用 Jest 和 Supertest 進(jìn)行接口端點(diǎn)測(cè)試,結(jié)合實(shí)例形式詳細(xì)分析了使用 Jest 和 Supertest 進(jìn)行接口端點(diǎn)測(cè)試具體原理、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-04-04
JavaScript實(shí)現(xiàn)讀取與輸出XML文件數(shù)據(jù)的方法示例
這篇文章主要介紹了JavaScript實(shí)現(xiàn)讀取與輸出XML文件數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了JavaScript基于ActiveXObject實(shí)現(xiàn)載入、讀取與輸出xml文件數(shù)據(jù)的相關(guān)操作技巧,需要的朋友可以參考下2018-06-06
js 獲取坐標(biāo) 通過(guò)JS得到當(dāng)前焦點(diǎn)(鼠標(biāo))的坐標(biāo)屬性
通過(guò)JS得到當(dāng)前焦點(diǎn)的坐標(biāo),如何實(shí)現(xiàn),接下來(lái)詳細(xì)介紹實(shí)現(xiàn)步驟,有需要的朋友可以參考下2013-01-01

