之前搞项目的时候,团队里代码风格五花八门的,看着就头疼。有的人提交代码前记得跑一下格式化和检查,有的人就直接 `git commit -m "xxx"` 完事儿了。每次代码合并(merge)前,总得有人去擦屁股,费时费力。
后来实在是受不了了,就想着得找个法子,强制大家在提交代码前就把这些检查给做了。搜了一圈,看到了 `husky` 这个东西,说是能在 git 提交的各个阶段(比如提交前、推送前)加点脚本进去跑。
动手试试
行,那就试试呗。先把它装到项目里,我用的是 npm,就跑了个:
npm install husky --save-dev
装完之后,得让 git 知道 `husky` 的存在。按照它的文档,跑了下面这个:
npx husky install
这一步会在项目里生成一个 `.husky` 的文件夹,用来放后面要加的钩子(hook)脚本。
接下来就是加钩子了。我最想要的是在提交前(pre-commit)检查代码,所以就用 `husky` 加了一个 `pre-commit` 钩子:
npx husky add .husky/pre-commit "npm run lint"
这里的 "npm run lint"
是我在 `*` 里定义好的命令,用来跑 ESLint 之类的检查。你也可以换成别的,比如跑测试啥的。
但是有个问题,每次检查都跑整个项目,太慢了,尤其项目大了以后。提交代码可能就改了几个文件,没必要全量检查。
配合 lint-staged
然后又发现了 `lint-staged` 这个玩意儿,它可以只针对你这回 `git add` 放到暂存区的文件跑检查和格式化。这不正好嘛
赶紧把它也装上:
npm install lint-staged --save-dev
装好之后,得在 `*` 里配置一下 `lint-staged`,告诉它要对哪些文件执行什么命令。大概是这样:
"lint-staged": {
".{js,jsx,ts,tsx}": "eslint --fix",
".{json,md,css}": "prettier --write"

这意思就是,对暂存区里特定后缀的文件,跑对应的命令。比如 js 文件就用 eslint 修一下,json 文件就用 prettier 格式化一下。
把之前那个 `pre-commit` 钩子里的命令改一下,让它跑 `lint-staged`:
npx husky set .husky/pre-commit "npx lint-staged"
这样,每次执行 `git commit` 的时候:
- `husky` 的 `pre-commit` 钩子会先触发。
- 钩子脚本会执行 `npx lint-staged`。
- `lint-staged` 会找到暂存区里的文件,根据 `*` 的配置,对它们跑检查和格式化。
- 如果检查出错了,比如 ESLint 报了个错,`lint-staged` 就会中断,这回提交也就失败了,还会告诉你错在哪。
- 如果检查都通过了,或者自动修复成功了,那提交就顺利进行。
效果咋样
搞完这一套之后,效果立竿见影。再也没人能把格式乱七八糟或者有明显错误的代码提交上来了。大家本地一提交,不符合规范的直接就被拦下来,自己改好了再提交就行。省了好多后面擦屁股的功夫,代码库也干净多了。
虽然一开始配置的时候稍微折腾了一下,看了看文档,试了试命令,但总的来说不算复杂。一旦配好了,后面就省心了。这玩意儿确实挺实用,推荐给还在为代码规范头疼的朋友们试试。
还没有评论,来说两句吧...