Eslint 可以通过配置文件、代码注释 /* eslint */以及 package.json 中的 eslintConfig 来设置。
2-1.类别
配置文件的命名通常是 .eslintrc,根据文件类别,可以分为以下几种(同一目录下,优先级从高到低):
JavaScript-.eslintrc.js笔者推荐项,易于扩展。JavaScript (ESM)YAML-.eslintrc.yaml或者.eslintrc.ymlJSON-.eslintrc.jsonpackage.json
TIP
譬如:如果在同一目录下,同时存在 .eslintrc.* 和 package.json 文件,
则 .eslintrc.* 的优先级更高,package.json 文件中的 eslintConfig 配置不会被采用。
2-2.执行逻辑
从 lint 的目标文件所在目录开始,依次向上每个目录寻找 .eslintrc.* 文件,直到某 .eslintrc.* 文件声明了 root: true 属性、或项目根目录 / 为止。
如果上述两项都没有找到对应配置文件,则会在用户根目录 ~/ 判定是否有全局配置。
当使用 .eslintrc.* 或者 package.json 配置时,不同目录下的配置文件有级联优先级。
假设有如下的结构:
your-project
├── .eslintrc.json
├── lib
│ └── source.js
└─┬ tests
├── .eslintrc.json
└── test.js首先,以被 lint 的目标文件所在目录为起始,该层目录下的 .eslintrc.* 文件的优先级最高。
然后 Eslint 会随着目录层级依次向上递归搜索配置文件,并合并配置选项,直到某一目录下的 .eslintrc 文件设置了 root: true、或者项目根目录 /、或者用户根目录 ~/。
类似的,如果项目根目录下有一个配置了 eslintConfig 属性的 package.json 文件,则该根目录配置会对所有子目录都生效。
如果根目录配置与在 tests/ 下的 .eslintrc.* 文件配置出现了冲突,则后者的配置属性优先级更高,会覆盖前者的配置属性。
your-project
├── package.json
├── lib
│ └── source.js
└─┬ tests
├── .eslintrc.json
└── test.jsTIP
正如上文所说,Eslint 默认会搜索所有层级目录中的配置文件,这其实是为了方便每一个目录能够定制化的设置一些 lint 配置。
但在某些情况(项目系统比较庞大)下,这种特点会越来越不可控。
因此,Eslint 提供了 root: true 这个配置,来方便用户更加精细的控制配置级联层级和权重。
例如,在 lib/ 下的 .eslintrc.js 配置了 root: true,那么当将 lib/main.js 文件作为 lint 的目标时,projectA/.eslintrc.js 并不会生效。
home
└── user
└── projectA
├── .eslintrc.js <- Not used
└── lib
├── .eslintrc.js <- { root: true }
└── main.js总结:
Eslint 的级联配置,从高到底的优先级,如下:
- 代码注释
/*eslint-disable*/ /*eslint-enable*//*global*//*eslint*//*eslint-env*/- 命令行选项
--global--rule--env-c, --config- 项目级配置
- 与
lint目标文件同一级目录下的.eslintrc.*或package.json文件。 - 由
lint目标文件所在目录为起始,向上递增查找.eslintrc.*或package.json文件,直到文件根目录/、 或查找到文件带有root: true配置。 - 如果不满足
1和3这两种情况,则会到~/.eslintrc中寻找自定义配置。
2-3.使用方式
- 当文件被
lint时,Eslint会根据上述的规则和优先级,自动找寻并使用相关配置文件。 - 使用
-c指令,手动指定配置文件。
TIP
在使用 -c 指令时,依然会受到上级目录中的 .eslintrc.* 文件的影响。如果想要避免这种影响,可以使用 --no-eslintrc。
譬如 eslint -c libs/.eslintrc.json main.js --no-eslintrc。
2-4.可定义属性
配置文件中除了上面的 root: true 外还有许多可定义属性,以 .eslintrc.js 为例:
module.exports = {
root: true,
globals: {},
env: {},
parserOptions: {},
rules: {},
extends: {},
configs: {},
plugins: {},
overrides: []
}