直接回答:monorepo 的核心收益是原子变更与共享:一个 PR 同时改组件库与业务代码,跨包重构有类型系统兜底,公共配置(ESLint、TS、构建)一份维护。代价是工具链复杂度:构建顺序、缓存、发布编排都要专门方案,仓大了之后 CI 时间与 IDE 性能都会劣化。pnpm workspace 负责依赖图与安装(内容寻址存储省磁盘、符号链接严格隔离幽灵依赖),Turborepo/Nx 负责任务编排(拓扑排序执行 build/test,输入哈希做本地与远程缓存,只重跑受影响的包)。
展开解析:两者分工清晰:workspace 协议解决“本地包互相引用”,turbo 的 pipeline 定义 build 依赖 ^build(先构建依赖包)并缓存 dist 产物,CI 上 cache hit 率常超 80%。落地要点:包边界即发布边界,内部包用 workspace:* 协议引用并在发布时替换版本;共享 tsconfig 用 extends 继承而非复制;类型检查与构建分层(tsc 出声明、esbuild/rollup 出产物);变更集管理(changesets)自动生成 changelog 与版本联动,避免手工升版的冲突地狱。常见陷阱:跨包 devDependencies 不一致导致“我这能跑”;根目录脚本蔓延成新泥沼;为了共享而共享——两个包共用三行代码就建 common 包,依赖边比代码还贵。决策标准:包间有真实的代码流动与联合发布需求才上 monorepo,否则多仓库 + npm 包更简单。
追问方向:幽灵依赖是什么、pnpm 如何根治?turbo 远程缓存的正确性怎么保证?
(约 490 字)