在探索現(xiàn)代 JavaScript 生態(tài)系統(tǒng)時(shí),我們常常會(huì)遇到新興技術(shù)的快速迭代和改進(jìn)。其中,包管理工具的發(fā)展尤為重要,因?yàn)樗鼈冎苯佑绊戦_(kāi)發(fā)效率和項(xiàng)目性能。最近,pnpm 作為一種新的包管理工具引起了廣泛關(guān)注。它不僅挑戰(zhàn)了傳統(tǒng)工具如 npm 和 Yarn,還提供了一些獨(dú)特的優(yōu)勢(shì),使其在許多方面超越了前輩。
為了更好地理解 pnpm 的優(yōu)勢(shì),我們從包管理工具的歷史開(kāi)始探索,從 npm2 開(kāi)始的各個(gè)階段。我們將看到 pnpm 如何通過(guò)技術(shù)創(chuàng)新解決歷史遺留問(wèn)題,并極大地提高性能和效率。接下來(lái),深入了解 pnpm 的核心機(jī)制以及它如何改變開(kāi)發(fā)者處理依賴(lài)管理的方式。
使用 Node 版本管理工具將 Node 版本降級(jí)到 4,然后 npm 版本將是 2.x。
在一個(gè)目錄中運(yùn)行 npm init -y 快速創(chuàng)建一個(gè) package.json 文件。
然后運(yùn)行 npm install express,express 包及其依賴(lài)項(xiàng)將被下載:
展開(kāi) express,它也有 node_modules:
繼續(xù)展開(kāi)幾層,每個(gè)依賴(lài)項(xiàng)都有自己的 node_modules:
換句話說(shuō),npm2 的 node_modules 是嵌套的。
這正常嗎?這有什么問(wèn)題嗎?
實(shí)際上,這確實(shí)有問(wèn)題。多個(gè)包不可避免地具有共同的依賴(lài)項(xiàng)。當(dāng)像這樣嵌套時(shí),相同的依賴(lài)項(xiàng)將被多次重復(fù),占用了相對(duì)較大的磁盤(pán)空間。
這還不是最大的問(wèn)題;致命的問(wèn)題是 Windows 中文件路徑的最大長(zhǎng)度超過(guò) 260 個(gè)字符。像這樣嵌套會(huì)超過(guò) Windows 的路徑長(zhǎng)度限制。
在 npm 尚未解決這個(gè)問(wèn)題時(shí),社區(qū)出現(xiàn)了一個(gè)新的解決方案:yarn。
Yarn 如何解決重復(fù)依賴(lài)和過(guò)長(zhǎng)嵌套路徑的問(wèn)題?
扁平化。所有依賴(lài)項(xiàng)不再逐層嵌套,而是全部處于同一層級(jí),因此不再存在重復(fù)依賴(lài)或路徑過(guò)長(zhǎng)的問(wèn)題。
我們刪除 node_modules,使用 Yarn 重新安裝并執(zhí)行 yarn add express:
此時(shí),node_modules 看起來(lái)像這樣:
所有依賴(lài)項(xiàng)都在同一層級(jí),大多數(shù)包在其下沒(méi)有第二層 node_modules:
當(dāng)然,有些包仍然有 node_modules,例如這個(gè):
為什么仍然存在嵌套?
因?yàn)橐粋€(gè)包可能有多個(gè)版本,并且只有一個(gè)版本可以被提升。因此,當(dāng)遇到不同版本的同一包時(shí),仍然使用嵌套。
npm 升級(jí)到版本 3 后,也采用了這種扁平化解決方案,與 yarn 非常相似:
當(dāng)然,yarn 也實(shí)現(xiàn)了 yarn.lock 的功能來(lái)鎖定依賴(lài)項(xiàng)版本,但 npm 也實(shí)現(xiàn)了這一點(diǎn)。
yarn 和 npm 都采用了扁平化解決方案。這種方法沒(méi)有問(wèn)題嗎?
不完全是,扁平化解決方案也有自己的問(wèn)題。
主要問(wèn)題是幽靈依賴(lài),這意味著在代碼中可以引入未在依賴(lài)項(xiàng)部分聲明的依賴(lài)項(xiàng)。
這很容易理解,因?yàn)橐磺卸际潜馄交模钥梢哉业揭蕾?lài)項(xiàng)的依賴(lài)項(xiàng)。
然而,這帶來(lái)了風(fēng)險(xiǎn),因?yàn)闆](méi)有明確的依賴(lài)聲明,如果有一天另一個(gè)包不再依賴(lài)于那個(gè)包,你的代碼將無(wú)法運(yùn)行,因?yàn)橐蕾?lài)于它,但現(xiàn)在沒(méi)有安裝。
這就是幽靈依賴(lài)的問(wèn)題。
另一個(gè)問(wèn)題是多個(gè)版本的依賴(lài)項(xiàng),如上所述。只有一個(gè)版本會(huì)被提升,而其他版本則會(huì)重復(fù)多次,導(dǎo)致磁盤(pán)空間浪費(fèi)。
社區(qū)有解決這兩個(gè)問(wèn)題的想法嗎?
當(dāng)然有!這就是為什么引入了 pnpm。
回顧一下,為什么 npm3 和 yarn 扁平化 node_modules?不就是因?yàn)橄嗤囊蕾?lài)項(xiàng)會(huì)被多次重復(fù),并且長(zhǎng)路徑可能會(huì)在 Windows 上引發(fā)問(wèn)題嗎?
如果我們不重復(fù)它們,而是使用鏈接呢?
首先,介紹鏈接。它是操作系統(tǒng)提供的軟鏈接和硬鏈接。硬鏈接是同一個(gè)文件的不同引用,而符號(hào)鏈接會(huì)創(chuàng)建一個(gè)新文件,其內(nèi)容指向另一個(gè)路徑。當(dāng)然,這兩種鏈接的使用方式是類(lèi)似的。
如果不復(fù)制文件,而是將 npm 包的唯一副本存儲(chǔ)在全局倉(cāng)庫(kù)中,并將其他位置鏈接到它呢?
這樣就不會(huì)因多次復(fù)制而浪費(fèi)磁盤(pán)空間,也不會(huì)有路徑過(guò)長(zhǎng)的問(wèn)題。路徑長(zhǎng)度的限制本質(zhì)上意味著不應(yīng)該有太深的目錄層級(jí);現(xiàn)在所有位置的目錄是鏈接在一起的,而不是在同一個(gè)目錄中,因此沒(méi)有長(zhǎng)度限制。
是的,pnpm 通過(guò)這種方法實(shí)現(xiàn)了這一點(diǎn)。
再次刪除 node_modules,然后使用 pnpm 通過(guò)運(yùn)行 pnpm install 重新安裝。
你會(huì)注意到它打印出這樣一句話:
軟件包從全局存儲(chǔ)硬鏈接到虛擬存儲(chǔ),這里的虛擬存儲(chǔ)是 node_modules/.pnpm。
我們打開(kāi) node_modules 看一看。
確實(shí)不是扁平的,依賴(lài) express,所以在 node_modules 下只有 express,沒(méi)有任何幽靈依賴(lài)。
展開(kāi) .pnpm 看看:
所有依賴(lài)項(xiàng)都在這里解決,全部從全局倉(cāng)庫(kù)直接鏈接過(guò)來(lái),并通過(guò)符號(hào)鏈接組織包之間的依賴(lài)關(guān)系。
例如,.pnpm 下的 express,都是符號(hào)鏈接。
換句話說(shuō),所有依賴(lài)項(xiàng)都是從全局倉(cāng)庫(kù)硬鏈接到 node_modules/.pnpm,然后它們通過(guò)符號(hào)鏈接相互依賴(lài)。
官方提供了一個(gè)示意圖,結(jié)合起來(lái)看很清楚:
這就是 pnpm 的實(shí)現(xiàn)原理。
首先,最大的優(yōu)勢(shì)是節(jié)省磁盤(pán)空間。包只在全局保存一份,其余的都是符號(hào)鏈接或硬鏈接。這節(jié)省了大量磁盤(pán)空間。
其次,它很快,因?yàn)樗褂面溄佣皇菑?fù)制,這自然使它更快。
這些也是它所宣稱(chēng)的優(yōu)勢(shì):
相比 npm2,優(yōu)勢(shì)在于不會(huì)多次重復(fù)相同的依賴(lài)項(xiàng)。
相比 yarn 和 npm3+,沒(méi)有幽靈依賴(lài),也沒(méi)有未提升依賴(lài)項(xiàng)的重復(fù)問(wèn)題。
這已經(jīng)足夠優(yōu)秀,可以說(shuō)是對(duì) yarn 和 npm 的一次打擊。
最近,pnpm 頻繁被提及,可以說(shuō)是當(dāng)下的趨勢(shì)。在本文中,我們總結(jié)了其受歡迎的原因:
npm2 以嵌套方式管理 node_modules,導(dǎo)致多次重復(fù)依賴(lài)項(xiàng)的問(wèn)題。
npm3+ 和 yarn 通過(guò)扁平化方式管理 node_modules,解決了嵌套方式的一些問(wèn)題,但引入了幽靈依賴(lài)的問(wèn)題。此外,同名包只有一個(gè)版本被提升,而其他版本仍會(huì)重復(fù)。
pnpm 通過(guò)不復(fù)制文件,而是從全局倉(cāng)庫(kù)硬鏈接到 node_modules/.pnpm,并通過(guò)符號(hào)鏈接組織依賴(lài)關(guān)系,解決了這些問(wèn)題。
這不僅節(jié)省了磁盤(pán)空間,消除了幽靈依賴(lài)問(wèn)題,還加快了安裝速度。從機(jī)械角度來(lái)看,pnpm 超越了 npm 和 yarn。
通過(guò)這種對(duì) npm 和 yarn 的創(chuàng)新方法,pnpm 正在通過(guò)簡(jiǎn)化依賴(lài)管理的方式產(chǎn)生影響。
本文鏈接:http://www.www897cc.com/showinfo-26-95167-0.htmlPnpm:包管理的新星,如何顛覆 Npm 和 Yarn
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: Git是如何工作的?你知道嗎?