溫馨提示×

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

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

Node包管理發(fā)展的階段有哪些

發(fā)布時(shí)間:2022-12-27 10:11:46 來(lái)源:億速云 閱讀:206 作者:iii 欄目:web開(kāi)發(fā)

本文小編為大家詳細(xì)介紹“Node包管理發(fā)展的階段有哪些”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Node包管理發(fā)展的階段有哪些”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。

階段一:刀耕火種

正確來(lái)說(shuō),Node是不存在沒(méi)有包管理器時(shí)期的,2009年,Node.js 問(wèn)世時(shí) npm的雛形也發(fā)布了。

npm 全稱(chēng) Node.js Package Manager;從A brief history of Node.js 里面可以看到

2009 
Node.js is born 
The first form of npm is created

下面聊一下沒(méi)有出現(xiàn)Node包管理器時(shí)期是怎樣的,那時(shí)候做的更多的事情就是

  • 網(wǎng)上尋找各軟件的官網(wǎng),比如 jQuery;

  • 找到下載地址,下載 zip 包;

  • 解壓,放到項(xiàng)目中一個(gè)叫 libs 的目錄中;

  • 想更方便的話,直接將 CDN 鏈接粘貼到 HTML 中

那時(shí)候 模塊化管理?版本號(hào)管理?依賴(lài)升級(jí)?都不存在的!

階段二:嵌套安裝

2009 年,Node.js 誕生,npm的雛形也正在醞釀,2011年發(fā)布了 1.0 版本;npm是圍繞著語(yǔ)義版本控制 semver 的思想而設(shè)計(jì)的,默認(rèn)認(rèn)為Node包開(kāi)發(fā)者,在升級(jí)依賴(lài)包自定義版本號(hào)時(shí),都會(huì)按照 semver 規(guī)范升級(jí)版本號(hào)。

代名詞: Node包管理規(guī)范化、node_modules 目錄嵌套存放依賴(lài)

代表產(chǎn)物: npm v1、v2 版本

關(guān)鍵特點(diǎn):

(1)依賴(lài)包嵌套安裝,相同版本的依賴(lài)會(huì)被冗余安裝

(2)依賴(lài)包安裝不確定性:默認(rèn)裝最新次版本的依賴(lài)包(可設(shè)置固定版本)

(3)串行安裝依賴(lài),速度慢;不支持離線緩存

解釋1:依賴(lài) 嵌套安裝 ,如果A依賴(lài)B、B依賴(lài)C,node_modules目錄如下

node_modules
- package-A
-- node_modules
--- package-B
----- node_modules
------ package-C
-------- some-really-really-really-long-file-name-in-package-c.js

問(wèn)題: 依賴(lài)嵌套過(guò)多會(huì)造成嵌套地獄,與此同時(shí)會(huì)出現(xiàn)大量相同依賴(lài)包的冗余安裝,造成 node_modules 體積過(guò)大,需要程序員定期的 rm -rf node_modules,但windows系統(tǒng),很多程序無(wú)法處理超過(guò)260個(gè)字符的文件路徑名,早期 npm 的 windows 用戶(hù)都見(jiàn)過(guò)這個(gè)彈窗

Node包管理發(fā)展的階段有哪些


解釋2:針對(duì)每次 npm install 默認(rèn)安裝最新次版本依賴(lài),造成的依賴(lài)安裝 不確定性 問(wèn)題:

semver 規(guī)范了版本號(hào)構(gòu)成:X.Y.Z-[state],版本號(hào)升級(jí)規(guī)范如下

  • X 是主版本號(hào): API 產(chǎn)生的變化,與舊版本不兼容時(shí),升級(jí)主版本號(hào)

  • Y 是次版本號(hào): 增加了新的API,但向后兼容,升級(jí)次版本號(hào)

  • Z 是補(bǔ)丁版本號(hào): 當(dāng)做了向后兼容的缺陷修復(fù)的時(shí)候

  • state 可以是:alpha(內(nèi)測(cè))、beta(公測(cè))、gamma(相當(dāng)成熟的測(cè)試版)、rc(預(yù)發(fā)布)

版本不確定原因:執(zhí)行 npm 默認(rèn)安裝依賴(lài)指令時(shí),npm 認(rèn)為開(kāi)發(fā)者都會(huì)遵循 semver 版本升級(jí)規(guī)范,直接給開(kāi)發(fā)者安裝 了最新次版本的依賴(lài)包

  • 解決方案1:可以通過(guò)npm config set save-exact true命令關(guān)閉在版本號(hào)前面使用 ^的默認(rèn)行為

  • 總結(jié):無(wú)法解決依賴(lài)庫(kù)自己的依賴(lài)默認(rèn)安裝最新次版本的問(wèn)題

  • 解決方案2:npm提供了 shrinkwrap 命令,會(huì)生成一個(gè) npm-shrinkwrap.json 文件,為所有庫(kù)和所有嵌套依賴(lài)的庫(kù)記錄精準(zhǔn)的版本

  • 總結(jié):鎖文件不會(huì)默認(rèn)生成,需要用戶(hù)手動(dòng)執(zhí)行指令;依賴(lài)于用戶(hù)知道這個(gè)指令,相對(duì)繁瑣

階段三:扁平化安裝

2015年,為解決 npm1、npm2 存在的 嵌套安裝、版本不規(guī)定問(wèn)題,完全重寫(xiě)了 npm 程序

代名詞: 較少冗余依賴(lài)的安裝、node_modules 目錄扁平化存放依賴(lài)

代表產(chǎn)物: npm v3版本

原理簡(jiǎn)述: npm install時(shí),先構(gòu)建依賴(lài)樹(shù)再將所有依賴(lài)都安裝在 node_modules 根目錄,子依賴(lài)遇到不同版本的重名依賴(lài)時(shí),會(huì)將子依賴(lài)安裝在自己node_modules下

關(guān)鍵特點(diǎn):

(1)減少冗余安裝:依賴(lài)扁平化安裝,一定情況下減少了冗余包的安裝

存在的問(wèn)題

(1)“幽靈依賴(lài)”、“幻影依賴(lài)” 問(wèn)題

(2)“雙胞胎陌生人” 、“依賴(lài)包分身” 問(wèn)題

(3)目錄不固定:依賴(lài)的安裝順序,決定了 node_module 目錄結(jié)構(gòu)

解釋1:依賴(lài)的依次安裝順序,決定了node_modules 目錄結(jié)構(gòu)

如下場(chǎng)景: App1 依賴(lài) packageA 和 packageC 和 packageG 和 packageH,而 packageA 和 packageC 都依賴(lài)了 packageB v1.0,packageG、packageH 都依賴(lài) packageB 的 v2.0 版本

如果先安裝 packageA 或 packageC,node_modules 目錄如下

Node包管理發(fā)展的階段有哪些

如果先安裝 packageG 或 packageH,node_modules 目錄如下

Node包管理發(fā)展的階段有哪些

針對(duì)如上情況,npm 提供了指令 npm dedupe,可以手動(dòng)整理&簡(jiǎn)化 node_modules 的目錄結(jié)構(gòu),整理后的 node_modules 目錄結(jié)構(gòu)是一致的,不受依賴(lài)包安裝順序影響

解釋2:不一定能減少冗余包的安裝

通過(guò)舉例1,可以看出雖然依賴(lài)包扁平化安裝,但仍存在相同版本的依賴(lài)包,有冗余包

解釋3:“雙胞胎陌生人” 問(wèn)題

參考舉例1中,相同版本的依賴(lài)包,被安裝兩次,被放置到兩處,這種現(xiàn)象被稱(chēng)為“雙胞胎陌生人”

解釋4:“幽靈依賴(lài)” 問(wèn)題

node_modules 一級(jí)目錄下的依賴(lài)包,開(kāi)發(fā)者可以直接使用,但依賴(lài)包沒(méi)定義在 package.json 中,這樣的依賴(lài)包被稱(chēng)為 “幽靈依賴(lài)”,前端項(xiàng)目中使用 “幽靈依賴(lài)”,后期可能會(huì)出現(xiàn)問(wèn)題。

因?yàn)楹笃诳赡馨殡S著 其他依賴(lài)的升級(jí)移除了這個(gè)“幽靈依賴(lài)”,此時(shí) node_modules 中就不存在了,執(zhí)行 npm install 時(shí),并不會(huì)主觀的去安裝 “幽靈依賴(lài)”,導(dǎo)致項(xiàng)目找不到依賴(lài)包,然后報(bào)錯(cuò)。

階段四:安全、提速

2016年,yarn、pnpm release 版本相繼出現(xiàn),在一定程度上解決了之前的 安裝版本不確定、安裝速度慢等問(wèn)題,yarn 率先推出的能力相比于 npm,更奪人眼球,保證了一致性&安全性,提升了安裝速度

代名詞: 依賴(lài)安裝相對(duì)安全、提速

代表產(chǎn)物: yarn release版本、pnpm release版本、npm v5 版本(npm v4沒(méi)有太大變化,v5向前邁了一大步)

關(guān)鍵特點(diǎn):

(1)安全:默認(rèn)生成版本鎖文件,保證了每次安裝依賴(lài)版本都一樣

(2)提速:增加了緩存離線安裝、并行安裝、安裝異常后自動(dòng)重試

(3)workspace:yarn從v1版本開(kāi)始支持,可以高效管理多個(gè)項(xiàng)目的依賴(lài)包;npm v7才支持 workspace

存在的問(wèn)題

(1)幽靈依賴(lài)

(2)依賴(lài)包單項(xiàng)目重復(fù)安裝、跨項(xiàng)目重復(fù)安裝

(3)目錄不固定:依賴(lài)的安裝順序,決定了 node_module 目錄結(jié)構(gòu)

解釋1:關(guān)于安全

yarn v0.x 版本率先、npm v5.x 版本緊跟其后,下載依賴(lài)時(shí),默認(rèn)生成 依賴(lài)鎖文件,精確地將版本鎖定在一個(gè)值

  • yarn 的 .lock 文件:只是記錄安裝的依賴(lài)版本,需要結(jié)合 package.json 來(lái)確定 node_modules 目錄結(jié)構(gòu)

  • npm 的 .lock 文件:記錄了安裝的依賴(lài)版本 及 node_modules 目錄結(jié)構(gòu)

總結(jié): 避免了不同終端安裝依賴(lài)時(shí)版本不一致問(wèn)題,但“依賴(lài)幽靈” 問(wèn)題仍然存在

解釋2:關(guān)于提速 - 離線緩存

npm v2版本 就支持了緩存,但需要聯(lián)網(wǎng)檢測(cè),才能使用 緩存的依賴(lài)

yarn v0.x版本 率先支持了 離線緩存,從網(wǎng)絡(luò)下載的包都會(huì)緩存到全局,下次安裝優(yōu)先從本地找,找到直接copy

npm v5版本 重寫(xiě)了緩存系統(tǒng),也支持了離線安裝,安裝速度大大提升

解釋3:關(guān)于提速 - 并行安裝

yarn 率先支持了依賴(lài)包并行安裝,此前 npm 串行安裝依賴(lài),后來(lái) npm 也優(yōu)化了并行安裝

解釋4:安裝依賴(lài)后,自動(dòng)整理 node_modules 目錄

起始時(shí)間:yarn v1.x 版本、npm v4.x 版本

  • 如果項(xiàng)目中刪除了 .lock 文件,初始化安裝依賴(lài)時(shí),會(huì)自動(dòng)整理 node_modules 目錄;npm v4.x之前版本,需要用戶(hù)手動(dòng)執(zhí)行指令 npm dedupe整理依賴(lài)目錄

  • 由于 node_modules 是扁平化管理依賴(lài),深層依賴(lài)可能會(huì)被安裝到一級(jí)目錄下;當(dāng)項(xiàng)目中再安裝不同版本的依賴(lài)時(shí),遇到依賴(lài)版本沖突,會(huì)自動(dòng)將深層依賴(lài)從一級(jí)目錄移動(dòng)到父依賴(lài)目錄下 【已驗(yàn)證】

階段五:更安全、高速、低耗

對(duì)著 pnpm 的成熟,開(kāi)發(fā)者們享受著 pnpm 帶來(lái)的 更安全、更高速、存儲(chǔ)更低耗 等紅利,解決了“幽靈依賴(lài)” 問(wèn)題,解決了重復(fù)依賴(lài)問(wèn)題

代名詞: 安全(依賴(lài)安裝所見(jiàn)即所得)、高速(不重復(fù)安裝)、存儲(chǔ)低耗(硬鏈接 + 軟鏈接)

代表產(chǎn)物: pnpm

關(guān)鍵特點(diǎn):

(1)速度極快:存儲(chǔ)中心集中管理依賴(lài),直接硬鏈接到項(xiàng)目的 node_modules/.pnpm 中。相比于之前的工作方式,減少了從全局 node_modules copy 到項(xiàng)目?jī)?nèi)的大量 IO 操作

(2)磁盤(pán)利用率極高

  • 跨項(xiàng)目共用相同版本的依賴(lài):硬鏈接、軟鏈接

  • 最大限度的復(fù)用同一依賴(lài)的不同版本:只增加存儲(chǔ)不同版本的 Diff 文件

(3)安全性高:node_modules 目錄結(jié)構(gòu)就是 package.json 依賴(lài)列表,解決了 “幽靈依賴(lài)” 問(wèn)題

Node包管理發(fā)展的階段有哪些

性能表現(xiàn)如下:

Node包管理發(fā)展的階段有哪些

讀到這里,這篇“Node包管理發(fā)展的階段有哪些”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。

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

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

AI