主题
依赖与版本约束
Monorepo 中最容易失控的是依赖版本。建议把运行环境、第三方依赖版本、内部包依赖关系分别处理。
Node.js 与 pnpm 版本
在根目录 package.json 中声明:
json
{
"packageManager": "pnpm@11.10.0",
"engines": {
"node": ">=22.0.0",
"pnpm": ">=11.0.0"
}
}packageManager声明推荐使用的包管理器及版本,通常配合 Corepack 使用。engines声明 Node.js、pnpm 等运行环境的版本要求。packageManager推荐使用精确版本,例如"pnpm@11.10.0",减少团队环境差异。
严格校验 engines
ini
# .npmrc
engine-strict=true开启后,当前 Node.js 或 pnpm 版本不满足 engines 时,安装依赖会失败。
统一第三方依赖版本
pnpm 可使用 catalog: 协议统一管理第三方依赖版本。
yaml
# pnpm-workspace.yaml
packages:
- 'apps/*'
- 'packages/*'
catalog:
react: ^19.0.0
react-dom: ^19.0.0
typescript: ^5.0.0子包中引用:
json
{
"dependencies": {
"react": "catalog:",
"react-dom": "catalog:"
},
"devDependencies": {
"typescript": "catalog:"
}
}这样升级 React、TypeScript 等公共依赖时,只需修改一处。
内部 package 依赖
Workspace 内部 package 之间建议使用 workspace: 协议:
json
{
"name": "@vfan-monorepo/web",
"dependencies": {
"@vfan-monorepo/ui": "workspace:*",
"@vfan-monorepo/utils": "workspace:*"
}
}workspace:* 表示该依赖必须从当前 Workspace 中解析。如果本地不存在对应 package,安装会失败,不会回退到 npm registry。
也可以使用:
json
{
"dependencies": {
"@vfan-monorepo/ui": "workspace:^",
"@vfan-monorepo/utils": "workspace:~"
}
}发布 package 时,pnpm 会将 workspace: 版本转换为实际 semver 版本范围。
依赖声明原则
- 子包用到的依赖,必须声明在该子包中。
- 根目录只声明仓库级工具,不替子包隐式兜底。
- 共享库里的框架依赖通常放在
peerDependencies,避免和应用安装多份。 - 能用
catalog:统一的公共依赖,优先在pnpm-workspace.yaml中集中维护。
