最近有个困惑,如果同时通过多种方式指定 eslint 的配置会是什么效果?如果嵌套定义配置的情况呢?
前置知识
为了社区的规范化,eslint 对于配置文件以及插件等,还有一定的命名约束
- 使用 extends 继承已有配置时,约定使用
eslint-config-
作为前缀 - 插件机制使用,约定使用
eslint-plugin-
作为前缀 - 在具体配置时候,你可以自己选择是否加上前缀,eslint 会自动格式化(判断有没有添加前缀,没有则自动加上)
简单阅读 eslint 源码的过程中发现,针对 plugin 的配置,eslint 还判断了是不是
eslint:
或plugin:
开头,是的话会跳过格式化,暂没深究目的和原因
怎么定义配置
eslint 指定配置的方式
- 通过单独的命名为 .eslintrc.* 文件
- 通过 package.json 中的 eslintConfig 字段
那么如果同时设置两个,会有什么效果呢。优先级问题如何确定呢。大致可以在 config-array-factory.js
中得知。
关于配置文件的定义如下
const configFilenames = [
".eslintrc.js",
".eslintrc.cjs",
".eslintrc.yaml",
".eslintrc.yml",
".eslintrc.json",
".eslintrc",
"package.json"
];
官方文档中提到,如果在同一个目录存在多个配置文件,eslint 只会使用一个,具体优先级顺序就是上面数组的定义顺序,.eslintrc.js 优先级最高,package.json 优先级最低
如果在不同目录层级,存在多份配置文件,则被校验的文件,会优先使用离它最近的文件,然后才是使用父目录的配置文件。这句话具体解释为:被校验的文件会基于两个配置的组合,如果存在冲突,则离得最近的优先级更高。
为了将 eslint 限制到一个特定的项目,可以在配置中使用 root 字段,eslint 一旦发现配置文件中有 "root": true,它就会停止在父级目录中寻找。
extends 属性值
- 指定配置的字符串
- 字符串数组:每个配置继承它前面的配置
- eslint 会递归的扩展配置