日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

寫(xiě)在前面

在Node.js生態(tài)系統(tǒng)中,包管理器是至關(guān)重要的組件之一,它們負(fù)責(zé)維護(hù)各種應(yīng)用程序和庫(kù)之間的依賴關(guān)系。npm是Node.js的默認(rèn)包管理器,它的初始版本是npm1,但是它很快就被npm2所取代。

npm2

關(guān)于npm2最初作為包管理管理,采用的是node_modules嵌套模式,即每個(gè)包都會(huì)有自己獨(dú)立的node_modules,且會(huì)將各自依賴進(jìn)行安裝,依賴的依賴也會(huì)產(chǎn)生自己的node_modules,這樣就產(chǎn)生了“嵌套依賴”。

就像回調(diào)嵌套一樣,容易陷入回調(diào)地獄,嵌套依賴也不例外。

這種嵌套依賴的模式,雖然可以使依賴項(xiàng)的版本更加明確和穩(wěn)定,但是在實(shí)際應(yīng)用中也存在一些問(wèn)題。其中最大的問(wèn)題是包的嵌套層級(jí)很深,這可能會(huì)導(dǎo)致安裝和更新依賴項(xiàng)的時(shí)間變長(zhǎng),并增加包的大小。此外,由于每個(gè)包都有自己的node_modules文件夾,這可能會(huì)導(dǎo)致文件系統(tǒng)中出現(xiàn)大量重復(fù)的依賴項(xiàng),從而占用更多的磁盤(pán)空間。

在實(shí)際操作中,當(dāng)需要在特定的Node.js版本中使用npm2時(shí),可以使用Node Version Manager (nvm)來(lái)管理多個(gè)Node.js版本。例如,在切換到Node.js v4.0版本時(shí),對(duì)應(yīng)的npm版本是npm2.x。

圖片

為了更好地說(shuō)明嵌套依賴的問(wèn)題,我們可以通過(guò)安裝koa來(lái)演示。koa是一個(gè)基于Node.js的Web應(yīng)用程序框架,它有許多依賴項(xiàng),我們可以使用以下命令來(lái)安裝koa:

npm install koa

在安裝koa時(shí),npm會(huì)自動(dòng)下載和安裝所有必需的依賴項(xiàng),并將它們安裝到koa的node_modules文件夾中。如果我們檢查koa的node_modules文件夾,我們會(huì)發(fā)現(xiàn)它包含了大量的依賴項(xiàng),這些依賴項(xiàng)中又包含了更多的依賴項(xiàng),導(dǎo)致整個(gè)文件夾的嵌套層級(jí)變得很深。

圖片

對(duì)于多包之間會(huì)存在公共依賴,如果對(duì)于每個(gè)依賴都生成自己獨(dú)立的node_modules,那么就會(huì)對(duì)相同包重復(fù)安裝多次,這就會(huì)占據(jù)很大的磁盤(pán)空間。且無(wú)限嵌套,也會(huì)超過(guò)windows的最大文件路徑長(zhǎng)度限制(265個(gè)字符)。

嵌套依賴項(xiàng)的模式是npm2中的一個(gè)特性,雖然可以保證依賴項(xiàng)的版本穩(wěn)定性和精確性,但是它可能會(huì)導(dǎo)致嵌套層級(jí)變得很深,并占用大量的磁盤(pán)空間。

yarn

我們想到,既然樹(shù)形結(jié)構(gòu)存在弊端,為什么不將依賴包在根node_modules進(jìn)行扁平化處理,這不就解決了依賴嵌套、依賴重復(fù)和路徑限制問(wèn)題了?

此時(shí)新方式y(tǒng)arn就橫空誕生。

當(dāng)使用yarn進(jìn)行依賴管理時(shí),我們可以看到所有依賴都會(huì)被安裝在根目錄下的node_modules文件夾中。與npm2不同的是,yarn采用了扁平依賴項(xiàng)的模式,這意味著相同的依賴包只會(huì)被安裝一次,并且不會(huì)存在多個(gè)嵌套的node_modules文件夾。

使用yarn add koa進(jìn)行安裝,可以看到通過(guò)yarn進(jìn)行管理的依賴全部平鋪在根node_modules下,且沒(méi)有重復(fù)依賴安裝的問(wèn)題。

圖片

但是,當(dāng)某些依賴包存在多個(gè)版本時(shí),yarn會(huì)將其中一個(gè)版本提升到根node_modules文件夾中,而其他依賴包則會(huì)繼續(xù)維護(hù)自己的版本。這可能會(huì)導(dǎo)致某些依賴包無(wú)法正常工作,因?yàn)樗鼈兛赡苄枰褂锰囟ò姹镜囊蕾嚢榱私鉀Q這個(gè)問(wèn)題,yarn仍然需要使用嵌套的node_modules文件夾,以確保每個(gè)依賴包使用正確的版本。

圖片

值得注意的是,yarn采用的扁平依賴項(xiàng)模式具有許多優(yōu)點(diǎn),例如更快的安裝速度,更少的磁盤(pán)空間占用和更少的依賴沖突問(wèn)題。此外,yarn還提供了一個(gè)lock文件,該文件記錄了所有依賴項(xiàng)的確切版本和位置,以確保依賴項(xiàng)的版本穩(wěn)定性和一致性。

yarn的變與不變:

yarn采用了更加高效和可靠的依賴項(xiàng)管理方式,可以有效地避免依賴沖突和嵌套的問(wèn)題。但是,對(duì)于某些多版本依賴包,yarn仍然需要使用node_modules嵌套的方式來(lái)確保每個(gè)依賴包都使用正確的版本。

npm3

npm3在2015年發(fā)布時(shí)引入了一種新的依賴項(xiàng)安裝算法,稱為“扁平依賴項(xiàng)”。其主要原理是通過(guò)將所有依賴項(xiàng)都放置在同一個(gè)目錄下,并使用符號(hào)鏈接來(lái)實(shí)現(xiàn)依賴項(xiàng)的共享。

在npm3中,所有依賴項(xiàng)都被直接安裝到根目錄下的node_modules中,而不是像npm2一樣在每個(gè)依賴包中嵌套一個(gè)node_modules目錄。這種扁平化的結(jié)構(gòu)可以減少依賴項(xiàng)的嵌套層級(jí),從而降低了磁盤(pán)空間的占用和文件路徑的長(zhǎng)度。在這種模式下,所有依賴項(xiàng)都被安裝到頂級(jí)node_modules文件夾中,這樣就避免了嵌套依賴項(xiàng)的問(wèn)題。這種模式雖然簡(jiǎn)單,但是它可能會(huì)導(dǎo)致依賴項(xiàng)的版本不穩(wěn)定,從而可能會(huì)導(dǎo)致依賴沖突的問(wèn)題。

當(dāng)我們使用npm3安裝koa包時(shí),它會(huì)首先檢查該包所需的所有依賴項(xiàng)是否已經(jīng)安裝,如果沒(méi)有安裝,則會(huì)將這些依賴項(xiàng)直接安裝到根目錄下的node_modules目錄中。同時(shí),npm3會(huì)使用符號(hào)鏈接將這些依賴項(xiàng)鏈接到需要使用它們的包的node_modules目錄下。

圖片

 

 

通過(guò)使用符號(hào)鏈接,npm3可以實(shí)現(xiàn)依賴項(xiàng)的共享,從而避免了依賴項(xiàng)的重復(fù)安裝和占用大量的磁盤(pán)空間。此外,npm3還支持npm shrinkwrap命令,可以生成一個(gè)lockfile文件,記錄每個(gè)包所使用的依賴項(xiàng)的精確版本號(hào),從而避免了版本沖突和不兼容的問(wèn)題。

 

shrinkwrap 文件的作用是什么?

這個(gè)文件用于記錄整個(gè)依賴樹(shù)的結(jié)構(gòu)和依賴包的版本信息,可以保證依賴包的版本穩(wěn)定性和一致性。

那么使用扁平化方案就能完美解決以上問(wèn)題嗎?當(dāng)然不是。

  • 幽靈依賴:在聲明中沒(méi)有使用dependencies中的依賴,代碼中也可以進(jìn)行reqiure引入。沒(méi)有在項(xiàng)目中進(jìn)行顯式依賴,如果別的包不再依賴這個(gè)包,就會(huì)導(dǎo)致代碼因?yàn)橐蕾囘@個(gè)包,而沒(méi)有進(jìn)行安裝,最終不能正常運(yùn)行。
  • 磁盤(pán)浪費(fèi):對(duì)于依賴包只會(huì)提升一個(gè),存在多個(gè)版本時(shí)其余包同樣得進(jìn)行拷貝到各自node_modules下,依然會(huì)存在磁盤(pán)空間浪費(fèi)。

什么是幽靈依賴?

在安裝和使用某個(gè)第三方包時(shí),該包依賴的其他依賴沒(méi)有在它的js文件中顯式引入的情況。這些依賴可能在代碼中被引用,但是沒(méi)有被包含在軟件包的package.json文件中。這種情況被稱為“幽靈依賴”。

舉個(gè)例子,假設(shè)有個(gè)項(xiàng)目需要依賴包 A 和 B,而這兩個(gè)包都依賴于包 C,但是包 A 依賴于包 C 的版本 1.0.0,而包 B 依賴于包 C 的版本 2.0.0。在 npm2 中,這兩個(gè)版本的包 C 會(huì)被分別安裝在 A 和 B 的 node_modules 目錄下,不會(huì)產(chǎn)生沖突。但在 npm3 中,這兩個(gè)版本的包 C 可能會(huì)被安裝在同一個(gè) node_modules 目錄下,這時(shí)候就會(huì)產(chǎn)生沖突,導(dǎo)致代碼無(wú)法運(yùn)行。

圖片

雖然在npm3提供了 npm dedupe 命令,可以是手動(dòng)輸入命令將重復(fù)的依賴項(xiàng)合并到頂層 node_modules 目錄下,避免了幽靈依賴的問(wèn)題。但是好像并沒(méi)有很智能。

總的來(lái)說(shuō),npm3通過(guò)采用扁平化的依賴管理結(jié)構(gòu)和符號(hào)鏈接機(jī)制,引入 shrinkwrap 文件實(shí)現(xiàn)了依賴項(xiàng)的共享和版本精確控制,并且減少了依賴項(xiàng)的嵌套層級(jí)和磁盤(pán)空間占用。可以手動(dòng)使用 dedupe 命令等方式,解決了 npm2 中出現(xiàn)的幽靈依賴問(wèn)題,提高了包管理的效率和可靠性。

pnpm

針對(duì)上面遺留下的兩個(gè)問(wèn)題,pnpm橫空出世,采用硬鏈接和符號(hào)鏈接來(lái)管理依賴項(xiàng),以減少重復(fù)下載和占用空間,從而有效地解決幽靈依賴和磁盤(pán)浪費(fèi)的問(wèn)題。

  • 基于內(nèi)容尋址的文件系統(tǒng)來(lái)存儲(chǔ)磁盤(pán)的文件
  • 不會(huì)重復(fù)安裝同一個(gè)包,只在磁盤(pán)中寫(xiě)入一次,而后在使用的地方通過(guò)hardlink
  • 同包不同版本,也盡可能復(fù)用代碼

link:也就是軟硬連接,這是操作系統(tǒng)提供的機(jī)制。

  • 硬連接就是同一個(gè)文件的不同引用
  • 軟鏈接是新建一個(gè)文件,文件內(nèi)容指向另一個(gè)路徑

具體來(lái)說(shuō),當(dāng)使用 pnpm 安裝koa包的依賴項(xiàng)時(shí),它會(huì)首先檢查系統(tǒng)上是否已經(jīng)安裝了所需的依賴項(xiàng)。如果已經(jīng)安裝,則 pnpm 將創(chuàng)建一個(gè)符號(hào)鏈接到該依賴項(xiàng),而不是在當(dāng)前項(xiàng)目中復(fù)制該依賴項(xiàng)。這樣就避免了重復(fù)下載和占用磁盤(pán)空間的問(wèn)題。

我們?cè)诿钚休斎?

pnpm add koa

圖片

圖片

此外,pnpm 還支持不同的包引用方式,如路徑引用和 git 倉(cāng)庫(kù)引用,這使得 pnpm 可以更快地安裝依賴項(xiàng)并減少重復(fù)下載,從而提高開(kāi)發(fā)效率和依賴項(xiàng)管理的可靠性。通過(guò)將包從全局 store 進(jìn)行硬鏈接到項(xiàng)目的虛擬 store 中,pnpm 可以避免多次拷貝文件和深度嵌套路徑過(guò)長(zhǎng)的問(wèn)題,從而進(jìn)一步減少磁盤(pán)空間的占用和提高性能。

圖片

PNPM 的核心思想是在整個(gè)項(xiàng)目?jī)?nèi)共享依賴項(xiàng),而不是每個(gè)項(xiàng)目都擁有自己的依賴項(xiàng)副本。

這是官方文檔提供的原理圖:

圖片

可以看到有個(gè)公共的依賴包安裝池,然后通過(guò)軟鏈接引入到各個(gè)項(xiàng)目所需要的依賴中,這樣就減少了幽靈依賴、依賴嵌套和重復(fù)下載的問(wèn)題。

PNPM的優(yōu)點(diǎn)如下:

節(jié)省磁盤(pán)空間:pnpm采用鏈接的方式將依賴項(xiàng)共享到全局store中,避免了每個(gè)項(xiàng)目都需要拷貝一份依賴包的問(wèn)題,從而顯著減少了磁盤(pán)占用空間。

提升安裝速度:pnpm不需要每次都下載相同的依賴項(xiàng),而是從全局store中直接鏈接到各個(gè)項(xiàng)目中,因此可以極大地提高安裝速度。

避免了幽靈依賴、重復(fù)依賴和依賴嵌套:pnpm采用鏈接的方式,避免了項(xiàng)目之間依賴相同包不一致的問(wèn)題,同時(shí)避免了重復(fù)安裝相同版本的依賴項(xiàng)和依賴嵌套的問(wèn)題。

支持多種包引用方式:pnpm支持路徑引用和git倉(cāng)庫(kù)引用,可以更加靈活地管理依賴項(xiàng)。

天生支持monorepo管理:得益于pnpm的軟鏈接特性,可以在同一個(gè)workspace下共享依賴和模塊等。

另外,對(duì)于存儲(chǔ)大量依賴的情況,pnpm提供了「pnpm store prune」命令,可以定期清理不再使用的依賴項(xiàng),釋放磁盤(pán)空間。

參考文章

  • 關(guān)于現(xiàn)代包管理器的深度思考——為什么現(xiàn)在我更推薦 pnpm 而不是 npm/yarn?
  • pnpm 是憑什么對(duì) npm 和 yarn 降維打擊的
  • 現(xiàn)代前端工程為什么越來(lái)越離不開(kāi) Monorepo?
  • 現(xiàn)代前端工程為什么越來(lái)越離不開(kāi) Monorepo?
  • 為什么越來(lái)越多的項(xiàng)目選擇 Monorepo?
  • pnpm官方文檔

寫(xiě)在最后

最后對(duì)不同包管理器的優(yōu)缺點(diǎn)、特點(diǎn)做了一些總結(jié):

圖片

學(xué)而知不足,水平有限,還望諸君多多指教。覺(jué)得文章不錯(cuò)的讀者,不妨點(diǎn)個(gè)關(guān)注,收藏起來(lái)上班摸魚(yú)的時(shí)候品嘗。

分享到:
標(biāo)簽:管理器
用戶無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定