eslint
eslint小妙招🍶
1. 基本使用
- 项目安装eslint:
yarn add eslint -D
; - 初始化eslint配置:eslint --init;
- 检测eslint:运行eslint;
1.1 基本参数
eslint配置参数的方式有两种,一种是通过配置文件,一种是通过命令行;配置文件的参数不一定包含命令行的,为了方便查看和使用,推荐优先在配置中配置;
1.1.1 .eslintrc参数
详情请查看eslint.org/docs/user-g…;
1 |
|
1.1.2 命令行参数
详情请查看eslint.cn/docs/user-g…;
1 |
|
2.2 常用参数概念补充
2.2.1 解析器
- esprima:eslint早期使用的解析器;
- espree:基于esprema v1.2.2开发,现在默认的解析器;
- @babel/eslint-parser:js高级语法的解析器;
- @typescript-eslint/parser:ts的解析器;
2.2.2 规则配置
- “off” 或 0: 关闭规则;
- “warn” 或 1: 开启规则,使用警告级别的错误:warn (不会导致程序退出);
- “error” 或 2: 开启规则,使用错误级别的错误:error (当被触发的时候,程序会退出);
2.2.3 extends支持的配置类型
- eslint开头:ESLint官方扩展;
- plugin开头:插件类型扩展;和configs里面配置的一一对应;
- eslint-config开头:npm包,使用时可省略前缀eslint-config-;
- 文件路径;
常用扩展:
- eslint:recommended:ESLint内置的推荐规则,即 ESLint Rules 列表中打了钩的那些规则;
- eslint:all:ESLint 内置的所有规则;
- eslint-config-standard:standard 的 JS 规范;
- eslint-config-prettier:关闭和 ESLint 中以及其他扩展中有冲突的规则;
- eslint-plugin-vue:vue官方eslint配置插件,配置共享有:
- plugin:vue/base:基础;
- plugin:vue/essential:必不可少的;
- plugin:vue/recommended:推荐的;
- plugin:vue/strongly-recommended:强烈推荐;
2.3 配置不需要lint的文件或目录
可以在.eslintignore中指定对应的文件或目录,以达到eslint执行时不检测(eslint本身是忽略node_modules和bower_components的);如:
1 |
|
ESLint配置共享
每个团队的规范是不一样的,公司内部希望每个产品线的规范一致,那么可以将配置分享出来打成npm包,以供不同团队直接配置使用;
如何写一个配置共享?
- 创建一个文件夹,名称为eslint-config-myconfig;
- 执行
yarn init -y
;(模块名必须以eslint-config-开头,项目文件名称随意); - 创建index.js,里面写入需要分享的.eslintrc.js的配置;
- 用 peerDependencies 字段声明依赖的 ESLint(明确插件需要 ESLint 才能正常运行);
- 发包即可;
PS:发包形式写插件都支持@scope/eslint-xxx-xxx形式,详情;
如何使用上面的包?
- 安装包,如:
yarn add eslint-config-myconfig -D
; - 在项目中的.eslintrc中配置extends配置,具体查看基本使用;
2 ESLint插件
2.1 ESLint插件是什么?
插件可向ESLint添加各种扩展,是可定义规则,环境、处理器或配置的第三方模块;
如何自定义一个ESLint插件?
使用generator-eslint创建一个项目,该项目的模块名需以eslint-plugin-开头,使用的时候,则是去掉eslint-plugin-;
如npm包名:eslint-plugin-myplugin;
2.1.1 定义规则
规则:eslint检测的规则方式;
定义方式:规定必须暴露一个rules对象;
1 |
|
使用方式:
1 |
|
2.1.1.1 rules的参数
rules的meta参数是填写一些基本信息,create参数中的value是用于执行检测AST规则的回调方法;
create的context参数:
- id:在.eslintrc的rules中配置的规则名称,如上面使用方式中的
myplugin/my-rule
; - options:在.eslintrc的rules中配置的规则参数,如上面例子的结果是:[“never”, {exceptRange: true}]
- report:用于发布警告或错误的,在回调中判断调用;具体参数;
create的return对象:
- 如果一个 key 是个节点类型或 selector,在 向下 遍历树时,ESLint 调用 visitor 函数;
- 如果一个 key 是个节点类型或 selector,并带有 :exit,在 向上 遍历树时,ESLint 调用 visitor 函数;
- 如果一个 key 是个事件名字,ESLint 为代码路径分析调用 handler 函数;
节点类型: AST的节点类型;
具体如下:
序号 | 类型原名称 | 中文名称 | 描述 |
---|---|---|---|
1 | Program | 程序主体 | 整段代码的主体 |
2 | VariableDeclaration | 变量声明 | 声明一个变量,例如 var let const |
3 | FunctionDeclaration | 函数声明 | 声明一个函数,例如 function |
4 | ExpressionStatement | 表达式语句 | 通常是调用一个函数,例如 console.log() |
5 | BlockStatement | 块语句 | 包裹在 {} 块内的代码,例如 if (condition){var a = 1;} |
6 | BreakStatement | 中断语句 | 通常指 break |
7 | ContinueStatement | 持续语句 | 通常指 continue |
8 | ReturnStatement | 返回语句 | 通常指 return |
9 | SwitchStatement | Switch 语句 | 通常指 Switch Case 语句中的 Switch |
10 | IfStatement | If 控制流语句 | 控制流语句,通常指 if(condition){}else{} |
11 | Identifier | 标识符 | 标识,例如声明变量时 var identi = 5 中的 identi |
12 | CallExpression | 调用表达式 | 通常指调用一个函数,例如 console.log() |
13 | BinaryExpression | 二进制表达式 | 通常指运算,例如 1+2 |
14 | MemberExpression | 成员表达式 | 通常指调用对象的成员,例如 console 对象的 log 成员 |
15 | ArrayExpression | 数组表达式 | 通常指一个数组,例如 [1, 3, 5] |
16 | NewExpression | New 表达式 | 通常指使用 New 关键词 |
17 | AssignmentExpression | 赋值表达式 | 通常指将函数的返回值赋值给变量 |
18 | UpdateExpression | 更新表达式 | 通常指更新成员值,例如 i++ |
19 | Literal | 字面量 | 字面量 |
20 | BooleanLiteral | 布尔型字面量 | 布尔值,例如 true false |
21 | NumericLiteral | 数字型字面量 | 数字,例如 100 |
22 | StringLiteral | 字符型字面量 | 字符串,例如 vansenb |
23 | SwitchCase | Case 语句 | 通常指 Switch 语句中的 Case |
可以顺便看下vue的节点类型:github.com/vuejs/vue-e…
选择器(selector) :是一个字符串,可用于匹配抽象语法树(AST)中的节点。这对于描述代码中的特定语法模式非常有用。选择器不限于对单个节点类型进行匹配。例如,选择器"VariableDeclarator > Identifier"将匹配所有具有VariableDeclarator的Identifier。详情;
事件:分析代码路径所触发的事件;
1 |
|
2.1.2 定义环境
环境:就是某一组配置,比如jquery里面所有的全局变量;
插件的环境可定义以下对象:
globals: 同配置文件中的globals一样。
parserOptions: 同配置文件中的parserOptions一样。
定义方式:必须暴露environments对象;
1 |
|
使用方式:
1 |
|
2.1.3 定义处理器
eslint只能检测js,如果是其他文件则需要配置自定义处理器;
定义方式:必须暴露processors,以文件后缀为key,包含以文件内容和文件名作为参数的函数,并返回一个要检测的字符串数组;
1 |
|
使用方式:
1 |
|
工程化最佳使用方案
项目的工程化可以提升开发效率,减少一些容易避免的错误;下面推荐一些和eslint搭配的好用的工具:
有时间找个项目试试水😃
-
husky:commit之前执行eslint命令,如果eslint没过,则commit失败;
-
lint-staged:跑husky的hooks只针对拿到的staged文件;
-
prettier:修改代码风格,只管代码风格,不管一些低级问题;如果有一些配置和eslint冲突了,可以配合eslint-plugin-prettier和eslint一起使用;