yarn 的Plug'n'Play特性提供了一種新的包管理的策略大刊,主要是為了解決之前yarn 包管理的的一些痛點(diǎn),下面主要分當(dāng)前包管理的原理及問題她混,Plug'n'Play的實(shí)現(xiàn)方案屡萤,Plug'n'Play使用方式三部分介紹Plug'n'Play(簡(jiǎn)稱PnP)特性。
當(dāng)前包管理的原理及問題
PnP主要是為了解決當(dāng)前依賴管理方式 安裝依賴钓辆,引用依賴效率低下的問題,這里介紹下現(xiàn)有安裝依賴和引用依賴的方式
安裝依賴當(dāng)執(zhí)行yarn intall的時(shí)候肴焊,一般會(huì)執(zhí)行如下四個(gè)操作:
解析依賴版本號(hào)
下載對(duì)應(yīng)版本模塊的tar包到本地離線緩存(離線緩存目錄前联,Windows下目錄為:Users/[user]/AppData/Local/Yarn/Cache/v6/)
解壓鏡像
-
將緩存中的包拷貝到node_modules中,另外包中的依賴也會(huì)拷貝到對(duì)應(yīng)包的node_modules中
注意:
如果安裝的包在node_modules根目錄中有相同的包娶眷,會(huì)直接替換node_modules根目錄中的包
如果多個(gè)包有不同版本號(hào)的相同的依賴包似嗤,則將對(duì)應(yīng)版本的依賴包,拷貝到對(duì)應(yīng)包的node_modules 中届宠,另外最后一個(gè)安裝該依賴包的包引用的是node_modules中的包
如上圖烁落,以koa和express為例,因?yàn)閗oa和express都依賴了debug包豌注,且依賴的debug包的版本號(hào)不一樣伤塌,又因?yàn)橄劝惭b的koa,后安裝的express轧铁,所以express引用根目錄node_modules中的包每聪,而koa包目錄中會(huì)再創(chuàng)建一個(gè)node_modules目錄,將對(duì)應(yīng)版本的debug包拷貝到自己的node_moduels中。(整體介紹的比較啰嗦熊痴,如果已懂可以略過他爸,沒有的話,看完最好親自試驗(yàn)一番)
引用依賴當(dāng)我們?cè)谝?require('koa')) 一個(gè)包時(shí)果善,
會(huì)先從當(dāng)前目錄中找node_moduels目錄中的包,沒有找到則去父目錄中找系谐,依次類推巾陕,直到根目錄。
找到node_moduels后纪他,會(huì)在node_modules中尋找該包鄙煤,一般是找package.json中的包名
由此可以看出yarn 之前的管理方式有以下缺點(diǎn):
大量的文件I/O,導(dǎo)致安裝依賴和引用依賴效率低下
由于每個(gè)工程下都掛載一個(gè)node_modules茶袒,占用磁盤空間大
Plug'n'Play實(shí)現(xiàn)方案
PnP 的工作原理是通過通過.pnp.js維護(hù)一張靜態(tài)映射表梯刚,替代了從依賴緩存拷貝到node_moduels的方案
這里重點(diǎn)介紹下.pnp.js這個(gè)腳本文件
從圖中我們可以看出,.pnp.js中主要包含如下信息:
包名薪寓、版本號(hào)亡资、包的緩存路徑
(Users/[username]/AppData/Local/Yarn/Cache/v6),對(duì)于不同版本的同一個(gè)包會(huì)安裝多個(gè)包
如上圖向叉,對(duì)于不同版本的同一個(gè)包锥腻,安裝了多份
優(yōu)點(diǎn)很顯然,我們可以看到母谎,使用這種方式:
安裝依賴速度明顯的得到了提升
減少了磁盤的占用空間
Plug'n'Play使用方式
yarn --pnp
執(zhí)行如上命令瘦黑,會(huì)進(jìn)行如下操作
自動(dòng)創(chuàng)建.pnp.js文件
如果已經(jīng)安裝的包在yarn緩存目錄中沒有,則會(huì)重新下載安裝到緩存目錄中
并package.json中添加如下配置:
"installConfig": {
"pnp": true
?}
如果奇唤,不想使用PnP方式了幸斥,可以改為false,至此再安裝包就不會(huì)創(chuàng)建node_modules了咬扇,也不會(huì)將新安裝的包拷貝到已有的node_modules中了甲葬。
官網(wǎng)地址:https://yarnpkg.com/features/pnp關(guān)于PnP的特性就介紹到這里,另外推薦大家在學(xué)習(xí)的時(shí)候冗栗,尤其是對(duì)于新概念演顾,新知識(shí)學(xué)習(xí)的時(shí)候,最好要親自試驗(yàn)隅居,親自試驗(yàn)钠至,親自試驗(yàn)???,不要僅僅看看就可以了胎源,反正對(duì)我這這種笨的人棉钧,只要是沒親自試驗(yàn)過的知識(shí),不管是從哪薅來的涕蚤,最終都沒有掌握??????????
本文使用 文章同步助手 同步