越來越流行的 Pnpm,了解一下
大家好,我是前端西瓜哥。今天我們來認識一下 pnpm 包。它是一個包管理工具,但卻逐漸流行,讓我們看看它到底做了什么驚人之舉。
pnpm 為何能流行
快速和輕量
前端開發(fā)用的包管理工具是 npm(Node Package Manager),應付普通的開發(fā)還是不錯的。
但也有不少痛點,于是 yarn 輪子被造了出來。它通過并行下載和緩存解決了 npm 下載慢的問題,并引入 lockfile 機制解決安裝版本號不固定導致一些錯誤的問題。當然,這些問題也被 npm 的后續(xù)版本跟進改善了。
但它們還有一個比較重要的問題沒解決,那就是 包的冗余問題。
如果你在本地安裝了幾十個項目,這些項目的依賴項的安裝都是獨立的,即使這些項目有大量相同版本的依賴包,也是會被安裝多次。
首先這會導致你的容量一般的電腦痛苦不堪。當然更重要的是安裝會很慢,明明本地有,但你就是要去網(wǎng)上下載。如果網(wǎng)速很慢包很大還要下完還要運行一些編譯腳本,那太痛苦了。
pnpm 正是為了解決這個問題,而逐漸流行起來的包管理工具。
它的原理并不復雜,就是將包和版本集中到一個地方保存起來,如果一個項目用到某個版本的包,剛好本地又有,那就通過軟硬鏈接鏈接過去,省去了下載時間和硬盤空間。
幽靈依賴
yarn 和 npm 后來的版本其實也是做了 項目層級的緩存的,就是將一些包的依賴包,把它們放到 node_modules 的最外層,而解決了無限嵌套的問題。那是可能發(fā)生幾百個 node_modules 遞歸的場景的,太可怕了。
但這種解法,又導致了 幽靈依賴 的問題。
比如我裝個 a 包,我居然就能用 b。為什么?因為 a 依賴 b,然后 b 被裝在 node_modules 最外層,根據(jù) nodejs 找包的機制,我們就能用這個 b 庫。
如果 a 更新后不再依賴 b,b 就不會被安裝,而我們的項目剛好用到它,那就找不到然后報錯了。
另外,node_modules 下最外層的包只能有一個版本,如果某個包依賴的是其他版本,那不好意思,緩存失效,要下載另一個版本放在這個包自己的 node_modules 下。
pnpm 天然能解決這種問題,node_module 下,首先有一個 .pnpm 的文件,通過包名 + 版本號,指向唯一的全局緩存。然后 node_modules 下的包指向 .pnpm 下對應的特定版本的包。
看下圖,安裝 axios 包時帶上了它的很多依賴包,但我們用 .pnpm 做了隔離,所以訪問不到 axios 依賴的包,解決了幽靈依賴的問題。
pnpm 簡單使用
然后我們再簡單看看 pnpm 的用法。
安裝
pnpm 的安裝方法在官方文檔寫了很多。但 pnpm 其實也是 npm 下的一個包,所以我更傾向于這樣安裝:
初始化項目
不用加 -y ,pnpm 直接給你生成好一個 package.json 文件。
我覺得這個優(yōu)化是不錯的,npm init 如果忘記加上 -y,就要填好長好長的選項才能生成 package.json。說真的我覺得生成一個默認的 package.json,然后在上面改更方便,也不是像 create-react-app 那樣需要根據(jù)選項創(chuàng)建一堆文件。
安裝所有依賴
安裝指定包
你說 install 和 add 有啥區(qū)別,我也不太懂。反正我感覺都差不多。
npm 用的是 install 子命令來安裝包,一開始的版本如果不加 --save 是不會往 package.json 加上包信息的,有點坑,在 v5 后默認開啟 --save。
更新包
運行 npm script
吸收了 yarn 的優(yōu)點,簡潔。
卸載包
結尾
西瓜哥我啊,最喜歡 pnpm 了,heart heart heart。