Monorepo:让你的项目脱胎换骨,既能代码复用,又能独立部署!
本文由体验技术团队Kagol原创。 你的项目是不是正在不断膨胀,构建速度越来越慢,包体积越来越大,性能越来越慢了?
想拆分到不同的仓库中分开维护,又担心代码不方便复用?
你可能需要将项目改造成 Monorepo 啦!
我将带大家把一个现有项目改造成 Monorepo 方式,便于扩展和多项目复用。
如果你也有类似的需求,可以点赞、收藏下本文,关键时刻也许能帮上忙。
1 为什么需要做 Monorepo 改造
使用 monorepo 方式组织代码的前提是:
你有多个项目,并且需要在多个项目中复用组件和逻辑。
如果每个项目都是完全独立的,没有什么共用的代码(几乎不太可能),那也许你就不需要用 monorepo 啦。
1.1 Monorepo 的好处
使用 Monorepo 方式组织项目代码,至少有以下好处:
便于代码复用
:多个仓库都会用到的组件、工具函数、类型声明、样式等,可以放到 common 子包中,需要的仓库直接 npm install 这个子包就行,就跟 npm install 一个 npm 包一样容易。独立构建和部署
:每个子包都是一个独立的项目,有自己的 package.json 文件,独立安装依赖、独立端口和本地启动、独立测试、独立构建和部署,互不影响。降低切换成本
:由于只有单一仓库,clone 代码、切换分支、安装依赖比较方便,不用在不同文件夹之间切换。节约磁盘空间
:pnpm 天然具备 monorepo 能力,支持全局依赖管理,所有子包之间共享依赖,节约磁盘空间。方便提交PR
:由于是单仓库,增加新组件或给组件增加新特性,只需要提交一个 MR、编写一次 MR 描述、关联一次需求/缺陷单。方便代码检视
:一个完整的特性只需要统一在一个 MR 中检视,不用在多个仓库/多个 MR 之间切换。灵活便于扩展
:后续增加新的工程只需要在 packages 下增加一个子包,不需要申请新的代码仓库,也降低后续仓库维护成本,比如:配置保护分支 / GitHub Actions / 仓库标签等。
1.2 如果不用 Monorepo 会怎么样?
- 方式一: 把所有项目放到一个仓库里,创建很多文件夹,分别存放不同的项目,通过路由进行项目隔离。
这样做的好处是所有代码都在一起,代码复用方便,直接 ../
就行;而且不用创建和维护仓库,不用配置一堆流水线。
坏处也显而易见,就是项目会不断膨胀,本地启动调试会越来越慢、构建打包越来越慢,包体积越来越大,项目越来越卡,最后用户受不了纷纷弃坑。
- 方式二: 将项目拆分到不同的代码仓库进行维护。
好处是项目之间相互独立,不容易耦合,维护起来方便。
坏处就是增加了仓库维护成本、流水线创建成本,并且不方便项目之间复用代码。
不管是以上哪种方式,后续项目的演进都是麻烦不断,要么代码量膨胀、性能下降,要么重复劳动、一堆重复代码。
Monorepo 可以你帮助减少麻烦,快乐工作!
我们一起来看看具体怎么改造吧!
2 现有工程改造成 Monorepo 的步骤
假如我们已经有了一个 Vite + Vue3 工程,可以通过 npm run dev 本地启动,npm run build 进行构建。
基本步骤:
- 增加 packages 目录用于存放子包,增加 portal 子包
- 把现有工程的 src / public / package.json / vite.config.ts / tsconfig.xx.json / index.html / README.md 等项目启动和构建相关的目录和文件全部剪切到 packages/portal 目录中
- 增加 pnpm-workspace.yaml 文件配置多包路径
- 根目录增加 package.json 文件
- 执行 pnpm i 安装依赖,执行 pnpm -F portal dev 本地启动
- 将本地启动命令放到根目录的 packages.json scripts中,方便启动
2.1 创建子包
第一步就是在根目录创建 packages 目录,增加项目子包,比如项目叫:portal
root ├── packages | └── portal | ├── ... // 项目文件和目录
2.2 现有项目文件放进子包里
把现有工程的 src / public / package.json / vite.config.ts / tsconfig.xx.json / index.html / README.md 等项目启动和构建相关的目录和文件全部剪切到 packages/portal 目录中
root ├── packages | └── portal | ├── index.html | ├── package-lock.json | ├── package.json | ├── public | ├── README.md | ├── src | ├── tsconfig.app.json | ├── tsconfig.json | ├── tsconfig.node.json | └── vite.config.ts
2.3 配置 pnpm-workspace.yaml
根目录创建 pnpm-workspace.yaml
文件。
packages: - packages/**
2.4 配置 package.json
项目原来的 package.json 属于子包,需要放到 portal 子包中。
项目根目录需要创建一个新的 package.json 文件。
{ "name": "root", "private": true }
2.5 改造前后目录结构对比
2.6 验证本地启动和构建命令
执行 pnpm i 安装依赖
执行 pnpm -F portal dev 本地启动
执行 pnpm -F portal build 项目构建
如果以上命令都正常,说明本次 Monorepo 改造成功!
2.7 增加便捷命令
将本地启动命令放到根目录的 packages.json scripts 中,方便启动。
{ "name": "root", "private": true, + "scripts": { + "dev": "pnpm -F portal dev", + "build": "pnpm -F portal build", + "preview": "pnpm -F portal preview" + } }
后续启动项目:pnpm dev
构建项目:pnpm build
3 增加一个新项目 admin
在 packages 目录下执行 npm create vite admin,选择 React 框架。
执行 pnpm i 安装依赖
执行 pnpm -F admin dev 本地启动 admin 新项目
执行 pnpm -F admin build 构建 admin 新项目
两个项目同时启动了。
实现了 portal / admin 两个项目分开启动
、分开构建
、分开管理依赖
、分开测试
,互不影响,而且 portal 是 Vue 技术栈,admin 是 React 技术栈。
可以在根目录的 package.json scripts 增加对应的便捷命令。
{ "name": "root", "private": true, "scripts": { "dev": "pnpm -F portal dev", "build": "pnpm -F portal build", "preview": "pnpm -F portal preview", + "dev:admin": "pnpm -F portal dev", + "build:admin": "pnpm -F portal build", + "preview:admin": "pnpm -F portal preview" } }
改造后的 Monorepo 项目目录结构,看起来和原来差异不大,就是包了一层 packages,其实整个项目已经脱胎换骨,变成了一个更加让人"省心"的项目,项目之间的代码复用更加方便,后续维护和扩展也是非常轻松。
root ├── package.json ├── packages | ├── admin | | ├── eslint.config.js | | ├── index.html | | ├── package.json | | ├── public | | ├── README.md | | ├── src | | ├── tsconfig.app.json | | ├── tsconfig.json | | ├── tsconfig.node.json | | └── vite.config.ts | └── portal | ├── index.html | ├── package-lock.json | ├── package.json | ├── public | ├── README.md | ├── src | ├── tsconfig.app.json | ├── tsconfig.json | ├── tsconfig.node.json | └── vite.config.ts ├── pnpm-lock.yaml └── pnpm-workspace.yaml
如果有些逻辑 portal / admin 都用到了,我们可以新加一个子包:common
然后在 portal / admin 中引入 common。
pnpm -F portal i common pnpm -F admin i common
安装之后直接 import 进行使用即可。
4 总结
本文主要给大家分析了 Monorepo 方式组织项目代码的好处,以及不使用 Monorepo 可能带来的麻烦;
然后以一个 Vite + Vue3 项目为例,手把手带大家一起将它改造成 Monorepo 项目;
在此基础上,如何扩展一个新项目,并且新项目技术栈用的是 React,却可以和原来的 Vue 项目共同代码逻辑。
别犹豫了,动手实践起来吧!
最近我们新开源了一个基于 Quill 2.0 的富文本编辑器:Fluent Editor。
Fluent Editor:一个基于 Quill 2.0 的富文本编辑器,功能强大、开箱即用!
如果你正在寻找一款功能强大、开箱即用、易于扩展的开源富文本,不妨尝试下!
- 官网:https://opentiny.github.io/fluent-editor/
- 源码:https://github.com/opentiny/fluent-editor/ (欢迎 Star ⭐)
- Kagol 个人博客:https://kagol.github.io/blogs
关于 OpenTiny
GitHub:https://github.com/opentiny/tiny-vue (欢迎 Star ⭐)
官网:https://opentiny.design/tiny-vue
B站:https://space.bilibili.com/15284299
小助手微信:opentiny-official
公众号:OpenTiny

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
微软将开源 .NET 框架 Mono 捐赠给 Wine
根据 Mono 官网的最新公告,该项目已被移交给WineHQ 组织,后者是负责管理开源项目 Wine 的团队。 公告写道,WineHQ 组织将在wine-mono / Mono仓库中接管 Mono 项目上游的管理工作。现有 mono/mono 和其他 repos 中的源代码仍可继续使用,但 repos 可能会被归档。其中二进制文件的可用期长达四年。 此外,微软在 dotnet/runtime repo 中维护着 Mono 运行时的现代化分支,并一直在逐步将工作负载转移到该分支。这项工作现已完成,官方建议 Mono 的活跃用户和基于 Mono 的应用程序框架的维护者迁移到包含该分支的 .NET。 Mono 是开源的 .NET 框架实现,它允许开发者在非 Windows 平台上运行 .NET 应用程序。 Mono 最初是由 Xamarin 公司主导的自由开源项目。该项目的目标是创建一系列符合 ECMA 标准(Ecma-334 和 Ecma-335)的 .NET 工具,包括 C# 编译器和通用语言架构。 微软在 2016 年收购了 Xamarin,Xamarin 是 Mono 和其他 Xam...
- 下一篇
批量图像识别的快速遍历技巧
👆对私有云感兴趣可以进入公众号回复“私有云”哦。 一、前言 最近,不少同学在Q群中频繁提出疑问:在日常UI测试过程中,如何快速准确地识别页面上的多个元素,或在日常测试中,如何高效地遍历目标图片列表,以确认画面中是否包含特定元素?在官方交流Q群2群的lincoln同学给出了不错的方法思路,我们也获得了他的授权,现在我们一起来学习一下这个小技巧吧~ 二、方法详解 lincoln同学提供了两个方法函数,其中一个是局部查找,一个是多重查找,我们就来看看他的一个函数逻辑是怎么样的吧。 代码逻辑的核心在于快速地识别目标图像。首先,将目标图像(最好是特征鲜明、尺寸小一些)列表输入 Multiple_exists() 函数。该函数通过循环执行截图操作,每0.2秒进行一次,以最小化循环识别时间。接着将设备屏幕截图和目标图像传递给 match_in_predict_area() 函数,进行裁剪和搜索。一旦找到匹配的图像,立即将坐标信息反馈给 Multiple_exists() 函数,并最终将图像编号和位置信息返回至主函数,供进一步使用。 可以看到当日常在跑游戏ui回归或APP回归的时候可以利用起来,当一...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 2048小游戏-低调大师作品
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块