原来前端项目结构如下:
- UI组件库:sipa-ui;
- 中台SDK:sipa-boot-sdk-js;
- 单点登录:sso-pc;
- 流程中台:process-pc;
- 大后台:ams-pc。
sipa-ui和sipa-boot-sdk-js在本文中统称为 依赖库。
统一node版本,统一包管理工具
老项目都是Node 16 + Yarn,稍微近一点的项目都是Node 18 + Pnpm,首先我们需要将Node 16 + Yarn升级到Node 18 + Pnpm,这里不阐述了,有报错解决报错就行了。
创建monorepo工程
通过create-turbo脚手架创建工程
1 | pnpm dlx create-turbo@latest |
将依赖库复制到packages,将其它项目复制到apps下。
修改依赖库版本
1 | { |
monorepo的好处
使用monorepo的好处之一是依赖库修改后,不需要打包,对应的app直接引用源文件,直接编译并且热更新到浏览器。
早期我们在做js工程化(组件库&sdk),都是打包成umd或者cjs格式,然后发布到私仓中,项目直接通过dependency引用。
每次依赖库更新时,都需要手动升级版本号并重新安装依赖,流程繁琐。
在使用monorepo工程架构的情况下,很多情况我们可能都不需要发布依赖库。
幸运的是,依赖库已经配置了源文件变更自动编译的脚本。
这样我们可以专门做一个turborepo task,将依赖库这些任务全部一次性运行起来。
创建依赖库 turborepo 任务
修改项目根目录下的package.json,增加一个script
1 | { |
修改turborepo配置文件,增加依赖库开发编译任务
1 | { |
依赖库增加watch-build script
复制 变化编译 脚本
sipa-boot-sdk-js
1 | { |
sipa-ui
1 | { |
运行
我们先启动依赖库,然后再启动中后台
1 | # 窗口1 启动依赖库 |
总结
通过 Monorepo 改造,我们实现了依赖库的实时联动开发,减少了重复构建和版本管理的成本,提升了开发效率。
技术债
由于依赖库都是用ts写的,中后台全部都是用js写的,如果要改造成依赖库不编译,项目直接引用依赖库源文件,要费点时间。
而且中后台都是vue2,就不折腾了。
如果后期有新的大型项目要启动,可以重新再搭一个更多更新技术的中后台。
插曲
很早就看到monorepo被前端各种库所采用,当时弄了个sipa-ui,结构就是monorepo,有core,组件文档,测试app等。
直到看到vue-vben-admin这个项目,搭配vite,感叹还能这么玩,依赖库可以拆的这么细。
最后还是要喊出那句经典的话,别更新了,学不动了! 😭