ESLint 进阶指南
进阶指南主要针对的是 plugins 相关的内容,虽然大部分开发者是仅使用 ESLint 而不直接需要进行插件的编写,但了解相关的内容也会对阅读别人源码有所帮助。
配置项
rules
插件中的 rules 就是创建自定义规则集。
插件中的 rules 定义方式和普通 eslintrc.* 的 rules 没什么太大区别,但插件中是制定规则内容的地方,你可以为规则起一个名字,然后在 create 方法内为这个规则编写判断逻辑:
// eslint-plugin-myPlugin
module.exports = {
rules: {
"my-rules": {
create: function (context) {
// rule implementation ...
}
}
}
};
在 eslintrc.* 文件中使用的使用,就需要通过插件名来引用此规则:
module.exports = {
rules: {
"myplugin/my-rules": "error"
}
};
configs
插件中提供 configs 的目的主要还是用于扩展配置,一个官方提供的插件内往往提供了多个配置参考供开发者去配置自己的项目。
比如说,在自己的 eslintrc.js 文件内,我们非常容易就会看到一些配置:
extends: ["plugin:vue/essential"]
这句配置的解释:使用 eslint-plugin-vue 插件内的名为 essential 的 configs 配置项,并启用里面 rules 规则。
eslint-plugin-vue 配置 configs 部分源码:
configs: {
base: require('./configs/base'),
essential: require('./configs/essential'),
'no-layout-rules': require('./configs/no-layout-rules'),
recommended: require('./configs/recommended'),
'strongly-recommended': require('./configs/strongly-recommended'),
'vue3-essential': require('./configs/vue3-essential'),
'vue3-recommended': require('./configs/vue3-recommended'),
'vue3-strongly-recommended': require('./configs/vue3-strongly-recommended')
},
在 configs 中,不仅可以配置独属于当前 configs 名称的 rules ,还可以配置 plugins 、env 等。这里其实就等于一个非直接文件的 eslintrc.* 文件。
environments
通过 environments 属性,可以为 eslintrs.* 文件内的 env 属性提供一个特有的环境。
这个属性用的不多,可以在官方案例中了解更多。
processors
processors 在插件中具有举足轻重的作用,它的作用有多样 “处理器可以从其他类型的文件中提取 JavaScript 代码,然后让 ESLint 对 JavaScript 代码进行 lint,或者处理器可以出于某种目的在预处理中转换 JavaScript 代码。”
通常来说, processor 和 overrides 是一个固定搭配,我们可以在 overrides 中为指定的文件,例如 .md 文件指定处理器去处理其中的 js 文件:
{
"plugins": ["a-plugin"],
"overrides": [
{
"files": ["*.md"],
"processor": "a-plugin/markdown"
}
]
}
根据上面的内容,可以了解到,这玩意儿好像还是有一些局限性,它能做的就是从非 js 文件中提取 js 代码。而要是我们想对一份自定义文件内所有内容都进行检测,此时就需要使用 parser 了。
parser
parser 的作用就是把非 js 自定义文件进行解析,使得解析后的内容可以被 ESLint 正确识别,然后交给插件的 rules -> context 去完成各个规则的制定工作,以及交给 processors 处理 js 的 lint。
要清楚的是,parser 本不是插件中必须拥有的一环,它是独立的。parser 属性可以出现在非插件的普通配置文件中!
parserOptions
parserOptions 解析配置,是用于 parser 解析时使用的,通常它俩都一起出现。本身 parserOptions 的内容是提供给 ESLint -> Espree 解析器的,但是一旦我们指定了额外的 parser 属性,那么 parserOptions 会先传给自定义的 parser,然后自定义 parser 处理后再传给 Espree 。