这篇不是“谁更快”的玄学讨论,而是把团队能落地的做法一次说清:如何选型、如何统一版本、如何把镜像与缓存配好、如何在 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 冲突更易暴露 |
离线/缓存 | 基础缓存 |