menorepo
项目管理模式
Monorepo 这个词您可能不是首次听说,在当下大型前端项目中基于 monorepo 的解决方案已经深入人心,无论是比如 Google、Facebook,社区内部知名的开源项目 Babel、Vue-next ,还是集团中 rax-components 等等,都使用了 monorepo 方案来管理他们的代码。
monorepo是一个包含较小项目的项目,而每个项目可以是从单个应用程序到可重用包(例如功能、组件)的任何内容。组合项目的实践可以追溯到2000年初,当时它被称为共享代码库。
monorepo这个名字源于mono(single)和repo(repository)这两个词。
通常,monorepo被误认为是一个整体。然而,在单片应用程序中,所有较小的项目都合并到一个大型项目中。相反,monorepo可以将其较小的项目合并为多个项目。
就是把多个项目放在一个仓库里,如图所示,在 packages 存放多个子项目,并且每个子项目都有自己的package.json
可以做什么
团队协作:在具有多个团队的组织中,Monorepo 可以方便地协调跨团队的工作,确保所有相关团队可以在同一个代码库中查看和修改代码,从而提高团队间的沟通和协作。
代码共享:在 Monorepo 中,所有项目和库都存放在一个仓库中,使得共享代码和资源变得更简单。·这有助于减少重复代码,并促进了代码重用和一致性。
组件库
统一构建和部署:Monorepo 可以简化构建、测试和部署过程。通过单一仓库管理,可以实现统一的构建和部署流程,降低维护成本。
依赖管理:在单一仓库中,所有项目和库的依赖关系都在同一个地方管理,这有助于简化依赖管理。这使得跟踪、升级和修复依赖关系变得更加容易,降低了因依赖关系引起的问题风险。
常用的方案
lerna
https://github.com/lerna/lerna
pnpm workspace
yarn workspace
turbo
https://github.com/vercel/turbo
turborepo
Vercel 宣布了 Turbopack(alpha),这是一个由 Tobias Koppers(Webpack 创建者) 创建的全新的、快速的 Rust 打包工具。
Turborepo 于 2021 年 12 月出世,是一个针对 JavaScript 和 TypeScript 代码库优化的智能 构建系统。它倡导使用 monorepo 的方式来管理你的工程,具体介绍可以去看看官方文档,官方文档上很详细,社区上也可以不少关于介绍它的文章。
它不是一个侵入式的工具,你可以在项目中渐进的引入和使用它,它通过足够的封装度,使用一些简单的配置来达到高性能的项目构建。 和esbuild一样,Turborepo也是基于go实现的工具,在语言层面上就具有一定的性能优势。
随着使用量的增加和产品需求的变化,Turborepo 决定从 Go 逐步迁移到 Rust。该迁移主要基于 Rust 的正确性、强大的生态系统以及开发人员的愉悦度等因素。Turborepo 正在采取渐进式的迁移方式,目前已经实现了 “Rust-Go-Rust Sandwich” 的状态,即 Rust 是入口点,可以选择使用 Rust 或 Go 来实现特定命令的功能。
Turborepo 还集成了其他工具,例如 Yarn workspaces 和 Lerna。
初始化
npm install turbo --global
touch turbo.json
{
"$schema": "https://turbo.build/schema.json"
}
参考
Monorepo 下的模块包设计实践
https://mp.weixin.qq.com/s/fz4kfXzVYeXrpxXGtmjGPA
Monorepo,大型前端项目管理模式实践
https://mp.weixin.qq.com/s/INaSouwWZ2br7W7V6jmPrQ
应用级 Monorepo 优化方案
https://github.com/worldzhao/blog/issues/9
精读《Monorepo 的优势》