Vue3 + TypeScript + vite 实现 Git 提交验证

703 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

我们在上篇 Vue3 + TypeScript + vite 实现前端代码规范化 文章中通过使用 ESLintPrettierStyleLint 实现了对代码语法和风格的统一,但上一篇所做到的格式化,都是通过运行命令的形式来检测和修复,当我们提交代码的时候,如果忘记进行检测了,是不是就会把风格不统一的代码给提交到远程仓库了,这显然是不合理的。

本文将介绍如何在提交代码的阶段,进行一些拦截验证,只有当代码符合了规则才准许提交并推送到远程仓库。

Husky

首先先来介绍一下,什么是 Husky

它可以向我们的项目中添加 Git hooks 。同时配合 lint-staged 可以方便的在代码提交前进行你想要的检测。

安装

这里需要注意下,本文所安装的 Husky7 以上的版本,在 6 之后的版本,使用方式已经和之前的不一样了,对于 6 以下版本的使用方式,这里不做过多的介绍,有兴趣的可自行去百度。

首先,我们需要安装 Husky

pnpm i husky -D

接着在 package.json 中添加 prepare 脚本

"prepare": "husky install"

prepare 脚本会在 pnpm install 之后自动执行。也就是说当我们执行 pnpm install 安装完项目依赖后会执行 husky install 命令,该命令会创建 .husky/ 目录并指定该目录为 git hooks 所在的目录。

当然,首次创建可以直接执行 pnpm i 重新跑下依赖安装,或者也可以执行 npx husky install ,这两个方法都可以创建 .husky 目录。

配置

接着需要添加 git hooks ,运行一下命令创建 git hooks

npx husky add .husky/pre-commit "npm run lint:eslint"
npx husky add .husky/pre-commit "npm run lint:format"
npx husky add .husky/pre-commit "npm run lint:style"

这样,当我们在执行 git commit 的时候,就会先去执行 npm run lint:eslintnpm run lint:formatnpm run lint:style 这三个命令了。

这里,就会出现一个问题,就是以上三个命令,是针对所有文件进行处理,这导致了有些没有更改过的文件也会去执行代码格式化,增加了一些不必要的负担,所以,我们需要进行优化,这里采用了 lint-staged 来检测暂存区的文件。

lint-staged

安装

首先需要安装 lint-staged

pnpm i lint-staged -D

配置

package.json 中添加运行命令

"lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js"

更改 .husky/pre-commit 文件的脚本

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

lint:lint-staged

接着,在 .husky 目录下创建 lintstagedrc.js 文件,并添加以下代码

module.exports = {
  '*.{js,jsx,ts,tsx}': ['eslint --fix', 'prettier --write'],
  '{!(package)*.json,*.code-snippets,.!(browserslist)*rc}': ['prettier --write--parser json'],
  'package.json': ['prettier --write'],
  '*.vue': ['prettier --write', 'stylelint --fix'],
  '*.{scss,less,styl,css,html}': ['stylelint --fix', 'prettier --write'],
  '*.md': ['prettier --write'],
  '*.hbs': ['prettier --write']
}

这样我们在 git commit 的时候,就可以看到只会修复暂存区的文件了

1649984533(1).png

Git commit 验证

这里我们继续介绍下,如何验证 git commit 的信息规范

为了保证提交信息的可读性及统一性,我们需要对提交信息进行验证,只有符合规范的提交信息,才能提交到远程仓库来。

安装

首先我们需要安装以下依赖

pnpm i @commitlint/cli @commitlint/config-conventional -D

配置

执行 npx husky add .husky/commit-msg 'npx --no-install commitlint --edit "$1"'

该命令会在 .husky 目录下生成一个 commit-msg 文件。

接着在根目录下创建 commitlint.config.js 文件,并添加以下代码

module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [
      2,
      'always',
      [
        'init', // 初始化
        'feat', // 新功能(feature)
        'fix', // 修补bug
        'docs', // 文档(documentation)
        'style', // 格式、样式(不影响代码运行的变动)
        'refactor', // 重构(即不是新增功能,也不是修改BUG的代码)
        'perf', // 优化相关,比如提升性能、体验
        'test', // 添加测试
        'build', // 编译相关的修改,对项目构建或者依赖的改动
        'ci', // 持续集成修改
        'chore', // 构建过程或辅助工具的变动
        'revert', // 回滚到上一个版本
        'workflow', // 工作流改进
        'mod', // 不确定分类的修改
        'wip', // 开发中
        'types', // 类型修改
        'release' // 版本发布
      ]
    ],
    'subject-full-stop': [0, 'never'],
    'subject-case': [0, 'never']
  }
}

rules 可以根据团队情况自行配置

配置完成之后,我们在 git commit 的时候,如果提交信息没有以上类型开头的话,是会报错的

错误提交信息

git commit -m "test"

正确提交信息

git commit -m "feat: test"

总结

一个良好的提交规范及代码规范,是保证整个项目可维护性的一个前提。

通过以上的配置,我们就可以很好的约束和统一规范了。

如果想要查看相应代码,可查看 vue-element-plus-admin