溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Node.js中package.json中庫的版本號(hào)(~和^)

發(fā)布時(shí)間:2020-09-25 16:24:08 來源:腳本之家 閱讀:153 作者:funnycoderstar 欄目:web開發(fā)

~和^的區(qū)別

最近總是碰到一些問題, 在本地好好的, 在線上就出現(xiàn)了問題, 本地也一直復(fù)現(xiàn)不了, 后來把node_modules目錄刪除了之后, 重新安裝, 就在本地復(fù)現(xiàn)了這個(gè)問題,可以看了git history, 并沒有人修改package.json中的版本號(hào),于是認(rèn)真的了解了一下package.json中庫的版本號(hào);

~和^的區(qū)別

"babel-loader": "^7.1.1",
"body-parser": "~1.15.2"

npm install --save xxx, 會(huì)優(yōu)先考慮使用 ^而不是~

以版本號(hào)x.y.z為例

x:主版本號(hào), 當(dāng)你做了不兼容的API修改

y:次版本號(hào), 當(dāng)你做了向下兼容的功能性問題

z:修訂號(hào), 當(dāng)你做了向下兼容的問題修復(fù)

~x.y.z, 會(huì)更新到y(tǒng)最新的版本, 例如 body-parser: ~1.15.2, 這個(gè)庫會(huì)去匹配到1.15.z的最新版本, 如果出現(xiàn)了1.16.0, 則不會(huì)自動(dòng)升級(jí)
^x.y.z, 會(huì)更新到x的最新版本, 例如 babel-loader: ^7.1.1, 這個(gè)庫會(huì)去匹配7.y.z的最新版本, 如果出現(xiàn)了8.1.1, 則不會(huì)自動(dòng)升級(jí)

'~'(波浪符號(hào)):他會(huì)更新到當(dāng)前minor version(也就是中間的那位數(shù)字)中最新的版本。放到我們的例子中就是:"exif-js": "~2.3.0",這個(gè)庫會(huì)去匹配更新到2.3.x的最新版本,如果出了一個(gè)新的版本為2.4.0,則不會(huì)自動(dòng)升級(jí)。波浪符號(hào)是曾經(jīng)npm安裝時(shí)候的默認(rèn)符號(hào),現(xiàn)在已經(jīng)變?yōu)榱瞬迦敕?hào)。
'^'(插入符號(hào)): 這個(gè)符號(hào)就顯得非常的靈活了,他將會(huì)把當(dāng)前庫的版本更新到當(dāng)前major version(也就是第一位數(shù)字)中最新的版本。放到我們的例子中就是:"vue": "^2.2.2", 這個(gè)庫會(huì)去匹配2.x.x中最新的版本,但是他不會(huì)自動(dòng)更新到3.0.0。

可以參考npm官方給出的解釋

^1.2.3 := >=1.2.3 <2.0.0
^0.2.3 := >=0.2.3 <0.3.0
^0.0.3 := >=0.0.3 <0.0.4

大多數(shù)情況下遵循這種版本號(hào)規(guī)則的依賴包都沒問題, 但是npm是開源的世界, 并不是所有的都嚴(yán)格遵循這種規(guī)則, 所以會(huì)出現(xiàn)上述的問題;

為什么需要package鎖

有如下幾個(gè)可能原因, 在某些情況下, package.json是無法保證每個(gè)人自己電腦上執(zhí)行的 npm install 后安裝的依賴版本都是一樣的

1.如果package.json中記錄的依賴包的版本是一個(gè)版本范圍, 一旦執(zhí)行npm i 會(huì)導(dǎo)致這個(gè)包更新到最新版本

2.就算你依賴了一個(gè)固定版本的包(如A 1.1.1), 但你依賴的包A可能依賴其他的包B,而A在聲明依賴時(shí)可能也使用了semser命名, 如 ^1.2.3, 如果包B release 了新版, 也會(huì)導(dǎo)致包B會(huì)安裝到更新版本

3.不同人使用的npm程序的版本不同

如果依賴包的版本不一致, 會(huì)導(dǎo)致開發(fā)環(huán)境和生產(chǎn)環(huán)境產(chǎn)品不一致的行為; 或者導(dǎo)致不同團(tuán)隊(duì)成員之前也產(chǎn)品環(huán)境差異

如何解決包版本不一致的情況

1.npm 使用package-lock.json文件來解決這個(gè)問題

執(zhí)行npm install會(huì)自動(dòng)生成package.json文件, 只要執(zhí)行普通的安裝, 更新等可能會(huì)修改 package.json的npm命令, 都會(huì)自動(dòng)同步修改package-lock.json文件

npm install xxx
npm rm xxx
npm update xxx

2.npm 還支持npm-shrinkwrap.json, 和package-lock.json功能完全一樣

執(zhí)行 npm shrinkwrap來生成npm-shrinkwrap.json

此命令將根據(jù) package-lock.json 文件創(chuàng)建一個(gè)新的或覆蓋已有的 npm-shrinkwrap.json 文件。 此命令創(chuàng)建和更新的文件將優(yōu)先于任何其他現(xiàn)有或?qū)⒂械?package-lock.json 文件。

3.使用yarn

使用yarn主要有一下優(yōu)點(diǎn)

  • 快速: 會(huì)緩存它下載的每個(gè)包,無需重復(fù)下載;能并行化操作以最大資源利用率
  • 可靠:使用格式詳盡而又簡(jiǎn)潔的 lockfile文件 和確定性算法來安裝依賴,能夠保證在一個(gè)系統(tǒng)上的運(yùn)行的安裝過程也會(huì)以同樣的方式運(yùn)行在其他系統(tǒng)上。
  • 安全: 安裝包被執(zhí)行前校驗(yàn)其完整性
  • yarn速度比npm快一些, yarn的鎖文件是yarn.lock, 能解決包版本不一致的情況

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI