Monorepo 的对立面是 Multirepo——每个包一个仓库、各自发版。单体仓库的好处是原子化协作:跨包重构一次提交搞定、公共配置(eslint/tsconfig/CI)统一维护、工具链版本一致、本地联调直接链接源码无需发包。坏处是单仓库体积膨胀、权限管理粗、对构建缓存要求高。规模上去之后,跨包版本一致性、变更影响分析与统一发版节奏,反过来又是 Multirepo 很难低成本提供的能力。
它的成败完全取决于工具链是否到位。pnpm 用符号链接解决了幽灵依赖并天然支持 workspace;Turborepo/Nx 提供任务编排与远程缓存,让「只跑变动过的任务」成为可能。工具链跟不上时,Monorepo 就会退化成「多个项目硬塞一个仓库」的灾难。所以判断要不要上 Monorepo,本质是判断团队能否持续投入维护这套基础设施,而不是看别人都在用。
// pnpm-workspace.yaml —— 声明 monorepo 工作区 packages: - 'apps/*' # apps/web、apps/admin - 'packages/*' # packages/ui、packages/utils // 跨包引用(apps/web/package.json) { "dependencies": { "@my/ui": "workspace:*" // 始终指向本地源码 } } // 常用命令(仓库根目录执行): // pnpm i -r 一次性给所有包安装依赖 // pnpm --filter @my/ui build 只构建 ui 包 // pnpm -r run build 并行构建全部包(配合 turbo 缓存更好)