Better

Ethan的博客,欢迎访问交流

eslint 同时指定多个配置会怎么样呢

最近有个困惑,如果同时通过多种方式指定 eslint 的配置会是什么效果?如果嵌套定义配置的情况呢?

前置知识

为了社区的规范化,eslint 对于配置文件以及插件等,还有一定的命名约束

  • 使用 extends 继承已有配置时,约定使用 eslint-config- 作为前缀
  • 插件机制使用,约定使用 eslint-plugin- 作为前缀
  • 在具体配置时候,你可以自己选择是否加上前缀,eslint 会自动格式化(判断有没有添加前缀,没有则自动加上)

简单阅读 eslint 源码的过程中发现,针对 plugin 的配置,eslint 还判断了是不是 eslint:plugin: 开头,是的话会跳过格式化,暂没深究目的和原因

怎么定义配置

eslint 指定配置的方式

  1. 通过单独的命名为 .eslintrc.* 文件
  2. 通过 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 会递归的扩展配置


留言