monorepo
概览
monorepo 全称 monolithic repository。即单一的代码仓库,所有的项目代码都在一个仓库中。
比如 element 仓库存放所有的组件代码,vue3 的仓库中存放所有的模块。
发展
阶段一:单仓库巨石应用,所有的代码直接放到一个仓库中,随着业务复杂度的提高,项目代码越来越多,代码的构建效率越来越低,代码的复杂度和维护成本越来越高。这种代码管理方式称之为 Monolith。
阶段二:多仓库多模块应用,将大项目拆分成多个小项目,并在多个 Git 仓库中管理,实现了模块的解耦,降低了单一大仓库的复杂度。更重要的是,每个项目可以独立测试,构建,发布,提高了整个项目的构建效率,同时项目的管理也变得简单。这种代码管理方式称之为 MultiRepo。
阶段三:单仓库多模块应用,随着业务复杂度的进一步提高,MultiRepo 的方式虽然在业务上解耦,但增加了整个项目工程管理的难度。开发者不得不同时打开多个仓库,各个仓库的依赖关系也越来越复杂,项目的构建成本随之升高。这时候,我们需要将多个仓库合并成一个仓库,但仍然保持模块的解耦,这种代码管理方式称之为 Monorepo。
场景
Monorepo 是一种项目的管理方式,并不一定所有的项目都适合用 Monorepo。对于中大型项目以及多模块项目,Monorepo 是一个不错的选择。
依赖
- 幽灵依赖
npm/yarn 安装依赖时,存在依赖提升。如果在当前目录中没有 node_modules,会一直向上查找。这导致即使 package.json 中没有声明依赖也可以使用上层项目的依赖。这种现象即为 幽灵依赖。当上层项目的依赖发生变化时,会影响到下层项目。使用 pnpm 可以很好解决这个问题。
- 重复依赖
多个项目中可能会使用到相同的依赖,如果每个项目都安装一份,会造成依赖的重复。相同版本依赖提升到 Monorepo 根目录下就可以减少冗余依赖安装。