介绍
前端代码可以通过引入 ESLint 和 TypeScript 来提升一定的代码质量,但是实际执行中是否能严格执行,并没有强制保障,仅仅引入它们并不能保证程序员就不会把错误的代码提交给 Git。
husky 以及 lint-staged 的引入就是为了在 Git 提交环节去验证代码有没有严格遵守某些规范,强制所有要提交的代码必须满足要求。理想状态下,我们很难会再把一份处处报错的代码提交给 Git 了。
安装
这里我们使用 husky 和 lint-staged 以及 TypeScript 的命令为项目在 Git 提交阶段添加 Hook,保证之后的每一次代码提交都必须满足项目设置的 ESLint 规则,必须通过 TypeScript 编译器检查。
安装 husky 和 lint-staged:
1 | $ yarn add --dev husky |
之后使用
1 | npx husky add .husky/pre-commit "yarn lint-staged && tsc --skipLibCheck --noEmit" |
该命令会在 .husky 文件夹下创建 pre-commit 文件,并写入 yarn lint-staged && tsc --skipLibCheck --noEmit 命令,这是一个自定义的 Git 钩子,即在每次 Git 提交的时候都会会去执行设置的脚本,如果脚步没有执行通过,则提交会失败。
之后,在 package.json 中添加需要执行的这个脚本:
1 | "lint-staged": { |
理解
husky 的作用是可以便捷的为 Git 操作添加 Hook。Git 中的各个操作都是提供了钩子的,其文档中说明了这些 Hooks 可以放置的位置:
By default the hooks directory is $GIT_DIR/hooks, but that can be changed via the core.hooksPath configuration variable (see git-config[1]).
对于一个 Git 项目,其 .git/hooks/ 路径中可以看到一些 Hooks 的样本,默认是可以把一个自定义的 Hook 放置在此。
husky 安装后先去修改了 .git/config 文件,增加了:
1 | [core] |
这将 Hooks 的路径定向了项目目录下的 .husky 文件夹。之后,husky 将会在这个文件夹中创建 Hook。
前文中定义执行的脚本为 yarn lint-staged && tsc --skipLibCheck --noEmit。
前者是通过 lint-staged 去执行 ESLint 相关,因为对于这方面的检查,没必要每次扫描全项目,只需要改哪里检查哪里即可,这就是 lint-staged 这个库的作用。
而 tsc --skipLibCheck --noEmit 是去检查整个项目是否存在 TypeScript 相关的编译错误。这个每次提交都会扫描整个项目,原因是 TypeScript 的错误不是仅限于当前修改的文件,可能修改当前文件,导致的是其它文件使用时报错。