让你陷入无限折腾中。
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 的项目用的多不多,都用在什么场景?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.