首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Migrating to v2.0.0

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

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

规则模式更改

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

代码语言:javascript
复制
module.exports = {
    "type": "array",
    "items": [
        {
            "enum": [0, 1, 2]
        },
        {
            "enum": ["always", "never"]
        }
    ],
    "minItems": 1,
    "maxItems": 2
};

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

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

  1. 从模式中删除严重性

2. 调整minItems从1 为0

3. 通过减1来调整maxItems

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

代码语言:javascript
复制
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环境(如果尚未这样做):

代码语言:javascript
复制
// 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功能标志是:

  • classes - 启用 classes
  • modules - 启用modules和全局严格模式
  • superInFunctions- 在函数内部启用引用super

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

代码语言:javascript
复制
{
    ecmaFeatures: {
        arrowFunctions: true
    }
}

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

代码语言:javascript
复制
{
    parserOptions: {
        ecmaVersion: 6
    }
}

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

代码语言:javascript
复制
{
    ecmaFeatures: {
        jsx: true
    }
}

那么你应该移动ecmaFeaturesparserOptions

代码语言:javascript
复制
{
    parserOptions: {
        ecmaFeatures: {
            jsx: true
        }
    }
}

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

代码语言:javascript
复制
{
    ecmaFeatures: {
        modules: true
    }
}
代码语言:javascript
复制
{
    parserOptions: {
        sourceType: "module"
    }
}

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

  1. 如果您正在使用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。例如:

代码语言:javascript
复制
var ruleTester = new RuleTester();
ruleTester.run("no-var", rule, {
    valid: [
        {
            code: "let x;",
            parserOptions: { ecmaVersion: 6 }
        }
    ]
});

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

"eslint:recommended"新规则

代码语言:javascript
复制
{
    "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

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

代码语言:javascript
复制
{
    "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中定位全局变量的方法:

代码语言:javascript
复制
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对象(或任何其他全局对象)。所以前面的例子会变成这样:

代码语言:javascript
复制
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只有严重程度,如:

代码语言:javascript
复制
{
    "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。例如:

代码语言:javascript
复制
{
    "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。

代码语言:javascript
复制
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后解析源代码:

代码语言:javascript
复制
var ast = yourParser.parse(text.replace(/^\uFEFF/, ""), options);
var sourceCode = new SourceCode(text, ast);

规则变更

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

插件不再具有默认配置

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

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

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com