前言
当项目在团队上开发时,总要遵循一些规范,就算使用了 tslint 或 eslint 等,但上交代码时由于没有禁止不良代码,有些人在不遵守规范时,还是会提交那么很坑的代码,让我们的项目挂了,这个时候,所以一切的代码在不经过检查,都不能信任,而这一层的把关,我交给 git 的钩子。
原理
当我们使用 git 时,都会有一个.git 的文件夹,而它底下有所有的钩子,在 hooks 目录下,我们可以看到目录下有 commit-msg.sample、pre-commit.sample 等文件,这些都是案例文件,不会执行,要想执行的话把后面的.sample 后缀去掉就可以了。
钩子执行顺序是有先后的
- 前置(pre)钩子,在动作完成前调用
- 后置(post)钩子,在动作完成后执行
而我们利用这个钩子实现提交前检查代码,不符合的,就停止提交。
安装插件
1 2 3 4 5
| npm install husky lint-staged --D
检查代码使用eslint或tslint npm install eslint --D npm install tslint --D
|
- eslint:进行 JavaScript 代码检查的基础包;
- tslint: TypeScript 代码检查的基础包;
- husky:在 .git/4 hooks 中写入 pre-commit 等脚本激活钩子,在 Git 操作时触发;
- lint-staged:参考 Git 中 staged 暂存区概念,在每次提交时只检查本次提交的文件。
使用
在 package.json 配置 husky 与 lint-staged。
tslint:
1 2 3 4 5 6 7 8 9 10 11 12
| "husky": { "hooks": { "pre-commit": "lint-staged" // pre-commit,提交前的钩子 } }, "lint-staged": { // 此处可以配置文件夹和文件类型的范围 "src/**/*.{txs,ts}": [ "tslint", // 再使用tslint "git add" // 所有通过的话执行git ] }
|
eslint:
1 2 3 4 5 6 7 8 9 10 11 12
| "husky": { "hooks": { "pre-commit": "lint-staged" // pre-commit,提交前的钩子 } }, "lint-staged": { // 此处可以配置文件夹和文件类型的范围 "src/**/*.{jsx,txs,ts,js,json,css,md}": [ "eslint --fix", // 再使用eslint进行自动修复 "git add" // 所有通过的话执行git ] }
|
至于 eslint 或 tslint 的配置,这个就需要自己百度。
tslint 例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| { "extends": "tslint", "rules": { "no-parameter-properties":false, // 禁止给类的构造函数的参数添加修饰符 "triple-equals":false, "no-debugger": true, // 禁止行尾有空格 "no-trailing-whitespace": false, "member-ordering":false, "no-this-assignment": [true, {"allowed-names": ["^self$","^that$"], "allow-destructuring": true}], // 必须使用箭头函数,除非是单独的函数声明或是命名函数 "only-arrow-functions": [ false, "allow-declarations", "allow-named-functions" ], // 禁止出现空代码块,允许 catch 是空代码块 "no-empty": [ false, "allow-empty-catch" ], // 禁止无用的类型断言 "no-unnecessary-type-assertion": false, // 使用 return; 而不是 return undefined; "return-undefined": false, // 禁止对 array 使用 for in 循环 "no-for-in-array": false, "comment-format": [true, "check-space"] // 单行注释格式化规则 } }
|
eslint 例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| { "extends": ["airbnb", "plugin:prettier/recommended"], // eslint扩展规则 "parserOptions": { "ecmaVersion": 7, "sourceType": "module", "ecmaFeatures": { "jsx": true } }, "parser": "babel-eslint",// 解决ES6 improt会报错 "env": { // eg如果不配置browser,window就会被eslint报undefined的错 "es6": true, "browser": true, "node": true }, "plugins": ["react", "jsx-a11y", "import"], "rules": { "class-methods-use-this": 0, "import/no-named-as-default": 0, "react/jsx-filename-extension": [ "error", { "extensions": [".js", ".jsx"] } ] } }
|
当然我们还可以使用 prettier 美化提交的代码。
prettier 配置资料(https://blog.csdn.net/visionke/article/details/92817269)
最后更新时间: