這篇不是“誰更快”的玄學討論,而是把團隊能落地的做法一次說清:如何選型、如何統一版本、如何把鏡像與緩存配好、如何在 CI 和 Monorepo 下穩住“可重復構建”。
一、結論先說在前
-
單倉庫 / 以穩定為先:直接用 npm(配合
npm ci
) 足夠,維護成本低,生態一等一,Node 16.10+ 搭配 Corepack 很順手。 -
Monorepo / 依賴體量大 / 追求裝包速度與磁盤復用:優先 pnpm。它的內容尋址倉庫(store)+ 硬鏈接/符號鏈接極致省盤,裝包速度很穩。
-
需要 PnP / Zero-Install / 插件擴展:選擇 Yarn Berry(Yarn 3/4)。但默認 PnP 對部分工具有適配成本,可改為
nodeLinker: node-modules
。
團隊統一的最低落地標準:
-
在
package.json
寫死包管器:{ "packageManager": "pnpm@9.0.0" } // 或 npm@10.x / yarn@4.x
-
Node 16.10+:啟用 Corepack 管理包管器版本:
corepack enable corepack prepare pnpm@9.0.0 --activate
-
提交鎖文件:
package-lock.json
/yarn.lock
/pnpm-lock.yaml
必須進倉庫。 -
CI 使用不可變安裝:
npm ci
、yarn install --immutable
、pnpm install --frozen-lockfile
。
二、npm / yarn / pnpm 差異速覽
維度 | npm | Yarn Classic(1.x) | Yarn Berry(3/4) | pnpm |
---|---|---|---|---|
鎖文件 | package-lock.json | yarn.lock | yarn.lock | pnpm-lock.yaml |
安裝模式 | npm ci 快速、干凈 | 經典 node_modules | 默認 PnP(可切回 node_modules) | 內容尋址 store + 鏈接 |
Workspaces | ? (npm 7+) | ? | ?(一流) | ?(一流) |
依賴解析 | 較寬松(npm 7+ 自動 peer) | 較寬松 | 嚴格可配置 | 嚴格,peer 沖突更易暴露 |
離線/緩存 | 基礎緩存 |