Monorepo 就是个大坑
让你陷入无限折腾中。
monorepo 听起来很美好,多个项目作为子包放在同一个 repo 中,一般常听见的优点有:
1 、一次打开所有项目,尤其是一个人需要修改或维护多个项目(子包)时,不用来回切换编辑器,很直观。
2 、子包共享代码,如代码质量相关的 eslint 、prettier 、或跨 package 的代码等都可以给其他 pkg 的共享。
3 、类型共享,如前后端都是 ts 所写,则 types 可以共享不用重复定义或者担心迭代中产生不一致。
4 、ci/cd ,可以统一为整个 repo 做 ci/cd ,不再分散增加心智负担。
但是,monorepo 会给你带来无限的折腾。
首先,如果是跨语言的 mononrepo ,不同语言有不同的编码规范,根本不存在相同的 lint 或 prettier 。ci/cd 也相当于是独立项目要单独做,共享配置在这里没有带来任何好处的提升。
其次是,即使你是相同语言的 monorepo ,前期在项目架构时候也会让你消耗很多精力。
你需要创建 packages/prettier-config, packages/eslint-config...等等共享配置。
每次创建一个其他 package 你需要修改配置文件使用这些共享配置。
另外就是不同子包有不同的 eslint 配置,如 nextjs 和普通的 reactjs 项目就有不同的配置,你要么在 eslint-config 中再来一份针对 nextjs 的配置,然后修改 apps/web 引用,要么就干脆直接继承 eslint-config 再扩展 nextjs 官方推荐的配置。
这个过程非常折腾,本身 nextjs 这类项目就是开箱即用,已经有合适的 eslint 配置,你非要提取到共享的 package 中,可能大多数情况你的 monrepo 就不存在多个 nextjs 项目共享配置的情况!
好了,此时再来一个 nestjs 作为后端 api ,还得再折腾一遍 prettier-config ,eslint-config ,毕竟你都共享配置了,必须得用不是吗?
直接把这些项目的开箱即用抛弃了。
然后你的项目中要用 tailwind 或者 shadcn-ui ,你就会重复以上步骤,陷入无限的配置折腾中。
另外就是权限怎么管理,你总不想任何人都有整个 monorepo 的代码权限吧?实习生来几天直接给你代码拷走了。
multirepo 有问题吗?
其实一点问题都没有,更好的权限权利,更内聚。
一些项目本身开箱即用,创建好就能开始写业务,不用折腾什么共享配置。
或者每个项目有一些重复代码也没有任何影响,存储空间又不费钱,但是更内聚了。
要是有需求多个 repo 代码共享,统一标准,一样可以发布私有 npm 包来实现。
项目迭代中某个 repo 重构或者换语言,都根本不用考虑其他 repo ,只要对外接口保持一致就行。
个人感觉 monorepo 带来的提升很有限,不知道 v2er 的项目用的多不多,都用在什么场景?