很多前端开源项目都会采用 monorepo 的方式来管理,比如前段时间我提交 PR 的项目 LogicFlow,用的是 lerna + workspaces 来进行项目管理,使得代码引用非常方便。
平常公司开发项目其实也用得到,最近单位开发一个项目,包含边端和中心端两个工程,使用的 UI 库、积累的组件库、公共方法等,很多都是共用的,也计划采用 monorepo 的方式来组织代码,这样可以省去很多麻烦。
以下是我整理的搭建 monorepo 的操作步骤,采用的是 pnpm workspaces 方案
一.环境搭建
首先使用 nvm 切换 node 版本为 16.20.0,对应安装 pnpm8 的版本
1.1 新建 monorepo-vue 文件夹
1.2 初始化项目
1 | pnpm init |
会新增一个 package.json 文件,删掉里面的 mian、test
![14](/img/14.png)
1.3 创建 pnpm-workspace.yaml 文件
1 | packages: |
1.4 创建目录 common、packages
1 | mkdir common |
1 | mkdir packages |
1.5 进入 packages 创建多个 vue 项目
1 | npm init vite@latest |
分别创建名为 app-base、app1、app2 的 vue 项目
![15](/img/15.png)
1.6 在根目录的 package.json 增加 scripts、dependencies、devDependencies
scripts、dependencies、devDependencies 这三个属性,可以在 packages 里随便一个项目的 package.json 复制过来;
然后再删掉 packages 下三个项目的 packages.json 下的 dependencies、devDependencies
1.7 根目录下安装依赖
运行安装命令,会自动安装子项目依赖
1 | pnpm i |
1.8 提取.gitignore 文件到根目录
同时 packages 下三个项目的.gitignore 删掉
1.9 代码格式化配置
新建.prettierrc.js 文件,代码格式化
1 | module.exports = { |
1.10 启动项目
分别在 app-base、app1、app2 的 vite.config.ts 中设置端口号
1 | server: { |
在根目录下 package.json 配置启动命令
![16](/img/16.png)
启动对应的项目(以 app-base 为例,其他两个同理)
1 | pnpm run dev-base |
二、搭建公共组件库
![17](/img/17.png)
2.1 common/components/assets/vue.svg
随便放一张图片
2.2 common/components/snow/index.vue
1 | <template> |
2.3 common/components/index.ts
1 | import Snow from "./snow/index.vue"; |
2.4 common/utils/index.ts
1 | export const aa = () => { |
2.5 common/index.ts
1 | export * from "./components/"; |
2.6 common/package.json
1 | { |
因为有 devDependencies,所以在根目录再执行一遍 pnpm i
2.7 上一步安装了 ts 后,解决 2.2 引入 vue.svg 语法报错的问题
在 common 下新增 image.d.ts
1 | /* eslint-disable */ |
在 common 下新增 tsconfig.json,并在 include 中加入 image.d.ts
1 | { |
2.8 最终的 common 目录
![18](/img/18.png)
三、引入公共组件库
3.1 根目录下,安装 workspace 依赖
1 | pnpm i @common/core -w |
执行成功后,根目录的 package.json 会被加上这一行
![19](/img/19.png)
3.2 packages 下的三个项目分别引入公共组件和方法
以 app-base 为例:packages/app-base/src/App.vue
1 | <template> |
3.3 组件引入成功,在界面正常渲染
![20](/img/20.png)
四、打包配置
在 1.10 中,在根目录下配置启动命令,然后可以在根目录下启动 packages 下的三个项目;同理,可以配置打包命令,以便在根目录下打包 packages 的三个项目,还可以将打包的文件输出到根目录
4.1 根目录安装@types/node
目的是为了下一步操作的语法支持
-save 代表安装到项目依赖 dependencies,而加上-save-dev 是安装到开发依赖 devDependencies
1 | pnpm i @types/node -w -save-dev |
![21](/img/21.png)
4.2 packages 下的三个项目配置打包路径
以 app-base 为例,在 packages/app-base/vite.config.ts 配置
1 | build: { |
![22](/img/22.png)
这样可以打包到根目录
4.3 根目录配置打包命令
1 | "build-base": "pnpm run -C packages/app-base build", |
![23](/img/23.png)
4.4 打包
首先在根目录.gitignore 加入
1 | app-base-dist |
逐个运行打包命令
1 | pnpm run build-base |
打包成功
![24](/img/24.png)