<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
大家最近是不是經常聽到 pnpm,我也一樣。今天研究了一下它的機制,確實厲害,對 yarn 和 npm 可以說是降維打擊。
那具體好在哪裡呢? 我們一起來看一下。
我們按照包管理工具的發展歷史,從 npm2 開始講起:
用 node 版本管理工具把 node 版本降到 4,那 npm 版本就是 2.x 了。
然後找個目錄,執行下 npm init -y,快速建立個 package.json。
然後執行 npm install express,那麼 express 包和它的依賴都會被下載下來:
展開 express,它也有 node_modules:
再展開幾層,每個依賴都有自己的 node_modules:
也就是說 npm2 的 node_modules 是巢狀的。
這很正常呀?有什麼不對麼?
這樣其實是有問題的,多個包之間難免會有公共的依賴,這樣巢狀的話,同樣的依賴會複製很多次,會佔據比較大的磁碟空間。
這個還不是最大的問題,致命問題是 windows 的檔案路徑最長是 260 多個字元,這樣巢狀是會超過 windows 路徑的長度限制的。
當時 npm 還沒解決,社群就出來新的解決方案了,就是 yarn:
yarn 是怎麼解決依賴重複很多次,巢狀路徑過長的問題的呢?
鋪平。所有的依賴不再一層層巢狀了,而是全部在同一層,這樣也就沒有依賴重複多次的問題了,也就沒有路徑過長的問題了。
我們把 node_modules 刪了,用 yarn 再重新安裝下,執行 yarn add express:
這時候 node_modules 就是這樣了:
全部鋪平在了一層,展開下面的包大部分是沒有二層 node_modules 的:
當然也有的包還是有 node_modules 的,比如這樣:
為什麼還有巢狀呢?
因為一個包是可能有多個版本的,提升只能提升一個,所以後面再遇到相同包的不同版本,依然還是用巢狀的方式。
npm 後來升級到 3 之後,也是採用這種鋪平的方案了,和 yarn 很類似:
當然,yarn 還實現了 yarn.lock 來鎖定依賴版本的功能,不過這個 npm 也實現了。
yarn 和 npm 都採用了鋪平的方案,這種方案就沒有問題了麼?
並不是,扁平化的方案也有相應的問題。
最主要的一個問題是幽靈依賴,也就是你明明沒有宣告在 dependencies 裡的依賴,但在程式碼裡卻可以 require 進來。
這個也很容易理解,因為都鋪平了嘛,那依賴的依賴也是可以找到的。
但是這樣是有隱患的,因為沒有顯式依賴,萬一有一天別的包不依賴這個包了,那你的程式碼也就不能跑了,因為你依賴這個包,但是現在不會被安裝了。
這就是幽靈依賴的問題。
而且還有一個問題,就是上面提到的依賴包有多個版本的時候,只會提升一個,那其餘版本的包不還是複製了很多次麼,依然有浪費磁碟空間的問題。
那社群有沒有解決這倆問題的思路呢?
當然有,這不是 pnpm 就出來了嘛。
那 pnpm 是怎麼解決這倆問題的呢?
回想下 npm3 和 yarn 為什麼要做 node_modules 扁平化?不就是因為同樣的依賴會複製多次,並且路徑過長在 windows 下有問題麼?
那如果不復制呢,比如通過 link。
首先介紹下 link,也就是軟硬連線,這是作業系統提供的機制,硬連線就是同一個檔案的不同參照,而軟連結是新建一個檔案,檔案內容指向另一個路徑。當然,這倆連結使用起來是差不多的。
如果不復制檔案,只在全域性倉庫儲存一份 npm 包的內容,其餘的地方都 link 過去呢?
這樣不會有複製多次的磁碟空間浪費,而且也不會有路徑過長的問題。因為路徑過長的限制本質上是不能有太深的目錄層級,現在都是各個位置的目錄的 link,並不是同一個目錄,所以也不會有長度限制。
沒錯,pnpm 就是通過這種思路來實現的。
再把 node_modules 刪掉,然後用 pnpm 重新裝一遍,執行 pnpm install。
你會發現它列印了這樣一句話:
包是從全域性 store 硬連線到虛擬 store 的,這裡的虛擬 store 就是 node_modules/.pnpm。
我們開啟 node_modules 看一下:
確實不是扁平化的了,依賴了 express,那 node_modules 下就只有 express,沒有幽靈依賴。
展開 .pnpm 看一下:
所有的依賴都在這裡鋪平了,都是從全域性 store 硬連線過來的,然後包和包之間的依賴關係是通過軟連結組織的。
比如 .pnpm 下的 expresss,這些都是軟連結,
也就是說,所有的依賴都是從全域性 store 硬連線到了 node_modules/.pnpm 下,然後之間通過軟連結來相互依賴。
官方給了一張原理圖,配合著看一下就明白了:
這就是 pnpm 的實現原理。
那麼回過頭來看一下,pnpm 為什麼優秀呢?
首先,最大的優點是節省磁碟空間呀,一個包全域性只儲存一份,剩下的都是軟硬連線,這得節省多少磁碟空間呀。
其次就是快,因為通過連結的方式而不是複製,自然會快。
這也是它所標榜的優點:
相比 npm2 的優點就是不會進行同樣依賴的多次複製。
相比 yarn 和 npm3+ 呢,那就是沒有幽靈依賴,也不會有沒有被提升的依賴依然複製多份的問題。
這就已經足夠優秀了,對 yarn 和 npm 可以說是降維打擊。
pnpm 最近經常會聽到,可以說是爆火。本文我們梳理了下它爆火的原因:
npm2 是通過巢狀的方式管理 node_modules 的,會有同樣的依賴複製多次的問題。
npm3+ 和 yarn 是通過鋪平的扁平化的方式來管理 node_modules,解決了巢狀方式的部分問題,但是引入了幽靈依賴的問題,並且同名的包只會提升一個版本的,其餘的版本依然會複製多次。
pnpm 則是用了另一種方式,不再是複製了,而是都從全域性 store 硬連線到 node_modules/.pnpm,然後之間通過軟連結來組織依賴關係。
這樣不但節省磁碟空間,也沒有幽靈依賴問題,安裝速度還快,從機制上來說完勝 npm 和 yarn。
pnpm 就是憑藉這個對 npm 和 yarn 降維打擊的,更多關於pnpm降維打擊npm yarn的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45