Javascript is required
Monorepo

menorepo

项目管理模式

Monorepo 这个词您可能不是首次听说,在当下大型前端项目中基于 monorepo 的解决方案已经深入人心,无论是比如 Google、Facebook,社区内部知名的开源项目 Babel、Vue-next ,还是集团中 rax-components 等等,都使用了 monorepo 方案来管理他们的代码。


monorepo是一个包含较小项目的项目,而每个项目可以是从单个应用程序到可重用包(例如功能、组件)的任何内容。组合项目的实践可以追溯到2000年初,当时它被称为共享代码库。

monorepo这个名字源于mono(single)和repo(repository)这两个词。

通常,monorepo被误认为是一个整体。然而,在单片应用程序中,所有较小的项目都合并到一个大型项目中。相反,monorepo可以将其较小的项目合并为多个项目。

就是把多个项目放在一个仓库里,如图所示,在 packages 存放多个子项目,并且每个子项目都有自己的package.json

image

可以做什么

团队协作:在具有多个团队的组织中,Monorepo 可以方便地协调跨团队的工作,确保所有相关团队可以在同一个代码库中查看和修改代码,从而提高团队间的沟通和协作。


代码共享:在 Monorepo 中,所有项目和库都存放在一个仓库中,使得共享代码和资源变得更简单。·这有助于减少重复代码,并促进了代码重用和一致性。

组件库


统一构建和部署:Monorepo 可以简化构建、测试和部署过程。通过单一仓库管理,可以实现统一的构建和部署流程,降低维护成本。


依赖管理:在单一仓库中,所有项目和库的依赖关系都在同一个地方管理,这有助于简化依赖管理。这使得跟踪、升级和修复依赖关系变得更加容易,降低了因依赖关系引起的问题风险。


常用的方案

lerna

https://github.com/lerna/lerna

pnpm workspace

yarn workspace

turbo

https://turbo.build/

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 的优势》

https://github.com/ascoders/weekly/blob/master/%E5%89%8D%E6%B2%BF%E6%8A%80%E6%9C%AF/102.%E7%B2%BE%E8%AF%BB%E3%80%8AMonorepo%20%E7%9A%84%E4%BC%98%E5%8A%BF%E3%80%8B.md