学习 Vue3 设计模式搭建前端开源仓库

511 阅读6分钟

前言

自己陆续写了 6 个开源项目,每次维护时翻看旧代码,都忍不住用最新的构建方式重构一遍,于是在想是不是可以搞一套前端开源仓库的模板,每次想写点小程序,无需考虑构建方式,直接无脑写逻辑就可以。在翻阅了多个知名开源仓库后,觉得 Vue 的项目管理逻辑相当不错,就基于 Vue 的管理逻辑,抽离出了一套通用的前端开源仓库模板:repo-temp

Vue 仓库是怎么设计的?

下面就借助 Vue 仓库的一些功能,介绍做一个开源仓库可以有哪些可选项。

仓库的设计模式:monorepo

在版本控制系统中,monorepo(“ mono ”意思是“单一”,“repo”是“ repository ”的缩写)是一种软件开发策略,其中多个项目的代码存储在同一个存储库中。

按照上述维基百科的描述可以简单理解为,把多个 NPM 包放到同一个仓库进行管理,Vue 就是基于这种 monorepo 进行包管理的。这样做我觉得有几个的优势:

  1. 统一版本管理。Vue 把核心逻辑拆分了多个包,方便按需取用,但是如果一个包是一个仓库,每次发布新的版本时,就需要跨仓库修改依赖版本,如果使用 monorepo 的形式,就可以实现一个包发布新版本,其它包的依赖版本自动更新。
  2. 复用构建工具。多个包使用同一套构建工具,统一了工具的使用方法和版本。

仓库的包管理工具:

常用的包管理工具为:npm ,Vue 仓库强制使用了 pnpm ,关于如何强制使用哪种包管理工具,可以参考文章 《如何判断当前的 npm 包管理器?》 ,我为团队编写的构建工具也支持了 pnpm , 我认为 pnpm 的优势主要是减少重复依赖的下载,多项目的话可以节省内存空间。

旧版的 Vue 仓库使用的是 yarn ,虽然 Vue3 仓库强制使用了 pnpm ,但 yarn 还是需要安装,原因是 npm publish 发布 NPM 包的时候还是依赖 yarn 的功能。

开源许可证

在创建仓库时,如果没有选择许可证,表示任何人都不能复制、修改你的仓库,如果允许被人修改自己的项目,可以根据以下的情况选择适合自己的许可证。

作为参考,Vue 目前使用的为 MIT 许可证。

关于各个许可证的区别,可以参考 这篇文章

.gitignore

大家对这个文件应该不陌生,创建 .gitignore 文件,可以让 git 过滤指定的文件。

这里我提到 .gitignore ,是想解答一个疑惑,如果在 Github 创建前端仓库,需要选择哪个 .gitignore 模版?如果你也有这个疑问,可以在 这篇文章 找到答案。

项目打包格式

相信大家对于 ESMUMDAMDCJS 等打包格式头疼不已,这里直接给出答案,Vue 使用 rollup 主要打包出了如下格式,大家做自己的项目,以下格式也基本就满足需求了:

  • esm: 给其它打包器使用;
  • iife: 给浏览器使用;
  • cjs: 给 node.js 使用;

代码格式化

代码格式化 Vue 使用到了大家常用的 prettier 进行代码美化。

代码格式约束

Vue 使用 lint-staged 进行约束,只不过没有使用常见的 husky,而是使用了 simple-git-hooks ,在 git 提交的时候,对代码格式进行约束。

lint-staged 是用于对 git 的暂存区的文件进行操作的工具,比如可以在代码提交前执行 lint 校验,类型检查,图片优化等操作。

lint-staged 通常配合 husky 这样的 git-hooks 工具一起使用。git-hooks 用来定义一个钩子,这些钩子方法会在 git 工作流程中比如 pre-commit,commit-msg 时触发,可以把 lint-staged 放到这些钩子方法中。

单元测试

在单元测试部分,Vue 使用到了自家的 Vitest,Vitest 依赖 Vite ,适用于 Vite 基础的项目。这里我选用了 jest ,因为 jest 依赖更加简单,适用范围更广。

更新日志

在更新日志的生成与约束方面,Vue 使用到的是 conventional-changelog-cli,conventional-changelog-cli 使用的是 Angular 提交规范,对 Angular 提交信息规范陌生的同学可以在 这里 查看。

中英文 README

这里是个可选项,但建议大家写开源项目,还是准备中英文 README 文件,这对于项目的传播还是非常有帮助的。生成双语描述文件也很简单,写 2 份 README 文件,然后互相引用就可以了。

如何快速新建一个前端开源仓库

通过了解以上知识,大家就可以创建出一个和 Vue 设计模式类似的前端开源仓库了,如果你想快速上手,不想在细枝末节费时间,可以直接使用我的模板快速创建:

$ npx repo-temp init

详细的文档,点此查看

如何快速上手一个项目

这里我通过介绍我自己模板的使用方式,来带领大家如何快速上手一个开源项目。

package.json

没错,就是这个 package.json 文件,这个仓库不仅仅是发布 NPM 才能用到,对于大家从 0 开始使用一个开源仓库,这个文件就是说明书,如果你想详细了解 package.json 的所有参数,可以参考 这篇文章

想要快速上手,大家只需要查看 scripts 参数就可以了。

npm script

npm script 就是 package.jsonscripts 参数 ,这里我摘取出来:

"scripts": {
  "dev": "node scripts/dev.mjs",
  "build": "node scripts/build.mjs",
  "release": "node scripts/release.mjs",
  "test": "jest",
  "lint": "eslint --cache --ext .ts packages/*/{src,__tests__}/**.ts",
  "format": "prettier --write --cache --parser typescript "**/*.[tj]s?(x)"",
  "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
  "preinstall": "node ./scripts/preinstall.mjs",
  "postinstall": "simple-git-hooks"
},

通过以上代码,我们就可以知道:

  • 如果想运行项目,则使用 npm run dev 即可;
  • 如果想打包项目到本地,使用 npm run build 即可;
  • 如果想发布项目,使用 npm run release 即可;
  • 如果想运行单元测试,运行 npm run test 即可;
  • ....

通过上面 2 个方面,就可以快速上手一个开源项目啦。

总结

本文通过分析 Vue 仓库的设计模式,来介绍要开发一个前端开源项目,需要了解哪些可选知识。如果想要快速上手搭建一个前端开源项目,可以尝试直接使用模板 repo-temp ,大家也可以根据自己的需求,搭建一套自己的开源模板,方便后续使用。