monorepo 是什么

要点

  • 项目刚起步时,一个前端应用、一个后端服务、几个脚本,随便放一个仓库里就能跑
  • monorepo 不是某个工具,也不是某个框架
  • 刚接触这个话题时,大家容易先想到 Git 层面:仓库会不会太大、提交记录会不会太乱、权限会不会太复杂
  • 小型静态站点未必需要 monorepo
  • 这里容易有误解:以为 monorepo 就是"所有项目丢进同一个仓库",目录随便堆

内容

1. 项目一变大,仓库结构就开始拧巴

项目刚起步时,一个前端应用、一个后端服务、几个脚本,随便放一个仓库里就能跑。

这阶段谁也不会认真想仓库结构。

问题出在项目往前发展的时候。

以 AI 应用为例。最早可能只有一个 Web 页面,后来加了 API 服务、异步 worker、共享 UI、共享类型、共享提示词、共享配置。再往后,文档站、playground、后台管理也跟着冒出来。

这时候你不是写不出来,而是改一处要追好多地方。前端加个字段,后端要跟,worker 也要认,文档里的示例还要同步。仓库一旦分散开,一个本该一次解决的改动就会拖成好几轮。

多数人第一次认真思考 monorepo,就是在这个时候

2. monorepo 就是把多个项目放回同一个仓库

不要把这个词想复杂。

monorepo 不是某个工具,也不是某个框架。它就是一种仓库组织方式:把原本分散在多个仓库里的多个项目,放回同一个仓库里管理。

NOTE

仓库指的是 git 仓库

这里说的"多个项目",可以是各种组合:

  • 一个 Web 应用 + 一个 API 服务
  • 一个移动端 + 一个后台管理
  • 多个前端应用 + 一批共享包
  • 应用、组件库、脚本工具、文档站全放一起

所以 monorepo 最先解决的不是构建速度,而是代码关系——哪些东西本来就该一起改,哪些共享逻辑本来就不该靠复制粘贴维持。monorepo 只是把这件事在仓库层面落了下来。

3. 多仓库真正难受的地方不在 Git

刚接触这个话题时,大家容易先想到 Git 层面:仓库会不会太大、提交记录会不会太乱、权限会不会太复杂。

这些是真问题,但不是日常开发里最痛的。

真正拖慢你的是这些:

  • 共享类型要手动同步,改了一边忘了另一边
  • 一个接口改完,要等多个仓库分别发版才能联调
  • 本地调试要同时开好几个项目,还得对齐版本
  • 明明是一件事,却变成好几个仓库里的好几次提交

仓库拆开以后,团队并没有更轻松——只是把一处该解决的问题分散到了好几个地方。

4. AI 应用碰到这个问题会更早

小型静态站点未必需要 monorepo。但 AI 应用天然会发展出很多层,而且这些层的关系很紧。

一套典型系统跑一段时间以后,目录大概是这样:

apps 独立运行的应用

web 用户直接访问的 Web 应用

admin 后台管理

api 接口服务

worker 任务和异步处理

packages 跨应用共享的代码

ui 共享组件

shared 共享类型和工具

prompts 共享提示词和模板

config 共享配置 重点不是目录整齐,而是这些东西本来就在一起工作。前端用共享组件和类型,API 的数据结构要和页面对齐,worker 的 AI 任务和应用层共用一套 schema,提示词模板和配置也不是只属于某一个 app。

拆散它们,协作成本马上就上来。

5. monorepo 不是把代码都塞进一个文件夹

这里容易有误解:以为 monorepo 就是"所有项目丢进同一个仓库",目录随便堆。

不是。monorepo 真正有价值的地方,在于把边界重新摆清楚

  • 哪些是独立应用
  • 哪些是共享包
  • 哪些配置应该统一
  • 哪些代码只该待在自己的业务里

monorepo 不是取消边界,而是把边界收回一个地方,重新整理一遍。

Canvas actions64%Exit zen mode

Drawing canvas 图里最值得注意的不是仓库数量变少了,而是共享那一层终于不用在多个仓库之间来回拷贝同步了。

6. 这件事背后要回答的几个问题

多数团队不是一开始就选 monorepo,而是做到中途发现继续拆着维护太累,才回头重构。

当你的项目开始同时出现这些信号:

  • 一个需求要改前端、后端和共享类型
  • 一个修复要同时动多个应用
  • 一个基础能力开始被很多地方复用
  • 一个版本升级会牵到很多子项目

那这些内容放在多个仓库里,就不是"解耦",而是把本来紧密的关系硬拆开了。

这也引出了 monorepo 后续要解决的核心问题:

  • 同一个仓库里的多个项目怎么互相引用
  • 共享代码该放在哪
  • 什么该进 apps,什么该进 packages
  • Turborepo 在这里负责什么
  • 项目多起来以后,开发、构建、缓存怎么串

这一章不会一上来堆工具命令,而是先把这些问题一层一层拆开。先把 monorepo 讲明白,后面再讲 workspace、Turborepo、共享包和任务编排。

7. 总结

monorepo 回答的是一个很实际的问题:当几个项目本来就在一起演进时,仓库要不要继续分散放着。

对 AI 应用来说,这个问题来得更早。前端、后端、worker、共享 schema、共享 UI、共享提示词,这些东西越长越紧,分散维护的成本会越来越高。

下一篇先把最容易混的几个词分开:monorepo、workspace、Turborepo 各自在做什么。