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.json
ESLint配置信息位于同一目录中,请将您的配置合并到其中一个文件中。
内置的全局变量
在2.0.0之前,这被标准化为ES6的一部分,新的全局变量,例如Promise
,Map
,Set
,和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
- 启用let
和const
(又名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
}
}
那么你应该移动ecmaFeatures
到parserOptions
:
{
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
,请重写以检查sourceType
Program节点的属性"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#resolved
是null
处有引用 。所以由于这种变化,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-lines
或func-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.x
,eslint: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
构造函数设置true
为this.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
对插件的支持。
解决方法:
如果您在配置文件中使用插件,则需要在配置文件中手动启用插件规则。