项目越写越大,我是这样做拆分的
写作背景:
在几年前的一次 Vue 项目改造中利用原生+H5 的形式按模块菜单来拆分了多个 Vue 项目,在拆分时考虑到多项目维护带来的成本较大,我们将项目公共使用到的资源提升到项目 root 目录下,将子项目抽取为模板通过定制的脚手架创建每个子项目到 modules 下,并且支持单独打包、单独发布。这样项目结构的好处同时避免了项目庞大带来的首屏加载时间长,也避免了多人开发出现冲突的造成的矛盾。这样的项目结构在现在看来很多项目都有在使用,比如 Vue、Vite 等,它们共同使用到的 PNPM 的包管理器来组织这样的项目。同时我也在 B 站发现有伙伴使用 PNPM 组建了包含 PC 前端、PC 后端、H5 前端这样的项目模板。我们一起来搞一搞~
PNPM 介绍:
PNPM 的特点:
节约磁盘空间并提升安装速度;
创建非扁平化的 node_modules 文件夹。
PNPM 与 NodeJs 版本支持:
上述表格来自:;
PNPM 与其他包管理功能对比:
上述表格来自:;
安装 PNPM:
快速开始命令:
在项目 root 目录安装所有依赖:
pnpm install
;在项目 root 目录安装指定依赖:
pnpm add <pkg>
;在项目 root 目录运行 CMD 命令:
pnpm <cmd>
;在特定子集运行 CMD 命令:
pnpm -F <package_selector> <command>
;
一起搞起来:
利用 vue@3 模板来创建 root 项目:
定义工作空间目录结构
使用 **pnpm **管理的项目支持在 **root **目录下使用 pnpm-workspace.yaml
文件来定义工作空间目录
使用 vite 来初始化公共模块:
使用 vite 内置的基础项目模板创建 apis、utils 两个公共模块
创建 apis 项目:
创建 utils 项目:
调整 apis、utils 的项目名称和版本号:
使用 vite 来初始化业务模块:
业务模块创建到 packages 目录下,创建命令同上一小节,我们这次改用 vite 内置的 vue-ts 模板
创建三个 module 项目,整体的目录大致结构如下:
调整三个模块项目的名称和版本号
统一包管理器的使用:
在创建的各模块的 package.json
中增加一条script
,内容如下:
开发 utils 模块:
开发 Clipboard 工具类(支持移动端和 PC 端两种提示风格):
准备 Clipboard 工具类:
配置相关依赖:
安装
vueuse
依赖库,监听屏幕变化;安装
clipboard
依赖库,完成粘贴板基础功能;安装
element-plus
PC 风格组件库;安装
vant
移动端风格组件库;安装
vue
依赖库,因提示 Issues with peer dependencies found,就先装上。
完善 Clipboard 工具类以支持不同风格提示:
utils\src\clipboard.ts
导出工具类的相关配置:
配置统一导出文件(
utils\index.ts
):
修改
package.json
的main
字段:
将 utils 模块安装到 module1 项目:
下面的命令在 root 目录执行,通过
-F
来执行命令执行的位置是@it200/module1
,执行的命令是add
。
注:当@it200/utils
包升级后,执行执行pnpm update
来更新相关依赖版本。
安装成功后的依赖信息如下:
在 module1 项目中尝试使用 Clipboard 函数:
在模板中增加按钮:
在
setup
的script
中增加对应函数并导入handleClipboard
:
PC 端复制成功后提示风格:
移动端复制成功后提示风格:
开发 apis 模块:
开发 axios 工具类函数:
准备 axios 工具类:
配置相关依赖:
安装
axios
依赖库,完成数据请求的发送及处理;安装
vant
依赖库,完成请求数据后的状态提示等。
说明:在apis
模块中就不再做手机端和 PC 端的风格切换了;
完善 axios 工具类:
apis\src\axios.ts,部分逻辑有删减,仅保证基础功能正常
编写 userApi 类,汇总关于 user 对象的数据读取:
apis\src\user.ts
导出 userApi 类的相关配置:
配置统一导出文件(
apis\index.ts
):
修改
package.json
的main
字段:
在 module2 项目中尝试使用 userApi 类:
定义模板:
安装、导入、编写逻辑:
使用Mockend来 Mock 数据:
选择一个符合自己的方案:
选择要安装到得公共项目仓库,Github 组织不支持免费的(只为截个图):
在项目 root 目录新建
.mockend.json
文件:
通过 https://mockend.com/OSpoon/data-mock/users 就可以获取到 mock 数据了;
更多配置请参考。
开发 Components 模块:
开发 Card 组件,并应用到 module3 项目中:
使用 pnpm create vue@3 来创建项目模板,修改项目名称和版本号:
创建如下 card 组件目录结构:
组件模板及配置:
组件名称通过 defineComponent 函数导入,在注册组件时读取使用
组件样式文件:
组件安装插件:
在 Components 项目中尝试使用 Card 组件:
导入组件相关配置并安装,
components\src\main.ts
在
App.vue
组件中使用:
准备导入组件的相关配置:
配置统一导出文件:
修改
package.json
的main
字段:
安装、导入到 module3:
安装
components
组件包:
导入
components
组件包:
使用方式同在 Components 项目中验证一样,效果一样,就不再演示了。
扩展(Changesets 发布变更):
增加相关配置:
安装
changesets
到工作空间根目录:
执行
changesets
初始化命令:
生成新的 changesets:
注意:第一次运行前请检查git
分支名称和.changeset\config.json
中的baseBranch
是否一致。
生成示例:
发布变更:
执行命令,会依据先前生成的变更集来在对应的package
中的项目中生成对应的CHANGELOG.md
并提高对应项目的version
,版本提升还需遵守语义化版本规范要求:
后续的步骤还需按项目的实际情况来考虑,这里将变更日志生成、版本号提升后就先告一段落了~
总结:
这里使用了工作空间的概念来实现了大项目的拆分工作,每一个单独的模块、项目都可以独立维护、测试、构建,同时在 pnpm 的 node_modules 管理模式下节约了磁盘空间并提升安装速度。在这里只是小试牛刀,更多的特性还没有体现出来,需要后续跟进学习。项目的拆分和搭建没有特别的约定要做的一模一样,符合实际情况的考虑就是最优。
版权声明: 本文为 InfoQ 作者【小鑫同学】的原创文章。
原文链接:【http://xie.infoq.cn/article/26d3ecf7b9f5cdffc5afb8721】。文章转载请联系作者。
评论