Migrating to v2.0.0

迁移到v2.0.0

ESLint v2.0.0是第二个主要版本发布。因此,ESLint在0.x和1.x中的工作方式以及未来的工作方式之间会有一些重大变化。这些变化是ESLint用户社区反馈的直接结果,并且没有适当考虑升级路径。我们相信这些变化使ESLint变得更好,虽然有些工作是升级所必需的,但我们希望这种升级的麻烦足够小,使您会看到升级的好处。

重要提示:如果您从0.x升级,请参阅迁移到1.0.0作为您的出发点。

规则模式更改

由于规则模式工作方式的怪异,如果选项足够复杂,则可能需要在规则模式中考虑规则严重性(0,1或2)。这将导致一个模式,如:

module.exports = { "type": "array", "items": [ { "enum": [0, 1, 2] }, { "enum": ["always", "never"] } ], "minItems": 1, "maxItems": 2 };

这对规则制定者来说很混乱,因为规则似乎不应该负责验证自己的严重程度。在2.0.0中,规则不再需要检查自己的严重性。

解决方法:如果要导出检查严重性的规则模式,则需要进行以下更改:

  • 从模式中删除严重性

2. 调整minItems从1 为0

3. 通过减1来调整maxItems

以上是正确转换后的模式:

module.exports = { "type": "array", "items": [ { "enum": ["always", "never"] } ], "minItems": 0, "maxItems": 1 };

已删除规则

以下规则已被废弃,新规则被创建以代替它们。以下是已删除规则及其替换的列表:

  • 无箭头条件被无混淆箭头和无常数条件组合所取代。打开这两个规则以获得与no-arrow-condition相同的功能。

  • 无空标签被无标签替换为{"allowLoop": true, "allowSwitch": true}选项。

  • 空格后的关键字被替换为关键字间距。

  • 关键字之前的空格被关键字间距所取代。

  • space-return-throw-case被关键字间距所取代。

解决方法:您需要更新规则配置才能使用新规则。ESLint v2.0.0还会在您使用已删除的规则并提示替换规则时发出警告。希望这会在升级过程中感到惊喜。

配置级联更改

在2.0.0之前,如果一个目录同时包含一个.eslintrc文件和一个package.json带有ESLint配置信息的文件,则这两个文件的设置将合并在一起。在2.0.0中,只有来自.eslintrc.*文件的设置被使用,并且package.json当两者都存在时,忽略这些设置。否则,package.json仍然可以与ESLint配置一起使用,但前提是不存在其他.eslintrc.*文件。

解决方法:如果您的ESLint配置信息.eslintrc.*package.jsonESLint配置信息位于同一目录中,请将您的配置合并到其中一个文件中。

内置的全局变量

在2.0.0之前,这被标准化为ES6的一部分,新的全局变量,例如PromiseMapSet,和Symbol被列入内置的全球环境。这可能会导致潜在的问题,例如,即使在承诺无法使用的ES5代码中,也no-undef允许使用Promise构造函数。在2.0.0版本中,内置环境只包含标准ES5全局变量,而新的ES6全局变量已被移至es6环境中。

解决方法:如果您正在编写ES6代码,请启用该es6环境(如果尚未这样做):

// In your .eslintrc { env: { es6: true } } // Or in a configuration comment /*eslint-env es6*/

语言选项

在2.0.0之前,启用语言选项的方式是ecmaFeatures在您的配置中使用。在2.0.0中:

  • ecmaFeatures属性现在属于顶级parserOptions属性。

  • 所有ECMAScript 6 ecmaFeatures标志已被删除,以支持可以设置为3,5(默认)或6 的ecmaVersion属性parserOptions

  • ecmaFeatures.modules标志已被替换为在parserOptions下面可以设置为"script"(默认)或"module"ES6模块的sourceType属性。

解决方法:如果您在使用任何ECMAScript 6功能标志ecmaFeatures,您需要ecmaVersion: 6。ECMAScript 6功能标志是:

  • arrowFunctions- 启用arrow functions

  • binaryLiterals- 启用binary literals

  • blockBindings- 启用letconst(又名block bindings

  • classes - 启用 classes

  • defaultParams - 启用 default function parameters

  • destructuring - 启用 destructuring

  • forOf - 启用 for-of loops

  • generators - 启用 generators

  • modules - 启用modules和全局严格模式

  • objectLiteralComputedProperties- 启用计算对象字面值属性名称

  • objectLiteralDuplicateProperties- 在严格模式下启用重复的对象文字属性

  • objectLiteralShorthandMethods- 启用对象字面速记方法

  • objectLiteralShorthandProperties- 启用对象字面速记属性

  • octalLiterals- 启用八进制文字

  • regexUFlag- 启用正则表达式u标志

  • regexYFlag- 启用正则表达式y标志

  • restParams- 启用其余参数

  • spread- 为数组启用扩展运算符

  • superInFunctions- 在函数内部启用引用super

  • templateStrings- 启用模板字符串

  • unicodeCodePointEscapes- 启用代码点转义

如果您使用任何这些标志,例如:

{ ecmaFeatures: { arrowFunctions: true } }

然后您应该使用ecmaVersion以下命令启用ES6 :

{ parserOptions: { ecmaVersion: 6 } }

如果您在使用任何非ES6标志ecmaFeatures,则需要将其移动到内部parserOptions。例如:

{ ecmaFeatures: { jsx: true } }

那么你应该移动ecmaFeaturesparserOptions

{ parserOptions: { ecmaFeatures: { jsx: true } } }

如果您正在使用ecmaFeatures.modules这样的ES6模块支持:

{ ecmaFeatures: { modules: true } }

{ parserOptions: { sourceType: "module" } }

此外,如果您context.ecmaFeatures在规则内部使用,则需要通过以下方式更新代码:

  • 如果您正在使用ES6功能标志,例如context.ecmaFeatures.blockBindings重写进行检查context.parserOptions.ecmaVersion > 5。

2. 如果您正在使用context.ecmaFeatures.modules,请重写以检查sourceTypeProgram节点的属性"module"

3. 如果您正在使用非ES6功能标志,例如context.ecmaFeatures.jsx重写进行检查context.parserOptions.ecmaFeatures.jsx

如果您有一个带有规则的插件,并且您正在使用RuleTester,那么您还需要更新您为使用的规则传递的选项ecmaFeatures。例如:

var ruleTester = new RuleTester( ruleTester.run("no-var", rule, { valid: [ { code: "let x;", parserOptions: { ecmaVersion: 6 } } ] }

如果您没有ecmaFeatures在您的配置或custom/plugin规则和测试中使用,则不需要进行更改。

"eslint:recommended"新规则

{ "extends": "eslint:recommended" }

在2.0.0中,"eslint:recommended"添加了以下11条规则。

  • constructor-super

  • no-case-declarations

  • no-class-assign

  • no-const-assign

  • no-dupe-class-members

  • no-empty-pattern

  • no-new-symbol

  • no-self-assign

  • no-this-before-super

  • no-unexpected-multiline

  • no-unused-labels

解决:如果您不想通过这些规则得到通知,您可以简单地禁用这些规则。

{ "extends": "eslint:recommended", "rules": { "no-case-declarations": 0, "no-class-assign": 0, "no-const-assign": 0, "no-dupe-class-members": 0, "no-empty-pattern": 0, "no-new-symbol": 0, "no-self-assign": 0, "no-this-before-super": 0, "no-unexpected-multiline": 0, "no-unused-labels": 0, "constructor-super": 0 } }

范围分析变更

我们在范围分析中发现了一些需要解决的错误。具体而言,我们并没有以它们所定义的所有方式对全局变量进行适当的解释。

最初,Variable对象和Reference对象是相互引用的:

  • Variable#references属性是Reference引用变量的对象数组。

  • Reference#resolved属性是Variable被引用的对象。

但是在1.x之前,以下变量和引用在这些属性中有错误的值(空):

  • var 全球范围内的声明。

  • function 全球范围内的声明。

  • 配置文件中定义的变量。

  • /* global */注释中定义变量。

现在,这些变量和引用在这些属性中都有正确的值。

Scope#through属性在Reference#resolvednull处有引用 。所以由于这种变化,Scope#through属性的值也发生了变化。

解决方法:如果您正在使用Scope#through查找内置全局变量的引用,则需要进行一些更改。

例如,这就是你如何window在1.x中定位全局变量的方法:

var globalScope = context.getScope( globalScope.through.forEach(function(reference) { if (reference.identifier.name === "window") { checkForWindow(reference } }

这是一个找到变量的迂回方式,因为它是在ESLint的事实之后添加的。window变量已存在Scope#through内因为无法找到该定义。

在2.0.0中,window不再位于Scope#through因为我们添加了正确的声明。这意味着你可以直接引用window对象(或任何其他全局对象)。所以前面的例子会变成这样:

var globalScope = context.getScope( var variable = globalScope.set.get("window" if (variable) { variable.references.forEach(checkForWindow }

进一步阅读:http : //estools.github.io/escope/

使用时eslint:recommended的默认更改

这会影响你,如果你是从eslint:recommended,并启用no-multiple-empty-linesfunc-style只有严重程度,如:

{ "extends": "eslint:recommended", "rules": { "no-multiple-empty-lines": 2, "func-style": 2 } }

no-multiple-empty-lines规则没有默认例外,但在ESLint中1.x,应用了默认值eslint:recommended从而允许最多两个空行。

func-style规则有一个默认的配置"expression",但在ESLint 1.xeslint:recommended默认"declaration"

ESLint 2.0.0将删除这些冲突的默认设置,因此您可能会开始看到与这些规则相关的linting错误。

要解决:如果您想维护以前的行为,请通过添加{"max": 2}并更改func-style"declaration"更新您的配置no-multiple-empty-lines。例如:

{ "extends": "eslint:recommended", "rules": { "no-multiple-empty-lines": [2, {"max": 2}], "func-style": [2, "declaration"] } }

SourceCode构造函数(Node API)更改

SourceCode构造函数必须处理Unicode BOM。如果第一个参数text具有BOM,则SourceCode构造函数设置truethis.hasBOM并从文本中剥离BOM。

var SourceCode = require("eslint").SourceCode; var code = new SourceCode("\uFEFFvar foo = bar;", ast assert(code.hasBOM === true assert(code.text === "var foo = bar;"

所以第二个参数ast也应该从剥离文本中解析出来。

解决方法:如果您SourceCode在代码中使用构造函数,请在剥离BOM后解析源代码:

var ast = yourParser.parse(text.replace(/^\uFEFF/, ""), options var sourceCode = new SourceCode(text, ast

规则变更

  • strict- 默认为"safe"(以前的默认值是"function"

插件不再具有默认配置

在2.0.0之前,插件可以rulesConfig为插件指定一个插件。每当有人使用该插件,这就是ESLint确实在所有其他情况下(其中没有什么是默认的)相反会自动应用rulesConfig。为了让插件行为顺利,我们已经取消了rulesConfig对插件的支持。

解决方法:如果您在配置文件中使用插件,则需要在配置文件中手动启用插件规则。