Npm 與 Yarn
npm vs Yarn vs pnpm
TL;DRnpm(預設,Node 內建)、Yarn(Facebook 出,Yarn 1 已 deprecated,Yarn Berry 重大改動)、pnpm(2026 主流,符號連結省空間 + 速度快)、Bun(全新運行時,內建 package manager)。2026 年新專案推薦 pnpm 或 Bun。
三者對比
| 項目 | npm | Yarn (Classic) | pnpm | Bun |
|---|---|---|---|---|
| 速度 | 普通 | 快 | 快 | 超快 |
| 磁碟空間 | 大(每專案複製) | 大 | 超省(symlink) | 中 |
| Lockfile | package-lock.json | yarn.lock | pnpm-lock.yaml | bun.lockb |
| Workspace | ✅(7.0+) | ✅ | ✅ 強 | ✅ |
| 維護 | ✅ Node 內建 | 維護中(Berry) | ✅ 活躍 | ✅ 新興 |
| 推薦? | OK | 漸退 | ⭐ 推薦 | 嘗鮮 |
為什麼 pnpm 省空間
npm / Yarn 的 node_modules:
project-A/node_modules/react ← 完整副本
project-B/node_modules/react ← 又一份
project-C/node_modules/react ← 再一份
pnpm 的 node_modules:
~/.pnpm-store/react@18.2.0 ← 全機唯一一份
project-A/node_modules/react ← symlink 過去
project-B/node_modules/react ← symlink 過去
project-C/node_modules/react ← symlink 過去
10 個專案差距 GB 級,跨專案 install 也快,因為已下載過直接 link。
各管理器的速度對比
| 操作 | npm | Yarn | pnpm | Bun |
|---|---|---|---|---|
| Cold install(無 cache) | 慢 | 快 | 更快 | 超快 |
| Warm install(有 cache) | 普通 | 快 | 超快 | 超快 |
| Update | 普通 | 快 | 快 | 超快 |
Bun 的 install 速度比 npm 快 5-10 倍,因為它用 Rust + 並行 + 原生 binary。
安裝 / 切換
# pnpm
npm install -g pnpm
pnpm install
pnpm add react
pnpm dev
# Bun
curl -fsSL https://bun.sh/install | bash
bun install
bun add react
bun dev
# Yarn(Classic / Berry)
npm install -g yarn # Classic 1.x(maintenance mode)
yarn set version berry # 升級到 2/3/4(Yarn Berry)
何時用哪個
2026 年建議
- 新專案 / 可改變 → pnpm(普及度高、生態完整、無痛遷移)
- 想嘗鮮 / 全 stack 都用 Bun → Bun(速度快、整合測試 / 打包)
- 遺留專案 / 公司規範 → 跟現狀走
- Yarn Classic 專案 → 考慮升 Yarn Berry 或遷移 pnpm
- 單純不想想 → npm
遷移到 pnpm 的步驟
# 1. 移除 node_modules + lockfile
rm -rf node_modules package-lock.json
# 2. 用 pnpm install
pnpm install
# 3. 把 npm scripts 替換
# package.json 中所有 "npm install" / "yarn add" 改成 "pnpm add"
大部分專案無痛遷移。少數套件假設 node_modules 是平鋪結構( "node_modules hoisting" 假設)會出問題,可以用 .npmrc 設定 shamefully-hoist=true 兜底。
常見地雷
1. 多管理器混用同一專案同時有 package-lock.json 跟 yarn.lock 是地雷。lockfile 會打架,不同人 install 出不同版本。規定團隊只用一種,把另一個 lockfile 加進 .gitignore 並刪掉。
2. 全域裝 pnpm 後 npm 也會變慢不會,pnpm 不會影響 npm 行為。但有些 hook(如 husky)會自動偵測管理器,要注意。
3. CI/CD 配置# GitHub Actions - uses: pnpm/action-setup@v3 with: { version: 9 } - run: pnpm install --frozen-lockfile別忘記加
--frozen-lockfile(等同 npm 的npm ci),確保 lockfile 不被改動。