pnpm 對決 npm:開發者必知的五大優勢

5 分鐘閱讀

我最喜歡問這種「why A over B」的問題了 😝

琳 avatar

why should I use pnpm instead of npm?

Felo Search avatar
Felo Search

為什麼應該使用 pnpm 而非 npm?

效能優勢

pnpm(Performant NPM)是一個比 npm 更高效的套件管理工具。它的安裝速度明顯快於 npm,特別是在處理大型專案時,pnpm 的表現可以達到比 npm 快 3 倍的效能1。這主要歸功於 pnpm 獨特的依賴項管理方式和快取策略23

磁碟空間使用效率

pnpm 採用了一種獨特的依賴項管理方法,它不會為每個專案創建單獨的套件副本,而是將所有套件存儲在全局的內容可尋址存儲中,並在專案目錄中創建符號連結2。這種方法大幅減少了重複性,節省了大量磁碟空間45

具體來說,pnpm 使用「硬連結」(hard linking)技術將套件存儲在全局倉庫中,當你下載一個依賴項時,pnpm 會先檢查該依賴項是否已存在於全局倉庫中,如果找到了,pnpm 就會通過創建硬連結來獲取它,而不是重新下載53

更嚴格的依賴解析

pnpm 實施了更嚴格的依賴解析機制,這有助於防止由版本不匹配引起的問題2。與 npm 使用的扁平化 node_modules 結構不同,pnpm 的依賴樹算法更簡單,實現和維護起來更容易,需要的計算量也更少1

npm 的扁平化依賴樹會導致一些問題:

  1. 扁平化依賴樹的算法複雜
  2. 某些套件必須在另一個專案的 node_modules 文件夾中重複
  3. 模組可以訪問它們並不依賴的套件31

工作區支援

pnpm 內建支援管理單一儲存庫中的多個套件(monorepo),這對於管理相互依賴的套件或微服務的專案非常有用23。它使用 pnpm-workspace.yaml 文件進行更靈活的工作區定義,而 npm 則使用 package.json 中的 workspaces 字段5

易於修補依賴

pnpm 允許你比 npm 更容易地「修補」(patch)你的依賴項,這是 pnpm 的一個經常被低估的優勢6

使用建議

如果你考慮從 npm 切換到 pnpm,需要注意以下幾點:

  1. pnpm 使用自己的鎖定文件(pnpm-lock.yaml),而 npm 使用 package-lock.json7
  2. 在團隊中工作時,最好所有開發者使用相同的套件管理器,否則可能會遇到問題7
  3. 可以使用 pnpm import 命令將 lockfile.json 轉換為 pnpm-lock.yaml7

結論

pnpm 是 npm 的「高效能」版本,它保留了 npm 的所有優點,同時解決了其弱點。從基準測試結果來看,pnpm 在整體表現上明顯優於 npm 和 yarn3。這就是為什麼像 Vue3、Prism 和微軟等大型科技公司正在迅速採用 pnpm 的原因3

如果你正在尋找一個更快、更節省磁碟空間且依賴管理更嚴格的套件管理器,pnpm 是一個值得考慮的選擇。無論你是獨立開發者還是大型團隊的一員,探索 pnpm 都可能對優化你的 Node.js 開發工作流程有所幫助5

  1. Choosing the Right Package Manager: NPM, Yarn, or PNPM? ↩2 ↩3

  2. pnpm vs npm - GeeksforGeeks ↩2 ↩3 ↩4

  3. Why you should prefer using pnpm over npm and yarn? | Refine ↩2 ↩3 ↩4 ↩5 ↩6

  4. Meet PNPM: The Faster, More Performant NPM | Bits and Pieces

  5. What is PNPM and why you should use it? - Peerlist ↩2 ↩3 ↩4

  6. Are you using npm or pnpm? : r/webdev - Reddit

  7. Is there any gotcha if I switch from npm to pnpm? And can I ... ↩2 ↩3