亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

pnpm對npm及yarn降維打擊詳解

 更新時間:2022年08月03日 16:39:46   作者:zxg_神說要有光  
這篇文章主要為大家介紹了pnpm對npm及yarn降維打擊原因詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

大家最近是不是經(jīng)常聽到 pnpm,我也一樣。今天研究了一下它的機制,確實厲害,對 yarn 和 npm 可以說是降維打擊。

那具體好在哪里呢? 我們一起來看一下。

我們按照包管理工具的發(fā)展歷史,從 npm2 開始講起:

npm2

用 node 版本管理工具把 node 版本降到 4,那 npm 版本就是 2.x 了。

然后找個目錄,執(zhí)行下 npm init -y,快速創(chuàng)建個 package.json。

然后執(zhí)行 npm install express,那么 express 包和它的依賴都會被下載下來:

展開 express,它也有 node_modules:

再展開幾層,每個依賴都有自己的 node_modules:

也就是說 npm2 的 node_modules 是嵌套的。

這很正常呀?有什么不對么?

這樣其實是有問題的,多個包之間難免會有公共的依賴,這樣嵌套的話,同樣的依賴會復制很多次,會占據(jù)比較大的磁盤空間。

這個還不是最大的問題,致命問題是 windows 的文件路徑最長是 260 多個字符,這樣嵌套是會超過 windows 路徑的長度限制的。

當時 npm 還沒解決,社區(qū)就出來新的解決方案了,就是 yarn:

yarn

yarn 是怎么解決依賴重復很多次,嵌套路徑過長的問題的呢?

鋪平。所有的依賴不再一層層嵌套了,而是全部在同一層,這樣也就沒有依賴重復多次的問題了,也就沒有路徑過長的問題了。

我們把 node_modules 刪了,用 yarn 再重新安裝下,執(zhí)行 yarn add express:

這時候 node_modules 就是這樣了:

全部鋪平在了一層,展開下面的包大部分是沒有二層 node_modules 的:

當然也有的包還是有 node_modules 的,比如這樣:

為什么還有嵌套呢?

因為一個包是可能有多個版本的,提升只能提升一個,所以后面再遇到相同包的不同版本,依然還是用嵌套的方式。

npm 后來升級到 3 之后,也是采用這種鋪平的方案了,和 yarn 很類似:

當然,yarn 還實現(xiàn)了 yarn.lock 來鎖定依賴版本的功能,不過這個 npm 也實現(xiàn)了。

yarn 和 npm 都采用了鋪平的方案,這種方案就沒有問題了么?

并不是,扁平化的方案也有相應的問題。

最主要的一個問題是幽靈依賴,也就是你明明沒有聲明在 dependencies 里的依賴,但在代碼里卻可以 require 進來。

這個也很容易理解,因為都鋪平了嘛,那依賴的依賴也是可以找到的。

但是這樣是有隱患的,因為沒有顯式依賴,萬一有一天別的包不依賴這個包了,那你的代碼也就不能跑了,因為你依賴這個包,但是現(xiàn)在不會被安裝了。

這就是幽靈依賴的問題。

而且還有一個問題,就是上面提到的依賴包有多個版本的時候,只會提升一個,那其余版本的包不還是復制了很多次么,依然有浪費磁盤空間的問題。

那社區(qū)有沒有解決這倆問題的思路呢?

當然有,這不是 pnpm 就出來了嘛。

那 pnpm 是怎么解決這倆問題的呢?

pnpm

回想下 npm3 和 yarn 為什么要做 node_modules 扁平化?不就是因為同樣的依賴會復制多次,并且路徑過長在 windows 下有問題么?

那如果不復制呢,比如通過 link。

首先介紹下 link,也就是軟硬連接,這是操作系統(tǒng)提供的機制,硬連接就是同一個文件的不同引用,而軟鏈接是新建一個文件,文件內(nèi)容指向另一個路徑。當然,這倆鏈接使用起來是差不多的。

如果不復制文件,只在全局倉庫保存一份 npm 包的內(nèi)容,其余的地方都 link 過去呢?

這樣不會有復制多次的磁盤空間浪費,而且也不會有路徑過長的問題。因為路徑過長的限制本質上是不能有太深的目錄層級,現(xiàn)在都是各個位置的目錄的 link,并不是同一個目錄,所以也不會有長度限制。

沒錯,pnpm 就是通過這種思路來實現(xiàn)的。

再把 node_modules 刪掉,然后用 pnpm 重新裝一遍,執(zhí)行 pnpm install。

你會發(fā)現(xiàn)它打印了這樣一句話:

包是從全局 store 硬連接到虛擬 store 的,這里的虛擬 store 就是 node_modules/.pnpm。

我們打開 node_modules 看一下:

確實不是扁平化的了,依賴了 express,那 node_modules 下就只有 express,沒有幽靈依賴。

展開 .pnpm 看一下:

所有的依賴都在這里鋪平了,都是從全局 store 硬連接過來的,然后包和包之間的依賴關系是通過軟鏈接組織的。

比如 .pnpm 下的 expresss,這些都是軟鏈接,

也就是說,所有的依賴都是從全局 store 硬連接到了 node_modules/.pnpm 下,然后之間通過軟鏈接來相互依賴。

官方給了一張原理圖,配合著看一下就明白了:

這就是 pnpm 的實現(xiàn)原理。

那么回過頭來看一下,pnpm 為什么優(yōu)秀呢?

首先,最大的優(yōu)點是節(jié)省磁盤空間呀,一個包全局只保存一份,剩下的都是軟硬連接,這得節(jié)省多少磁盤空間呀。

其次就是快,因為通過鏈接的方式而不是復制,自然會快。

這也是它所標榜的優(yōu)點:

相比 npm2 的優(yōu)點就是不會進行同樣依賴的多次復制。

相比 yarn 和 npm3+ 呢,那就是沒有幽靈依賴,也不會有沒有被提升的依賴依然復制多份的問題。

這就已經(jīng)足夠優(yōu)秀了,對 yarn 和 npm 可以說是降維打擊。

總結

pnpm 最近經(jīng)常會聽到,可以說是爆火。本文我們梳理了下它爆火的原因:

npm2 是通過嵌套的方式管理 node_modules 的,會有同樣的依賴復制多次的問題。

npm3+ 和 yarn 是通過鋪平的扁平化的方式來管理 node_modules,解決了嵌套方式的部分問題,但是引入了幽靈依賴的問題,并且同名的包只會提升一個版本的,其余的版本依然會復制多次。

pnpm 則是用了另一種方式,不再是復制了,而是都從全局 store 硬連接到 node_modules/.pnpm,然后之間通過軟鏈接來組織依賴關系。

這樣不但節(jié)省磁盤空間,也沒有幽靈依賴問題,安裝速度還快,從機制上來說完勝 npm 和 yarn。

pnpm 就是憑借這個對 npm 和 yarn 降維打擊的,更多關于pnpm降維打擊npm yarn的資料請關注腳本之家其它相關文章!

相關文章

  • 微信小程序(二十一)switch組件詳細介紹

    微信小程序(二十一)switch組件詳細介紹

    這篇文章主要介紹了微信小程序switch組件詳細介紹的相關資料,需要的朋友可以參考下
    2016-09-09
  • 前端算法題解leetcode36-有效的數(shù)獨示例

    前端算法題解leetcode36-有效的數(shù)獨示例

    這篇文章主要為大家介紹了前端算法題解leetcode36-有效的數(shù)獨示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 微信小程序 上傳頭像的實例詳解

    微信小程序 上傳頭像的實例詳解

    這篇文章主要介紹了微信小程序 上傳頭像的實例詳解的相關資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • 微信小程序 教程之注冊頁面

    微信小程序 教程之注冊頁面

    這篇文章主要介紹了微信小程序 注冊頁面的相關資料,需要的朋友可以參考下
    2016-10-10
  • vscode工具函數(shù)once使用示例深入剖析

    vscode工具函數(shù)once使用示例深入剖析

    這篇文章主要為大家介紹了vscode工具函數(shù)once使用示例深入剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • 微信小程序手勢操作之單觸摸點與多觸摸點

    微信小程序手勢操作之單觸摸點與多觸摸點

    這篇文章主要介紹了微信小程序手勢操作之單觸摸點與多觸摸點的相關資料,需要的朋友可以參考下
    2017-03-03
  • 使用preload預加載頁面資源時注意事項

    使用preload預加載頁面資源時注意事項

    本文主要介紹 preload 的使用,以及與 prefetch 的區(qū)別。然后會聊聊瀏覽器的加載優(yōu)先級,大家一定要認真看完
    2020-02-02
  • JavaScript函數(shù)柯里化

    JavaScript函數(shù)柯里化

    這篇文章主要介紹了JavaScript函數(shù)柯里化,柯里化即Currying是把接受多個參數(shù)的函數(shù)變換成接受一個單一參數(shù)函數(shù),并且返回接受余下的參數(shù)且返回結果的新函數(shù)的技術,下面文章詳細內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • 使用xml2js庫進行XML數(shù)據(jù)解析

    使用xml2js庫進行XML數(shù)據(jù)解析

    這篇文章主要為大家介紹了使用xml2js庫進行XML數(shù)據(jù)解析用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • 微信小程序 轉發(fā)功能的實現(xiàn)

    微信小程序 轉發(fā)功能的實現(xiàn)

    這篇文章主要介紹了微信小程序 轉發(fā)功能的實現(xiàn)的相關資料,這里提供實現(xiàn)方法及實例幫助大家學習理解,需要的朋友可以參考下
    2017-08-08

最新評論