pnpm改造替換npm

Q: 為什么要遷移pnpm馅巷?

相比于npm膛虫,pnpm有一些優(yōu)勢:

  1. 更快的安裝速度: 在安裝包時,pnpm使用了硬鏈接的方式钓猬,將已安裝的包鏈接到新的目錄下稍刀,而不是復制或下載包。這樣,當你安裝一個包的不同版本或者不同項目使用同一個包時账月,它們會共享已經(jīng)安裝的包综膀,減少了磁盤空間的占用,同時也加速了安裝的速度局齿。

  2. 更少的磁盤空間占用: 由于pnpm使用硬鏈接的方式共享已安裝的包剧劝,因此相比于npm,pnpm占用更少的磁盤空間抓歼。

  3. 更好的本地緩存: pnpm會緩存包的元數(shù)據(jù)和二進制文件到本地緩存中讥此,這樣再次安裝相同的包時,會從本地緩存中讀取谣妻,而不是重新下載萄喳。這樣可以提高安裝包的速度,并減少網(wǎng)絡(luò)帶寬的消耗蹋半。

  4. 更好的多項目管理: pnpm可以管理多個項目的依賴他巨,可以將相同的依賴安裝在一個公共的位置,減少磁盤空間的占用减江,并且可以快速地切換項目之間的依賴關(guān)系染突。

  5. 更好的可重復性: pnpm使用了鎖文件來保證安裝包的版本一致性,同時也支持自定義的鎖文件名稱和路徑辈灼。這樣可以確保項目在不同的環(huán)境中的安裝結(jié)果一致觉痛,增強了可重復性。

需要注意的是茵休,pnpm相比于npm也存在一些缺點薪棒,例如兼容性問題、社區(qū)支持不如npm等榕莺。因此俐芯,在選擇使用pnpm還是npm時,需要根據(jù)自己的實際需求和項目情況進行權(quán)衡钉鸯。

Q: 上面提到的硬鏈接和符號鏈接是什么吧史?

硬鏈接和符號鏈接都是文件系統(tǒng)中的鏈接方式,它們的作用是可以將一個文件或目錄鏈接到另一個文件或目錄上唠雕,從而實現(xiàn)共享或復制等功能贸营。下面我來簡單介紹一下它們的區(qū)別和示例。

硬鏈接

硬鏈接是指在文件系統(tǒng)中岩睁,將一個文件名鏈接到另一個文件上钞脂,使它們指向同一個物理數(shù)據(jù)塊,也就是說捕儒,這兩個文件名共享同一個inode節(jié)點冰啃。硬鏈接的本質(zhì)是將一個文件名指向一個已存在的文件邓夕。

硬鏈接的特點:

  • 硬鏈接不能跨越不同的文件系統(tǒng),因為inode節(jié)點只存在于一個文件系統(tǒng)中阎毅。
  • 硬鏈接可以看作是原文件的一個副本焚刚,它們的文件權(quán)限、擁有者扇调、修改時間等都是相同的矿咕。
  • 刪除硬鏈接并不會刪除原文件,只有當所有的硬鏈接都被刪除后狼钮,原文件才會被真正刪除痴腌。

下面是一個硬鏈接的示例:

$ touch file1 # 創(chuàng)建一個文件
$ ln file1 file2 # 創(chuàng)建硬鏈接
$ ls -li file* # 查看文件inode節(jié)點
12345 -rw-r--r-- 2 user user 0 Apr 26 10:00 file1
12345 -rw-r--r-- 2 user user 0 Apr 26 10:00 file2

可以看到,file1和file2的inode節(jié)點是相同的燃领,說明它們共享同一個物理數(shù)據(jù)塊士聪。

符號鏈接

也稱之為軟鏈接,符號鏈接是指在文件系統(tǒng)中猛蔽,創(chuàng)建一個特殊的文件剥悟,其中包含了另一個文件的路徑,通過這個特殊文件來鏈接到目標文件曼库。符號鏈接的本質(zhì)是將一個文件名指向一個路徑区岗。

符號鏈接的特點:

  • 符號鏈接可以跨越不同的文件系統(tǒng),因為它們只是一個指向文件或目錄的路徑毁枯。
  • 符號鏈接指向的是目標文件或目錄的路徑慈缔,而不是inode節(jié)點,因此种玛,目標文件或目錄的屬性信息可以獨立于符號鏈接存在藐鹤。
  • 刪除符號鏈接不會影響目標文件或目錄,也不會刪除它們赂韵。

下面是一個符號鏈接的示例:

$ touch file1 # 創(chuàng)建一個文件
$ ln -s file1 file2 # 創(chuàng)建符號鏈接
$ ls -li file* # 查看文件inode節(jié)點
12345 -rw-r--r-- 1 user user 0 Apr 26 10:00 file1
67890 lrwxr-xr-x 1 user user 5 Apr 26 10:01 file2 -> file1

可以看到娱节,file2是一個符號鏈接文件,它的inode節(jié)點和file1不同祭示,而是一個指向file1的路徑肄满。

Q: 看到一些文章里說pnpm走的是硬鏈接,有的說用了軟連接质涛。到底走的是什么稠歉?

其實,pnpm是軟連接和硬鏈接都用了汇陆∨ǎ可以這么理解,pnpm在機器上某個地方存放安裝好的所有依賴包瞬测,這些依賴包是獨立于我們代碼倉庫的横媚,這也是前面說的pnpm在安裝速度和磁盤空間占用上的優(yōu)點。而我們的代碼庫確實是先通過硬鏈接的方式來建立代碼庫和已安裝過的依賴包之間的共享關(guān)系月趟〉坪可以打開代碼庫看到node_modules下有一個.pnpm文件夾,里面放的就是當前代碼庫建立的硬鏈接孝宗。

1.png

.pnpm下的文件都是一些名字很長的穷躁,長這樣:

2.png

這里不用關(guān)心具體是什么,我們需要關(guān)心的是node_mpdules下我們認識的npm依賴包因妇,它們正是通過軟連接的方式來鏈接到.pnpm下的這些依賴包的问潭。在vscode下,可以明顯看到npm包后面的軟連接標識:

3.png

如果想看一下這些軟連接到底指向哪里的婚被,可以:

# 進入node_modules目錄
cd node_modules

# 枚舉文件列表
ll
4.png

可以看到狡忙,這就是node_modules下軟鏈接到.pnpm下的。

Q: 這個模式跟npm dedupe是不是很相似址芯,有什么不同灾茁?

pnpm的硬鏈接模式和npm的dedupe功能是類似的,都是通過共享已安裝的包來減少磁盤空間的占用谷炸,同時也可以提高安裝包的速度北专。但它們之間還是存在一些不同:

  1. 原理不同: pnpm使用硬鏈接的方式共享已安裝的包,而npm使用的是符號鏈接的方式共享已安裝的包旬陡。硬鏈接是文件系統(tǒng)的一種特殊鏈接拓颓,它可以將一個文件鏈接到另一個文件上,使它們共享相同的內(nèi)容描孟。符號鏈接則是一個指向另一個文件或目錄的特殊文件驶睦。

  2. 適用范圍不同: pnpm的硬鏈接模式可以在多個項目之間共享已安裝的包,而npm的dedupe功能只能在單個項目內(nèi)共享已安裝的包匿醒。

  3. 優(yōu)勢不同: pnpm的硬鏈接模式可以減少磁盤空間的占用和提高安裝包的速度啥繁,而npm的dedupe功能只能減少磁盤空間的占用。

  4. 實現(xiàn)方式不同: pnpm使用了自己的包管理器和包存儲庫青抛,而npm使用了公共的包管理器和包存儲庫旗闽。這也是導致它們之間存在差異的一個重要原因。

需要注意的是蜜另,無論是使用pnpm的硬鏈接模式還是npm的dedupe功能适室,都需要謹慎使用,以避免出現(xiàn)意外的錯誤举瑰。特別是在使用硬鏈接模式時捣辆,如果多個項目共享同一個包,需要注意不要在一個項目中修改了該包的文件此迅,導致其他項目也受到影響汽畴。

Q: pnpm對于node版本有要求嗎?

pnpm有對node版本的要求旧巾。官方文檔中列出的最低支持版本是Node.js 10.x,推薦使用的版本是Node.js 14.x忍些。如果使用的是較舊的Node.js版本鲁猩,可能會導致安裝和使用pnpm時出現(xiàn)錯誤。

我這里本來用的是Node14.x罢坝。因為其他原因廓握,本次也給Node升級到16.x了。

Q: pnpm有類似npm ci的命令嗎嘁酿?

補充:npm ci主要是用于剛剛在download了一個倉庫后隙券,還沒有node_modules的時候讓npm完全根據(jù)package.json和package-lock.json的規(guī)范來install依賴包。相比較于直接走npm i闹司,npm ci會帶來更精確的小版本版本號控制娱仔,因為npm i對于一些"^1.0.2"這樣的版本號,可能會按照1.x.x這樣的規(guī)范給你無感升級了游桩,造成和之前某些包版本號之間的差異拟枚。
但是當本地已有node_modules的時候,就沒辦法用npm ci命令了众弓。

是的恩溅,pnpm也有類似 npm ci 命令的功能,可以使用 pnpm install --frozen-lockfile 命令實現(xiàn)谓娃。它會根據(jù) package-lock.jsonpnpm-lock.yaml 確定依賴關(guān)系脚乡,并且在安裝期間不會更新任何包。此命令類似于 npm ciyarn install --frozen-lockfile 命令滨达。

Q: pnpm@7搭配husky@8后commit一直失敗怎么辦奶稠?

這是因為hooks出問題了。某些代碼庫里會在commit時候會添加一些hook用來處理commit相關(guān)的事務(wù),比如生成commit-id之類的。

husky@8后需要處理一下這個:

husky add .husky/commit-msg 'sh .git/hooks/commit-msg "$@"'

手動把之前.git/hooks下的腳本拷貝到.husky下推盛。

友情提示:.git和.husky一般都是在項目根目錄下的隱藏文件夾喲~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市辆飘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谓传,老刑警劉巖蜈项,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異续挟,居然都是意外死亡紧卒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門诗祸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跑芳,“玉大人轴总,你說我怎么就攤上這事〔└觯” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵坡倔,是天一觀的道長漂佩。 經(jīng)常有香客問我征堪,道長球碉,這世上最難降的妖魔是什么肛度? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮冠骄,結(jié)果婚禮上伪煤,老公的妹妹穿的比我還像新娘。我一直安慰自己凛辣,他們只是感情好抱既,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扁誓,像睡著了一般防泵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蝗敢,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天捷泞,我揣著相機與錄音,去河邊找鬼前普。 笑死肚邢,一個胖子當著我的面吹牛壹堰,可吹牛的內(nèi)容都是我干的拭卿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼贱纠,長吁一口氣:“原來是場噩夢啊……” “哼峻厚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谆焊,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤惠桃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后辖试,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辜王,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年罐孝,在試婚紗的時候發(fā)現(xiàn)自己被綠了呐馆。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡莲兢,死狀恐怖汹来,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情改艇,我是刑警寧澤收班,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站谒兄,受9級特大地震影響摔桦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜承疲,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一邻耕、第九天 我趴在偏房一處隱蔽的房頂上張望瘦穆。 院中可真熱鬧,春花似錦赊豌、人聲如沸扛或。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熙兔。三九已至,卻和暖如春艾恼,著一層夾襖步出監(jiān)牢的瞬間住涉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工钠绍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舆声,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓柳爽,卻偏偏與公主長得像媳握,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子磷脯,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容