开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
回看自己的文章时,发现文章库里没有关于全局配置npm项目格式校验工具的讲解,这里补充一下。
git hooks
顾名思义,就是git在提交、推送、回溯等操作前后会触发的一系列钩子函数,详情可见 官网。在仓库中的 .git 文件夹下可以看到hook目录:
默认的 git hooks 都是 shell 脚本,只需要将 git hooks 的示例文件的 .sample 扩展名去掉,那么示例文件即可生效。原生的 git hooks 有一个比较大的问题是 .git 文件夹下的内容不会被 Git 追踪。这就表示,无法保证让一个仓库中所有的成员都使用同样的 git hooks,除非仓库的所有成员都手动同步同一份 git hooks,但这显然不是个好办法。
husky
husky可以通过全局安装的方式,让所有开发者同享同一个hook。我们直接讲述最新版本(4.x以上)的版本。
安装
npm install husky --save-dev
or
yarn add husky -D
配置 git hook
npx husky install
设置 npm 包安装后自动启用 husky
npm pkg set scripts.prepare="husky install"
现在是一个空的husky,需要告诉他要做什么,我们用他的 pre-commit 钩子,在提交前触发检测:
## 添加pre-commit
npx husky add .husky/pre-commit "yarn lint-staged --allow-empty"
git add .husky/pre-commit
这里我们用到了一个库:lint-staged。在代码提交之前,进行代码规则检查整个项目上运行lint速度会很慢,lint-staged能够让lint只检测暂存区的文件,可以提升速度;另一方面,你拉取别人的代码,如果很多地方都有格式错误,但是只修改了你的文件,你提交后理论上不应该校验你不修改的文件,lint-staged 可以让你只专注于自己改动的文件。
此时目录结构:
接下来安装 lint-staged:
yarn add -D lint-staged
接下来我们 commit 试试:
可以看到钩子已经能够触发,但是我们没有配置具体要做什么。
eslint + prettier
安装 eslint:
yarn add eslint -D
项目根目录新建 .eslintrc:
{
"env": {
"node": true,
"browser": true,
"es2021": true
},
"extends": ["eslint:recommended", "plugin:react/recommended"],
"parserOptions": {
"sourceType": "module",
"babelOptions": {
"ecmaVersion": "es2020",
"ecmaFeatures": {
"globalReturn": true,
"jsx": true
},
"lib": ["ES2020"]
}
},
"plugins": ["react"],
"settings": {
"react": {
"version": "detect"
}
},
"overrides": [
{
"files": ["*.ts", "*.tsx"],
"rules": {
"no-undef": "off"
}
}
]
}
安装 prettier:
yarn add prettier -D
项目根目录新建 .prettierrc:
{
"printWidth": 120,
"tabWidth": 2,
"useTabs": false,
"semi": true,
"singleQuote": true,
"bracketSpacing": true,
"overrides": [
{
"files": ["package.json", "yarn.lock"],
"options": {
"tabWidth": 2,
"proseWrap": "never",
"singleQuote": false
}
}
]
}
项目根目录新建 .prettierignore:
/build
node_modules
/public
/scripts
统一使用 lint-staged 管理:
// package.json
"lint-staged": {
"src/**/*.{js,jsx,ts,tsx}": [
"eslint --fix",
"yarn prettier -w"
]
},
我这里配置的检测路径是 src 下的文件。我们试着改动一下文件,变更如下:
然后 commit 看看效果:
可以看到校验已经出来了,我这里 eslint 报错是因为 eslint-plugin-react 没有安装(vue和ng项目会有另外的提示,按照需求安装就好)
yarn add -D eslint-plugin-react
安装以后再执行:
此时就进入正常的校验错误的模式了,修改完提示的错误后再次 commit,就可以看到成功界面了:
此时再看刚刚改乱格式的文件,发现格式化已经做好了:
指令速查
- yarn add husky -D
- npx husky install
- npm pkg set scripts.prepare="husky install"
- npx husky add .husky/pre-commit "yarn lint-staged --allow-empty"
- git add .husky/pre-commit
- yarn add -D lint-staged
- yarn add eslint -D
- yarn add prettier -D
- react必须:yarn add -D eslint-plugin-react
- 添加文件:
.eslintrc.prettierrc.prettierignore
完!