ESLint + Prettier + Husky + lint-staged 打造代码检查工作流
记录搭建代码检查工作流的相关问题
基本介绍
- ESLint
- 代码检查工具
- 特点
- 代码静态检查
- 提前发现低级语法错误
- 代码风格检查
- 检查代码风格
- 代码静态检查
- 关于
eslint
的配置可以查阅我之前的文章,有详细解释
- Prettier
- 代码格式化工具
- 特点
- 有一套自己的格式化规范
- 基本支持前端涉及的所有语言
js、jsx、css、html、md等等
- ESLint、Prettier 二者异同
eslint
还是侧重于代码静态检查、prettier
侧重于代码格式化eslint
使用--fix
也可以根据特定代码风格进行一些格式化工作;
- Husky
- 在
git
中提供precommit、prepush
钩子,可在其中执行一些脚本
- 在
- lint-staged
- 可针对添加到
git 暂存区
中不同格式的文件,分别执行不同的脚本
- 可针对添加到
工具介绍
ESLint 相关
- 通过
npm install eslint
安装的- 可以用来执行
eslint 命令
- 如
eslint --fix
、eslitn --ext .js,.vue src
- 如
- 通过
webpack
中的eslint-loader
可以实现保存时自动修复
- 可以用来执行
VSCode
中的扩展ESLint
- 它会读取项目中的
eslint 配置文件
,然后启动一个lint服务
,在vscode
中智能提示不符合项目eslint 配置
的代码 - 通过配置
eslint.autoFixOnSave
,可以实现保存时,根据配置文件规则,自动修复一些代码问题(大部分都是一些代码风格相关的问题)
- 它会读取项目中的
eslint-loader
- 在
webpack
中配合eslint
使用的loader
- 通过配置可实现在每次打包时,自动 lint;如用 vue-cli2.x 初始化的项目中下面代码
- 在
1 | module:{ |
eslint-friendly-formatter
- 可以输出更友好的错误提示;如包含违反规则的文件地址和规则解释网址
Prettier 相关
- 通过
npm install prettier
安装的prettier cli
- 可以调用
prettier
的一些命令;如prettier --wirte test.js
来实现test.js
的格式化- 更多命令可查看
https://prettier.io/docs/en/cli.html
- 更多命令可查看
- 会读取项目中的
.pretterrc
配置文件
- 可以调用
VSCode
中的扩展Prettier
- 本质是内部调用
pretter-cli
- 此扩展内部内置了
prettier
格式化规则,不过只暴露了极少的配置选项。 - 配置读取优先级
- 会优先读取
.prettierrc
文件 - 不存在则读取
.editorconfig
文件 - 其次读取插件自身配置选项
- 会优先读取
- 可以配合
ESLint、TSLint
使用- 有
prettier.eslintIntegration
选项- 设置为
true
后,内部会使用eslint-prettier
替换prettier-cli
eslint-pretter
- 会将格式化的代码传递给
eslint --fix
- Code ➡️ prettier ➡️ eslint –fix ➡️ Formatted Code
- 会将格式化的代码传递给
- 设置为
- 有
- 本质是内部调用
vetur
VSCode
中的vue
扩展,开发vue
必备- 自带
lint
功能(需要配合eslint
插件使用) - 自带
format
功能- 内置
prettier
- 若本地安装了
prettier
,则会使用本地prettier
- 内置
prettier
也会读取.prettierrc
文件进行格式化工作
- 内置
- 可以针对
.vue
文件中的不同部分设置不同的formatter
- 若本地安装了
- 内置
- 自带
ESLint+Prettier 相关
eslint-config-prettier
- 关闭
eslint
中与prettier
冲突的rules
- 关闭
eslint-plugin-prettier
- 会对比格式化前后的代码,将不一致的地方标记为错误,在 eslint 中抛出
VSCode 的设置
editer.autoFormatOnSave
- 编辑器的自动格式化,会调用一个格式化器
- 它是总开关,若为 false,所有格式化工具将不能在保存时自动格式化
目标
- 代码的检查和格式化工作,在项目内调用命令即可完成,无需依赖编辑器配置;
- 针对使用
vue-cli
创建的项目- 针对
js、vue
文件使用vue-cli
官方推荐的的规则来检查(我们团队习惯使用plugin:vue/recommended
) - 其它类型文件不需要
lint
,直接使用prettier
来做格式化工作
- 针对
直接启用 vue-cli 内部集成的 eslint
vue-cli
创建的项目内部已经集成了eslint
,并配置好了相关配置;我们只需要安装相关依赖,并在配置中启用即可- 开启后,在开发环境就可在
webpack
每次bundle
时自动lint
- 开启后,在开发环境就可在
1 | // build/webpack.base.conf.js |
- 优缺点
- 优点
- 这是最快捷、最快速的办法
- 缺点
webpack
每次bundle
时,都会进行全局lint
,效率较低;- 可以通过配置
cache
有所缓解
- 可以通过配置
eslint
仅针对.js、.vue
实现了检查和格式化,但其它文件如.md
的格式化并未实现
- 优点
ESLint + Prettier 配合使用
ESLint + Prettier 如何配合使用
- ESLint 侧重代码静态检查
- Prettier 侧重代码风格格式化
- 何不将二者结合起来呢?
Prettier
官方文档介绍了 3 种将Prettier
结合ESLint
使用的方法
- 使用
eslint-plugin-prettier
- 会对比格式化前后的代码,将不一致的地方标记为错误,在 eslint 中抛出
1 | // .eslintrc |
- 使用
eslint-config-prettier
- 关闭
eslint
中与prettier
冲突的rules
- 关闭
1 | // .eslintrc |
- 使用
"plugin:prettier/recommended"
- 结合了 1、2 方法;推荐使用
1 | // .eslintrc |
- 针对非
vue
项目,这么配置就可以在eslint --fix
时使用eslint
做代码检查,使用prettier
做格式化了 - 二者结合使用时,可能会遇到二者格式化相关规则冲突的问题,我们在
vue
项目中就遇到了一些问题
结合使用时遇到的问题
- 我们团队内部习惯使用
plugin:vue/recommended
和standard
规则 - 我们尝试将其同
Prettier
格式化相关规则结合一起
1 | { |
- 我们发现保存自动格式化时
"plugin:vue/recommended","plugin:prettier/recommended"
这两个规则会产生很多冲突- 例如,二者会因为传递给组件的
props
是否需要在同一行还是另起一行产生冲突。最后导致代码错误。- 解决方法
- 关闭其中一种规则
- 不使用
plugin:vue/recommended
,改用约束性较低的plugin:vue/essential
规则
- 解决方法
- 我们发现我们还是更倾向于
plugin:vue/recommended
中定义的规则,所以我们决定在vue
文件中不使用"plugin:prettier/recommended"
规则来做格式化;在其他文件中调用prettier --write
来格式化
- 例如,二者会因为传递给组件的
1 | { |
- 无论是直接启用
vue-cli
配置还是结合prettier
使用,在我们项目中都有一些问题- 前者可以在
bundle
时自动lint
,但没有使用prettier
- 后者虽使用了
prettier
,却无法自动调用
- 前者可以在
使用 husky+lint-staged 改进
- 关闭
vue-cli
自带的bundle
时lint
的配置;在git commit
之前自动做lint检查
和prettier格式化
husky和lint-staged
的作用上面已经做过介绍,不做赘述,直接展示配置
1 | // package.json |
- 这样基本实现了,团队内部提交的代码风格一致,完成了预定目标
- 但我们团队内部使用的都是
vscode
,大家不想在提交代码时再做检查和格式化;希望能在开发、保存时就能发现错误、格式化
VSCode 中实现自动提示错误,保存时自动格式化
- 在上一步配置的基础上,再借助
VSCode的ESLint、Prettier、Vetur
扩展就可以完成此目标- 三个扩展的作用可以看文章前面的介绍
- 我们希望针对
js、vue
文件,在保存时,自动发现低级错误并格式化;其它格式文件在保存时可以自动格式化
- 首先安装
ESLint、Prettier、Vetur、Setting Sync
扩展 - 配置
ESLint
扩展,开启保存时自动修复
1 | // settings.json |
- 开启
vscode
的保存时自动格式化选项
1 | // settings.json |
- 在
vue
文件中禁用pretter
扩展
1 | "prettier.disableLanguages": ["vue"], |
- 在
vue
文件中禁用vetur
的格式化选项
1 | "vetur.format.defaultFormatter.html": "none", |
- 完整
settings.json
配置如下
1 | { |
- 问题
- 上述配置是建立在使用了
vue-cli
创建项目,并且项目中存在eslint
的配置文件时,如果项目中没有eslint
配置文件,那么.vue
文件将无法格式化。- 解决方法
- 注释掉在
.vue
文件禁用prettier
相关设置
- 注释掉在
- 解决方法
- 上述配置是建立在使用了
1 | // "prettier.disableLanguages": ["vue"], |
- PS:
VSCode
设置的共享,可以借助Settings Sync
扩展来实现,具体方法可 google