为啥会出现ESLint
TSLint
stylelint
之类的 Linters
工具
当你的业务代码里出现了越来越多的if elseif elseif elseif
,多到条件都是ctrl+c ctrl+v
为起手技,因为历史原因又不方便重构;无意之间你的代码变成了如下形式:
1 if(a==b||a==c){
2 }else if(a==c&&c!=''){
3 }else if(c==e||c=b){
4 }else if(c==e&&c!=b){
5 }else if(...){
}
在这简化的代码逻辑中,你可能一眼就看出了问题;也可能睁大眼睛1分钟了,长叹没毛病啊~
答案当然是有问题,在第3行的逻辑判断
//就是这里的 c=b,你的历史记忆中此处应该是c==b的判断,而不是c=b的赋值
}else if(c==e||c=b){
不知道你有没有类似的遭遇,我反正是遇到过几次,揪出问题前,怎么都想不通,直到发现问题,哎呀我去~
并且解决此类问题并没有成就感,还惹得一身不够细心
此时如果恰好有 ESLint
之类的语法校验工具,并且合理的配置了。在控制台中,将会输出问题
,告知你要小心了,这里有坑啊
但是很多初入Linters
的伙伴满心欢喜的安装,上手不一会后,就放弃了。为啥~
A:啊呀,怎么报错了,满屏都是红的
B:我这也是,刚刚还好好的,现在就加了个console.log
就红了
A:算了算了,还是格式化下就好了,这个太麻烦了
这段OS(Overlapping Sound),曾出现我内心,也出现在我同事之间。
要解决这个问题,重点在于要合理的配置所用 Linters
的规则,因为很多默认的 Linters
规则,阻碍了你已养成的编码习惯,让你很不舒服;索性你就不用了。
好嘞~ 故事讲完,如果你想让 Linters
发现你或伙伴无意间留下的坑,又不想让 Linters
阻碍你编码的惯性,那么接下来再走一遍实际操作,也许会让你重拾 Linters
那么以 在vscode
启用 ESLint
为例
前置环境条件
- 安装
vscode
- 安装
ESLint
-
vscode
安装ESLint
插件
ESLint 可以全局安装,也可以在你项目的目录单独安装;vscode里eslint插件是先在项目的目录里找eslint包,如果未找到,则在全局环境里查找eslint包
vscode中配置eslint插件参数
"eslint.run": "onSave",//eslint在保存时执行
"eslint.alwaysShowStatus": true,//在状态栏显示 eslint状态
"editor.codeActionsOnSave": {
"eslint.run": "onSave",//在保存时自动运行eslint,检查代码;也可以选择 onType 一旦内容有变化就会运行eslint
"source.fixAll.eslint": true// eslint 自动修复可修复的规则
},
在现有的项目,或新建项目中配置 eslint配置文件,例如我这里是用js形式配置的eslint配置文件 .eslintrc.js
//样例配置
module.exports = {
"env": {
"browser": true,
"es6": true
},
"extends": "eslint:recommended",
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parserOptions": {
"ecmaVersion": 11
},
"rules": {
}
};
至此,eslint就算用起来了,让我们来看一看效果
接下来,就是配置,之所以用的不习惯就是没配置到位,在配置前,你需要整明白能配置什么。
其实官方文档里写的很详细,但没有中文文档,只关注效率的我们往往沉不下心,若不能在较短的时间内解决,便半途而废了。
以 .eslintrc.js
配置举例
module.exports = {
/**
* 指定js(运行|版本)所处环境,以便提供所指定(环境|版本)默认的变量
* 官网详细说明 https://eslint.org/docs/user-guide/configuring#specifying-environments
*/
"env": {
"browser": true,//如为 false 或不配置, 在js文件中出现 window, document 等 游览器API 全局变量时,会提示 'is not defined' 警告
"node":true,//如为 false 或不配置, 在js文件中出现 require, exports等 NODE API 全局变量时,会提示 'is not defined' 警告
"es6": false,//如为 false 或不配置, 在js文件中出现 Promise 等es6版本新增的对象或方法时,提示错误警告
},
/**
* eslint 规则继承自何处
* 即如果未配置rules(自定义)规则,也未指定 extends(继承)规则,eslint便没有规则进行校验
* 相当于,你买了部手机,但手机没有电,啥事也干不了
* 官网详细说明 https://eslint.org/docs/user-guide/configuring#extending-configuration-files
*/
"extends": "eslint:recommended",
/**
* 设置自定义全局变量,避免自定义全局变量出现 no-undef 警告
* 有时候我们引入了第三方包(插件),或我们自己写的一个全局方法;其提供了一个全局变量供我们使用,例如 axios (一个请求类库)
* eslint 会校验 变量必须声明才能使用,但是第三方库,或我们自己的全局方法,不会在每个js文件中声明引入,这个时候便会出现 no-undef 警告
* 因此,将其在 globals中配置即可
* 官网详细说明 https://eslint.org/docs/user-guide/configuring#specifying-globals
* 注意:
* false | "readable" 等同于 "readonly" 不能重新定义(赋值)
* true | "writeable" 等同于 "writable" 可重新定义(赋值)
*/
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly",
"requirejs":false,
"Mock":false,
"axios":false,
},
/**
* 指定 js 语法版本,例如
* "ecmaVersion": 5, 表明 启用es5语法进行校验,此时用 => 箭头函数会提示语法错误,因为箭头函数在es6中才能支持
* 使用 3, 5 (默认), 6, 7, 8, 9, 10, 11 设置你预期的js语法版本
* 也可以根据js版本的年份设置,例如
* 2015(同 6) 2016(同 7) 2017(同 8) 2018(同 9) 2019(同 10) 2020(同 11)
* 官网详细说明 https://eslint.org/docs/user-guide/configuring#specifying-parser-options
*/
"parserOptions": {
"ecmaVersion": 5
},
/**
* 自定义 eslint 校验规则
* off 或 0 关闭校验
* warn 或 1 提示警告
* error 或 2 提示错误
* 官网详细说明 https://eslint.org/docs/user-guide/configuring#configuring-rules
* 可配置校验规则 https://eslint.org/docs/rules/
*/
"rules": {
"quotes": [
"error", //必须使用双引号
"double"
],
"semi": [
"error",// 未分号结尾 提示错误
"always"
],
"no-console": 1, // console 提示 警告
}
};
如上配置,eslint会在
- 出现箭头函数 提示错误 因为 parserOptions 配置的 ecmaVersion 版本为 5
- 出现Promise 等es6新增内置对象提示错误 因为 env 配置的 es6 为false 或未配置
- 使用 console.log 提示警告 因为 自定义规则里 no-console 配置为 1 即提示警告
根据上面的标注的规则,调整适合自身的规则即可。至此eslint已经协助我们完成语法校验规则了,并且 eslint 在一定程度上还能自动修复问题(主要是修复 空格 之类的 ^ _ ^)
例如在上面的 vscode 配置文件中,我们设置了自动修复,则在保存后,如果出现多余的空格等,会自动修复
"editor.codeActionsOnSave": {
"eslint.run": "onSave",//在保存时自动运行eslint,检查代码;也可以选择 onType 一旦内容有变化就会运行eslint
"source.fixAll.eslint": true// eslint 自动修复可修复的规则
},
好了~ 至此,便如用担心手抖造成的误伤了,接下来要做的就是格式化代码;回顾下前端可能会接触到的语言即框架
- JavaScript
- JSX
- Angular
- Vue
- Flow
- TypeScript
- CSS, Less, and SCSS
- HTML
- JSON
- GraphQL
- Markdown, including GFM and MDX
- YAML
稳住~ 虽然多,但是Prettier
来了,通吃前端多语言的一种方案