零散专题16 代码检查和格式化
EditorConfig + ESLint + ESLint + Husky + Stylelint学习小结。
EditorConfig
为了保持项目中代码缩进风格的一致,可以使用.editorconfig
文件,来定义和维护一致的编码风格,例如范缩进风格,缩进大小,Tab长度以及字符集等。一般情况会覆盖IDE本身的设置,所以放在项目的根目录中,提交到代码仓库进行维护。
.editorconfig
中第一行用于指明.editorconfig
文件的位置,[*]
表明规则应用所有文件,可以针对不同文件(比如[*.md]
)添加不同的规则,再下面是具体对应的规则
下面是我在项目中尝试用的一份.editorconfig
文件,
1 | root = true |
没有加入的属性几个,比如定义换行符的end_of_line
,可以取值lf
、cr
和crlf
,更详细的介绍可以参考腾讯AlloyTeam的文章。
ESLint
Eslint是一个用来识别ECMAScript并且按照规则给出报告的代码检测工具,使用它可以避免低级错误和统一代码的风格。ESLint被设计为完全可配置的,一般使用配置文件来配置ESLint,在项目的根目录下创建.eslintrc.js
可以被配置的信息主要分为3类:
- Environments:你的Javascript脚本将要运行在什么环境(如:Node,浏览器等)中。
- Globals:执行代码时脚步需要访问的额外全局变量。
- Rules:开启某些规则,也可以设置规则的等级。
安装
安装推荐局部安装:
1 | npm i -D eslint |
安装完毕后,接下来新建一个配置文件.eslintrc.js
,或者使用如下的命令行来自动生成。
1 | ./node_modules/.bin/eslint --init |
配置文件中的配置规则分为三种等级:
off
或者0
:关闭规则warn
或者1
:打开规则,并且作为一个警告error
或者2
:打开规则,并且作为一个错误
1 | // .eslintrc.js |
具体的配置规则非常多,具体见这里。
在Webstorm中使用
在Webstorm中配置ESLint,需要在Language & Frameworks
→ Javascript
→ Code Quality Tools
→ ESLint
中进行配置,勾选Enable
。
一般情况下下面的对应的配置和地址都会自动填好。
开启之后Webstorm就会在代码中对违反ESLint规则的代码进行高亮提示。
配合Vue项目使用
Vue Cli在创建项目时,可以选择是否启用ESLint,并且可以选择使用哪种扩展,基本上不需要自己再进行配置,但是如果需要自己手动配置时,可以自己安装eslint-plugin-vue
这个插件
ESLint配置中的
plugin
和extend
的区别是,extend
提供的是ESLint现有规则的一些列预设,而plugin
除了提供预设之外的自定义规则,当现有格式的代码(比如.vue
)在ESLint的规则中没有对应的规则是,就需要借用插件来实现了
插件的安装有三种方式,推荐使用第一种:
1 | vue add @vue/cli-plugin-eslint |
对应的配置文件eslintrc.js
:
1 | module.exports = { |
规则分为Essential、Strongly Recommended和Recommended三个等级,具体的规则可以参考官网。
我在项目中使用的配置是:
1 | // ESLint 中文文档:http://eslint.cn/docs/rules/ |
配合React项目使用
1 | npm install eslint eslint-plugin-react --save-dev |
详细的规则参考官网。
下面是我的一份.eslintrc.js
配置文件,在extends
中使用这个插件:
1 | module.exports = { |
也可以直接使用腾讯的AlloyTeam的ESLint规则(推荐),有详细的规则描述和示例,可以在此基础上进行定制。
使用时需要首先安装eslint
、babel-eslint
、eslint-config-alloy
,这是AlloyTeam的ESLint规则的最基础的所需要安装的依赖
1 | npm install -D eslint babel-eslint eslint-config-alloy eslint-plugin-react |
并将以下内容复制到.eslintrc.js
1 | module.exports = { |
AlloyTeam也有针对Vue项目、TypeScript项目、React+TypeScript项目的各种规则,可以按需选择。
需要注意的是,如果使用的Create React App脚手架工具来搭建React项目,由于它将默认的构建配置封装了起来,而ESLint仅仅开启了最基本的规则,更重要的是默认情况下,ESLint仅仅会在IDE中对违反规则的情况进行提示,并不会在构建时在终端的输出进行终端和提示。
如果这种情况可以满足需要,而只需要开启更多的规则,那么在.eslintrc.js
中的extends
中添加对应的规则集即可
但是如果要起到更强制性的提示作用(中断构建、终端提示),Create React App建议使用Prettier代替ESLint。如果要使用ESLint,那么就需要使用npm run eject
,将配置文件吐出,按照AlloyTeam的提示进行配置即可。
配合TypeScript项目使用
由于ESLint默认使用Espree进行语法解析,无法识别TypeScript的某些语法,需要安装@typescript-eslint/parser
替代默认的解析器
1 | npm install --save-dev @typescript-eslint/parser |
最后安装对应的规则插件@typescript-eslint/eslint-plugin
1 | npm install --save-dev @typescript-eslint/eslint-plugin |
对ESLint进行配置,在根目录下创建.eslintrc.js
:
1 | module.exports = { |
上面提到了,AlloyTeam也有对应TypeScript的规则
安装和配置时直接按照下面的进行即可,已经包含了上面的安装和配置步骤
安装:
1 | npm install --save-dev eslint typescript @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-config-alloy |
配置文件:
1 | module.exports = { |
配合TypeScript + React项目使用(.tsx
文件)
要检查React的.tsc
文件,首先需要安装eslint-plugin-react
:
1 | npm install --save-dev eslint-plugin-react |
然后在lint
命令后面需要添加.tsx
后缀:
1 | { |
也可以使用AlloyTeam的ESLint规则的TypeScript React版本。
安装:
1 | npm install --save-dev eslint typescript @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-plugin-react eslint-config-alloy |
配置文件:
1 | module.exports = { |
ESlint对Async
报错的解决方法
在ESlint配置文件中增加
1 | parserOptions: { |
Prettier
Prettier是一个流行的代码格式化工具,Webstorm的代码格式化就使用了这个插件。
一般情况下,ESLint会包含对代码格式的检查(比如缩进、结尾分号等),但是很多ESLint的插件(比如eslint-config-alloy
)将所有样式相关的规则都剔除了。这是因为相比与ESLint中的代码格式规则,它提供了更少的选项,但是却更加专业。所以让ESLint来检查它更擅长的逻辑错误,使用Prettier中检查样式错误。
使用Prettier有两种方式,一种是结合ESLint使用(推荐),首先安装:
1 | npm i -D prettier eslint-config-prettier eslint-plugin-prettier |
其中prettier
是Prettier插件的核心代码,eslint-config-prettier
用来解决ESLint中的样式规范和Prettier中样式规范的冲突,以Prettier的样式规范为准,使ESLint中的样式规范自动失效,eslint-plugin-prettier
用来将Prettier作为ESLint规范来使用
然后在项目的根目录下创建.prettierrc.js
文件:
1 | // 基于 AlloyTeam 使用的 .prettierrc.js 配置进行修改 |
关于规则的说明可以参考官方文档。
接着修改.eslintrc.js
文件,引入Prettier(下面项目是TypeScript项目,其他项目配置参考eslint-config-prettier
的文档:
1 | module.exports = { |
prettier/@typescript-eslint
使得@typescript-eslint
中的样式规范失效,遵循Prettier中的样式规范,plugin:prettier/recommended
使用Prettier中的样式规范,且如果使得ESLint会检测prettier的格式问题,同样将格式问题以Error的形式抛出
这种形式的好处是,将Prettier与ESLint配合使用,当使用Lint-Staged进行检查时,只需要配置ESLint相关的命令即可。如果不符合规则,会进行提示,让你手动修改。
另一个方式就是单独使用Preitter,不使用eslint-plugin-prettier
等插件,然后同样在.prettierrc.js
中进行配置:
1 | npm install --save-dev --save-exact prettier |
这样的缺点是需要单独配置Prettier,优点是当代码风格不符合规则时,会直接按照配置的风格重新输出代码。当ESLint的规则与Prittier冲突时,还是通过上面提到的eslint-config-prettier
来解决冲突
配合FECS使用
由于百度使用了统一制定的个性化的ESLint规则,可以直接使用fecs来检查代码
常规的使用方法不能满足每次提交时只检测对应改动的文件的要求,想要结合husky使用,需要新建一个.lintstagedrc
文件:
1 | module.exports = { |
将package.json
的lint-staged
的配置删除,这样每次提交时就会针对改动的文件进行配置。
它采用的JavaScript的编码规范在这里。
Fecs还提供了格式化的功能,fesc format
。
stylelint
ESLint检查的JavaScript代码,对于CSS代码的检查就需要使用stylelint,它的使用和配置与ESLint非常类似,关于它的实践安可以参考企业微信的文章。
它的具体规则集在这里。预设的规则集有stylelint-config-recommended和stylelint-config-standard,前者只会检验可能导致错误的规则,后者在前者基础上还增加了60条规则,官方的选择建议是,如果使用了Prettier选择stylelint-config-recommended,如果希望统一样式的编写格式,那么可以选择stylelint-config-standard。在选择了某一种后,也可以在.stylelintrc.js
中进行自定义的配置。
支持多种引入方式,一般常用的有下面两种
(1)命令行使用
安装:
1 | npm install stylelint stylelint-config-standard -D |
然后在.stylelintrc.js
中进行配置:
1 | // stylelint规则集:https://stylelint.io/user-guide/rules |
这样在命令行中就可以对CSS文件进行校验:
1 | stylelint "foo/*.css" |
(2)与Webpack等构建工具配合使用
stylelint可以与各种构建工具配合使用,例如它提供了Webpack的插件stylelint-webpack-plugin,首先安装:
1 | npm install stylelint stylelint-config-standard stylelint-webpack-plugin -D |
然后在Webpack中配置
1 | // vue.config.js |
lint-staged
+ husky
使用lint-staged配合Husky,可以实现在Git某种操作前(一般是commit
)仅检测有改动的代码。
首先进行安装:
1 | npm install -D lint-staged husky; |
然后修改package.json
,增加配置:
1 | { |
这样在Commit之前就会使用ESLint进行校验。
如果配合Prettier使用,则可以自动格式化代码:
1 | { |
参考
- 【译】EditorConfig 介绍
- 在WebStorm中使用editorConfig插件@CSDN
- rules@ESLint
- eslint-plugin-vue
- Displaying Lint Output in the Editor@Create React App
- AlloyTeam/eslint-config-alloy@github
- 用 husky 和 lint-staged 构建超溜的代码检查工作流@segmentfault
- 在Typescript项目中,如何优雅的使用ESLint和Prettier@掘金
- 用 husky 和 lint-staged 构建超溜的代码检查工作流@segmentfault
- Prettier看这一篇就行了@知乎