配置ESLint | Configuring ESLint

Configuring ESLint

ESLint的设计是完全可配置的,这意味着您可以关闭每个规则并仅通过基本的语法验证来运行,或者将捆绑规则和自定义规则进行混合匹配,以使ESLint完美适合您的项目。有两种主要的方法来配置ESLint:

  • 配置注释 - 使用JavaScript注释将配置信息直接嵌入到文件中。

有几个信息可以配置:

  • 环境 - 脚本设计运行的环境。每个环境都带有一组预定义的全局变量。

所有这些选项都可以让您精确控制ESLint如何处理您的代码。

指定解析器选项

ESLint允许你指定你想要支持的JavaScript语言选项。默认情况下,ESLint需要ECMAScript 5语法。您可以覆盖该设置,以使用解析器选项启用对其他ECMAScript版本以及JSX的支持。

请注意,支持JSX语法与支持React不同。React将特定的语义应用于ESLint无法识别的JSX语法。如果您使用React并希望使用React语义,我们推荐使用eslint-plugin-react。同样,支持ES6语法与支持新的ES6全局变量(例如,新类型Set)不同。对于ES6语法,请使用{ "parserOptions": { "ecmaVersion": 6 } }; 对于新的ES6全局变量,请使用{ "env": { "es6": true } }(此设置会自动启用ES6语法)。解析器选项.eslintrc.*通过使用parserOptions属性在您的文件中设置。可用的选项是:

  • ecmaVersion - 设置为3,5(默认),6,7或8以指定要使用的ECMAScript语法的版本。您也可以设置为2015年(与6)相同,2016年(与7相同)或2017(与8相同)使用年份命名。

这是一个示例.eslintrc.json文件:

{ "parserOptions": { "ecmaVersion": 6, "sourceType": "module", "ecmaFeatures": { "jsx": true } }, "rules": { "semi": 2 } }

设置解析器选项有助于ESLint确定什么是解析错误。所有的语言选项都是false默认的。

指定解析器

默认情况下,ESLint使用Espree作为其解析器。只要解析器符合以下要求,您可以选择指定在配置文件中使用不同的解析器:

  • 它必须是本地安装的npm模块。

请注意,即使使用这些兼容性,也不能保证外部解析器可以正确使用ESLint,而ESLint不会修复与其他解析器不兼容的错误。

要指示npm模块用作解析器,请使用文件中的parser选项指定它.eslintrc。例如,以下指定使用Esprima而不是Espree:

{ "parser": "esprima", "rules": { "semi": "error" } }

以下解析器与ESLint兼容:

请注意,在使用自定义分析器时,parserOptions默认情况下,ESLint仍然需要配置属性才能正常使用不属于ECMAScript 5的功能。解析器全部通过parserOptions,可能会或可能不会使用它们来确定启用哪些功能。

指定环境

环境定义了预定义的全局变量。可用的环境是:

  • browser - 浏览器全局变量。

这些环境并不相互排斥,因此您可以一次定义多个环境。

可以在文件内部,配置文件中或使用--env命令行标志指定环境。

要在JavaScript文件中使用注释指定环境,请使用以下格式:

/* eslint-env node, mocha */

这使Node.js和Mocha环境成为可能。

要指定配置文件中的环境,请使用该env键,并通过设置每个环境来指定要启用的环境true。例如,以下启用浏览器和Node.js环境:

{ "env": { "browser": true, "node": true } }

或者在一个package.json文件中

{ "name": "mypackage", "version": "0.0.1", "eslintConfig": { "env": { "browser": true, "node": true } } }

而在YAML中:

--- env: browser: true node: true

如果您想使用插件中的环境,请务必在plugins数组中指定插件名称,然后使用前缀不变的插件名称,后跟斜杠,后跟环境名称。例如:

{ "plugins": ["example"], "env": { "example/custom": true } }

或者在一个package.json文件中

{ "name": "mypackage", "version": "0.0.1", "eslintConfig": { "plugins": ["example"], "env": { "example/custom": true } } }

而在YAML中:

--- plugins: - example env: example/custom: true

指定全局

no-undef规则将对已访问但未在同一文件中定义的变量发出警告。如果你在一个文件中使用全局变量,那么定义这些全局变量是值得的,这样ESLint就不会警告它们的用法。您可以使用文件内部的注释或配置文件来定义全局变量。

要在JavaScript文件中使用注释来指定全局变量,请使用以下格式:

/* global var1, var2 */

这定义了两个全局变量,var1并且var2。如果你想要选择指定这些全局变量永远不应该被写入(只读),那么你可以设置每个false标志:

/* global var1:false, var2:false */

要在配置文件中配置全局变量,请使用globals键并指示要使用的全局变量。将每个全局变量名称设置为等于以true允许覆盖变量或false禁止覆盖。例如:

{ "globals": { "var1": true, "var2": false } }

而在YAML中:

--- globals: var1: true var2: false

这些示例允许var1在代码中被覆盖,但不允许使用它var2

注意:启用no-global-assign规则禁止修改代码中的只读全局变量。

配置插件

ESLint支持使用第三方插件。在使用插件之前,您必须使用npm进行安装。

要在配置文件中配置插件,请使用plugins包含插件名称列表的密钥。该eslint-plugin-前缀可以从插件名称被省略。

{ "plugins": [ "plugin1", "eslint-plugin-plugin2" ] }

而在YAML中:

--- plugins: - plugin1 - eslint-plugin-plugin2

注意:由于Node的require功能行为,全局安装的ESLint实例只能使用全局安装的ESLint插件,本地安装的版本只能使用本地安装的插件。不支持混合本地和全局插件。

配置规则

ESLint带有大量的规则。您可以使用配置注释或配置文件来修改项目使用的规则。要更改规则设置,您必须将规则ID设置为等于以下值之一:

  • "off"或者0- 关闭规则

要使用配置注释配置文件内部的规则,请使用以下格式的注释:

/* eslint eqeqeq: "off", curly: "error" */

在这个例子中,eqeqeq它被关闭并curly作为错误打开。您也可以使用等同于规则严重性的数字:

/* eslint eqeqeq: 0, curly: 2 */

这个例子与最后一个例子相同,只是它使用数字代码而不是字符串值。该eqeqeq规则是关闭的,该curly规则设置为是一个错误。

如果规则具有其他选项,则可以使用数组文字语法来指定它们,例如:

/* eslint quotes: ["error", "double"], curly: 2 */

该评论为quotes规则指定了“双重”选项。数组中的第一项始终是规则严重性(数字或字符串)。

要在配置文件内部配置规则,请使用该rules键以及错误级别以及要使用的任何选项。例如:

{ "rules": { "eqeqeq": "off", "curly": "error", "quotes": ["error", "double"] } }

而在YAML中:

--- rules: eqeqeq: off curly: error quotes: - error - double

要配置在插件中定义的规则,必须在规则ID前加上插件名称和a /。例如:

{ "plugins": [ "plugin1" ], "rules": { "eqeqeq": "off", "curly": "error", "quotes": ["error", "double"], "plugin1/rule1": "error" } }

而在YAML中:

--- plugins: - plugin1 rules: eqeqeq: 0 curly: error quotes: - error - "double" plugin1/rule1: error

在这些配置文件中,规则plugin1/rule1来自名为的插件plugin1。您还可以将此格式与配置注释一起使用,例如:

/* eslint "plugin1/rule1": "error" */

注意:从插件中指定规则时,请确保省略eslint-plugin-。ESLint在内部仅使用前缀名来查找规则。

通过内嵌评论禁用规则

要临时禁用文件中的规则警告,请按以下格式使用块注释:

/* eslint-disable */ alert('foo' /* eslint-enable */

您还可以禁用或启用特定规则的警告:

/* eslint-disable no-alert, no-console */ alert('foo' console.log('bar' /* eslint-enable no-alert, no-console */

要在整个文件中禁用规则警告,请在文件/* eslint-disable */顶部放置块注释:

/* eslint-disable */ alert('foo'

您还可以禁用或启用整个文件的特定规则:

/* eslint-disable no-alert */ alert('foo'

要禁用特定行上的所有规则,请使用以下格式之一的行注释:

alert('foo' // eslint-disable-line // eslint-disable-next-line alert('foo'

要禁用特定线路上的特定规则

alert('foo' // eslint-disable-line no-alert // eslint-disable-next-line no-alert alert('foo'

要禁用特定行上的多个规则

alert('foo' // eslint-disable-line no-alert, quotes, semi // eslint-disable-next-line no-alert, quotes, semi alert('foo'

所有上述方法也适用于插件规则。例如,要禁用eslint-plugin-examplerule-name规则,结合插件的名称(example)和规则的名称(rule-name)为example/rule-name

foo( // eslint-disable-line example/rule-name

注意:为文件的一部分禁用警告的注释告诉ESLint不要报告禁用代码的规则违规。然而,ESLint仍然会解析整个文件,因此禁用的代码仍然需要语法上有效的JavaScript。

添加共享设置

ESLint支持将共享设置添加到配置文件中。您可以将settings对象添加到ESLint配置文件,并将其提供给每个将执行的规则。如果您要添加自定义规则并希望他们可以访问相同的信息并且可以轻松配置,这可能很有用。

在JSON中:

{ "settings": { "sharedData": "Hello" } }

而在YAML中:

--- settings: sharedData: "Hello"

使用配置文件

有两种使用配置文件的方法。首先是将文件保存到任意位置,然后使用该-c选项将其位置传递给CLI ,例如:

eslint -c myconfig.json myfiletotest.js

第二种使用配置文件的方式是通过.eslintrc.*package.json文件。ESLint将自动在待分配文件的目录中以及在连续的父目录中一直到文件系统的根目录中查找它们。当您需要对项目的不同部分进行不同配置时,或者希望其他人能够直接使用ESLint而无需记住传入配置文件时,此选项非常有用。

在每种情况下,配置文件中的设置都会覆盖默认设置。

配置文件格式

ESLint支持多种格式的配置文件:

  • JavaScript - 使用.eslintrc.js并导出包含您的配置的对象。

如果在同一目录中有多个配置文件,ESLint将只使用一个。优先顺序是:

  • .eslintrc.js

配置级联和层次结构

当使用.eslintrc.*package.json文件进行配置时,您可以利用配置级联。例如,假设你有以下结构:

your-project ├── .eslintrc ├── lib │ └── source.js └─┬ tests ├── .eslintrc └── test.js

配置级联的工作原理是使用最接近.eslintrc文件的文件作为最高优先级,然后使用父目录中的任何配置文件,依此类推。在此项目上运行ESLint时,所有文件都lib/将使用.eslintrc项目根目录中的文件作为其配置。当ESLint遍历到tests/目录中时,它将your-project/tests/.eslintrc另外使用your-project/.eslintrc。因此your-project/tests/test.js,基于.eslintrc目录层次结构中的两个文件的组合,最接近的优先级。通过这种方式,您可以拥有项目级别的ESLint设置,并且还具有特定于目录的覆盖。

同样,如果package.json根目录中有一个文件带有一个eslintConfig字段,那么它描述的配置将应用于其下的所有子目录,但.eslintrc在tests目录中的文件所描述的配置将会在有冲突的规范的地方覆盖它。

your-project ├── package.json ├── lib │ └── source.js └─┬ tests ├── .eslintrc └── test.js

如果在同一个目录中找到.eslintrcpackage.json找到一个文件,.eslintrc将会优先考虑,并且package.json不会使用文件。

注意:如果您的主目录(~/.eslintrc)中有个人配置文件,则只有在找不到其他配置文件时才会使用它。由于个人配置适用于用户目录中的所有内容,包括第三方代码,因此运行ESLint时可能会导致问题。

默认情况下,ESLint将在所有父文件夹中查找根目录中的配置文件。如果您希望所有项目都遵循特定惯例,但有时会导致意想不到的结果,这会非常有用。要将ESLint限制为特定项目,请将其"root": true放在文件的eslintConfig字段内package.json.eslintrc.*项目根目录下的文件中。一旦找到配置,ESLint将停止在父文件夹中查找"root": true

{ "root": true }

而在YAML中:

--- root: true

例如,考虑在目录中的文件中设置了projectA哪些内容。在这种情况下,虽然linting 会使用内部配置,但文件不会。"root": true.eslintrclib/main.jslib/.eslintrcprojectA/

home └── user ├── .eslintrc <- Always skipped if other configs present └── projectA ├── .eslintrc <- Not used └── lib ├── .eslintrc <- { "root": true } └── main.js

从最高优先级到最低优先级的完整配置层次如下:

  • 内联配置

扩展配置文件

配置文件可以从基本配置扩展启用的规则集。

extends属性值是:

  • 一个指定配置的字符串

ESLint递归地扩展配置,因此基础配置也可以有一个extends属性。

rules属性可以执行以下任何操作来扩展(或覆盖)一组规则:

  • 启用其他规则

运用 "eslint:recommended"

一个extends属性值"eslint:recommended"使那报告常见的问题,其中有规则页面上的复选标记核心规则的一个子集。推荐的子集只能在主要版本的ESLint中更改。

如果您的配置扩展了建议的规则:在升级到较新的主要版本的ESLint之后,请--fix在命令行上使用该选项之前查看报告的问题,以了解新的可修复推荐规则是否会更改代码。

eslint --init命令可以创建配置,以便您可以扩展推荐的规则。

JavaScript格式的配置文件示例:

module.exports = { "extends": "eslint:recommended", "rules": { // enable additional rules "indent": ["error", 4], "linebreak-style": ["error", "unix"], "quotes": ["error", "double"], "semi": ["error", "always"], // override default options for rules from base configurations "comma-dangle": ["error", "always"], "no-cond-assign": ["error", "always"], // disable rules from base configurations "no-console": "off", } }

使用可共享配置包

可共享的配置是一个NPM包出口的结构对象。确保软件包已安装到ESLint可能需要的目录。

extends属性值可以省略eslint-config-包名称的前缀。

eslint --init命令可以创建配置,以便扩展流行的样式指南(例如,eslint-config-standard)。

YAML格式的配置文件示例:

extends: standard rules: comma-dangle: - error - always no-empty: warn

使用插件中的配置

一个插件是一个通常导出规则的npm包。一些插件还可以导出一个或多个命名配置。确保软件包已安装到ESLint可能需要的目录。

plugins属性值可以省略eslint-plugin-包名称的前缀。

extends属性值可以包括:

  • plugin:

JSON格式的配置文件示例:

{ "plugins": [ "react" ], "extends": [ "eslint:recommended", "plugin:react/recommended" ], "rules": { "no-set-state": "off" } }

使用配置文件

extends属性值可以是一个基本配置文件的绝对或相对路径。

ESLint解析相对于使用它的配置文件的基本配置文件的相对路径,除非该文件位于您的主目录或者不是ESLint安装目录(本地或全局)的祖先目录。在这种情况下,ESLint解析为相对于LINTED基本文件的相对路径项目目录(通常为当前工作目录)。

JSON格式的配置文件示例:

{ "extends": [ "./node_modules/coding-standard/eslintDefaults.js", "./node_modules/coding-standard/.eslintrc-es6", "./node_modules/coding-standard/.eslintrc-jsx" ], "rules": { "eqeqeq": "warn" } }

运用 "eslint:all"

extends属性值可以"eslint:all"用于启用当前安装的ESLint版本中的所有核心规则。核心规则集可以在任何次要或主要版本的ESLint中更改。

重要提示:不建议将此配置用于生产用途,因为它随ESLint的每个次要版本和主要版本而变化。使用风险自负。

如果您将ESLint配置为在升级时自动启用新规则,则ESLint可以在没有更改源代码时报告新问题,因此任何较新的次要版本的ESLint都可以表现得好像它有重大更改。

您可以启用所有核心规则,作为决定项目配置时探索规则和选项的捷径,特别是在很少覆盖选项或禁用规则的情况下。规则的默认选项不是由ESLint认可的(例如,quotes规则的默认选项并不意味着双引号比单引号更好)。

如果您的配置扩展了所有核心规则:在升级到较新的主要或次要版本的ESLint之后,请在使用--fix命令行上的选项之前查看报告的问题,以便知道新的可修复规则是否会更改代码。

JavaScript格式的配置文件示例:

module.exports = { "extends": "eslint:all", "rules": { // override default options "comma-dangle": ["error", "always"], "indent": ["error", 2], "no-cond-assign": ["error", "always"], // disable now, but enable in the future "one-var": "off", // ["error", "never"] // disable "init-declarations": "off", "no-console": "off", "no-inline-comments": "off", } }

基于Glob模式的配置

有时需要更好的控制配置,例如,如果同一目录内的文件配置必须不同。因此,您可以在该overrides密钥下提供配置,该配置仅适用于与特定全局模式匹配的文件,使用您将在命令行上传递的相同格式(例如,app/**/*.test.js)。

怎么运行的

  • 全局模式覆盖只能在配置文件(.eslintrc.*package.json)中配置。

相对全局模式

project-root ├── app │ ├── lib │ │ ├── foo.js │ │ ├── fooSpec.js │ ├── components │ │ ├── bar.js │ │ ├── barSpec.js │ ├── .eslintrc.json ├── server │ ├── server.js │ ├── serverSpec.js ├── .eslintrc.json

config中app/.eslintrc.json定义了glob模式**/*Spec.js。这个模式是相对于基础目录的app/.eslintrc.json。所以,这种模式可以匹配app/lib/fooSpec.jsapp/components/barSpec.js不是 server/serverSpec.js。如果您在.eslintrc.json文件project-root夹内的文件中定义了相同的模式,它将匹配所有三个*Spec文件。

示例配置

在你的.eslintrc.json

{ "rules": { "quotes": [ 2, "double" ] }, "overrides": [ { "files": [ "bin/*.js", "lib/*.js" ], "excludedFiles": "*.test.js", "rules": { "quotes": [ 2, "single" ] } } ] }

配置文件中的注释

JSON和YAML配置文件格式都支持注释(package.json文件不应包含它们)。您可以在任何一种文件中使用JavaScript风格的评论或YAML风格的评论,ESLint会安全地忽略它们。这使您的配置文件更加人性化。例如:

{ "env": { "browser": true }, "rules": { // Override our default settings just for this directory "eqeqeq": "warn", "strict": "off" } }

指定Lint的文件扩展名

目前,唯一告诉ESLint哪些文件扩展名为lint的方法是使用--ext命令行选项指定逗号分隔的扩展列表。请注意,此标志只与目录结合使用,如果与文件名或全局模式一起使用,则该标志将被忽略。

忽略文件和目录

您可以通过.eslintignore在项目的根目录中创建一个文件来告诉ESLint忽略特定的文件和目录。该.eslintignore文件是一个纯文本文件,其中每行都是一个glob模式,指示应该从linting中省略哪些路径。例如,以下将省略所有JavaScript文件:

**/*.js

当ESLint运行时,它会在当前工作目录中查找.eslintignore文件,然后确定要将哪些文件设置为lint。如果找到该文件,那么在遍历目录时应用这些首选项。一次只能使用一个.eslintignore文件,因此.eslintignore不会使用当前工作目录中的文件以外的文件。

Globes使用节点忽略进行匹配,因此可以使用许多功能:

  • 开头的行#被视为注释,不会影响忽略模式。

除了.eslintignore文件中的任何模式之外,ESLint始终忽略/node_modules/*和中的文件/bower_components/*

例如,将下列.eslintignore文件中的当前工作目录会不顾一切的node_modulesbower_components和任何在build/不同的目录build/index.js

# /node_modules/* and /bower_components/* ignored by default # Ignore built files except build/index.js build/* !build/index.js

使用替代文件

如果您希望使用.eslintignore与当前工作目录不同的文件,可以使用该--ignore-path选项在命令行上指定它。例如,您可以使用.jshintignore文件,因为它具有相同的格式:

eslint --ignore-path .jshintignore file.js

你也可以使用你的.gitignore文件:

eslint --ignore-path .gitignore file.js

任何遵循标准忽略文件格式的文件都可以使用。请记住,指定--ignore-path意味着.eslintignore不会使用任何现有文件。请注意,.eslintignore遵循这些规则的通配符规则.gitignore

在package.json中使用eslintIgnore

如果.eslintignore未找到文件并且未指定备用文件,ESLint将在package.json中查找eslintIgnore密钥以检查要忽略的文件。

{ "name": "mypackage", "version": "0.0.1", "eslintConfig": { "env": { "browser": true, "node": true } }, "eslintIgnore": ["hello.js", "world.js"] }

忽略的文件警告

当您将目录传递给ESLint时,文件和目录将被忽略。如果您将特定文件传递给ESLint,则会看到一条警告,指出该文件已被跳过。例如,假设你有一个如下所示的.eslintignore文件:

foo.js

然后你运行:

eslint foo.js

你会看到这个警告:

foo.js 0:0 warning File ignored because of your .eslintignore file. Use --no-ignore to override. ✖ 1 problem (0 errors, 1 warning)

出现此消息是因为ESLint不确定您是否想要真正擦除文件。如消息所示,您可以使用--no-ignore忽略使用忽略规则。