Help us understand the problem. What is going on with this article?

ESLint v6.0.0 の変更点まとめ

More than 1 year has passed since last update.

v5.16.0 | 次 v6.1.0

ESLint 6.0.0 がリリースされました。

既存の機能を改善するための非互換な変更があります。特に、グローバル インストール (npm install -g) された ESLint コマンドを利用している場合、今まで通りには利用できない可能性が高いです。逆に、ローカル インストールを利用している場合はほとんど変化を感じないかもしれません。

また、先日の TC39 会議Dynamic ImportsBigInt が採択されたため、ESLint でもそれら構文の実装が開始しました。進捗状況は #11803 をご覧ください。

互換性のない変更 for ユーザー:

互換性のない変更 for プラグイン開発者:

互換性のない変更 for 連携ツール開発者:

マイグレーション ガイド:

リリースノート:

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

🏢 日本語 Issue 管理リポジトリ
👫 日本語サポート チャット
🏢 本家リポジトリ
👫 本家サポート チャット

💥 互換性のない変更

§ Node.js 6.x のサポートを終了しました。

🔖 #11557, #11456, #11022

Node.js 6 は 4 月 30 日に寿命を迎えました。これに伴い、ESLint は Node.js 6 のサポートを終了しました。

新たなサポート範囲は以下の通りです。

  • Node.js 8 (8.10.0 以上)
  • Node.js 10 (10.13.0 以上)
  • Node.js 11 以降 (11.10.1 以上)

§ プラグインの読み込み方が大幅に変更されました。

🔖 #11388, #10125, RFC #7

従来は ESLint がインストールされた場所を基準に (即ち、ESLint がインストールされた node_modules ディレクトリから) プラグインを読み込んでいました。これは babel 等の一緒に使われることが多いツール群とは異なる振る舞いであり、混乱の原因になっていました。また、lernaYarn Plug n' Play 等の特定の環境下で ESLint が正常に動作しない原因にもなっていました。

そのため、ESLint 6 からはこの動作が変更され、常にプロジェクト ローカル (より厳密には $CWD/node_modules とその祖先ディレクトリ) からプラグインを読み込むようになりました。

これまでグローバル インストールされた ESLint とプラグインを利用していた方は、利用方法を変更する必要があります。ESLint とプラグイン類をプロジェクト毎にインストールし、コマンドは eslint-cli 等を利用する事をお勧めします。

§ eslint:recommendedに含まれるルールが更新されました。

🔖 #11518, #11357, #10873, #10768

以下のルールが新たに有効になりました。

  • no-async-promise-executor Promiseクラスのコンストラクタに渡す関数が非同期関数だった場合に警告します。その関数内で例外がスローされた場合にプログラムがクラッシュする (正確には unhandledRejection が発生する) ためです。
  • no-misleading-character-class 正規表現の文字クラスに複数のコードポイントから構成される文字がある場合に警告します。それは正しく解釈されないためです。
  • no-prototype-builtins hasOwnPropertyのようなObjectクラスの一部メソッドを警告します。オブジェクトをMap的に使う場合はObjectクラスのメソッドを持っていないObject.create(null)が好まれるためです。現代ではMapクラスを利用するのが良いでしょう。
  • no-shadow-restricted-names undefined等の重要な変数のシャドーイングを警告します。
  • no-useless-catch 無駄なcatch句を警告します。
  • no-with with構文を警告します。
  • require-atomic-updates 非同期関数にて、共有変数がアトミックに変更されない場合に警告します。

以下のルールが有効にならなくなりました。

  • no-console このルールは多くの場合に有用ですが (例えば、誤ってデバッグ用の記述をプロダクション コードに残さないようにする)、CLI プログラムなどconsole.logが有効なケースもあるため、推奨設定から外されました。

また、従来のeslint:recommendedには推奨以外のルールを無効にする設定が含まれていました。ESLint 6 からは、eslint:recommendedはいかなるルールも無効にしません。推奨されるルールを有効にするだけです。

§ no-redeclare ルールのチェックがより厳しくなりました。

🔖 #11509, #11405, #11370

  1. no-redeclare ルールのbuiltinGlobalsオプションがデフォルトで有効になりました。グローバル スコープでの変数定義が、設定ファイルで定義したグローバル変数と同じ名前の時に再定義エラーとなります。
  2. /*globals xxx*/のようなコメントによるグローバル変数定義と、他のグローバル変数定義との再宣言をチェックするようになりました。
/*globals Object */ "ERROR: Object は既に定義されています。"

§ comma-dangle ルールのチェックがより厳しくなりました。

🔖 #11519, #11502

comma-dangle ルールのfunctionsオプションがデフォルトで有効になりました。

§ オプションに正規表現を指定できるルールが正規表現構文の誤りに厳しくなりました。

🔖 #11516, #11423

オプションに正規表現パターンを指定できるすべてのルールについて、その正規表現をuフラグがついているものとして解釈するようになりました。これによりサロゲート ペアを正しく扱えるようになるほか、ブラウザ互換性のための緩い構文解釈 (a.k.a. Annex B) が無効化され、より厳密な構文解釈が行われるようになります。

以下のルールが影響を受けます。

§ 設定のparserOptionsプロパティが不正な値にエラーを投げるようになりました。

🔖 #11610, #9687, espree #412, espree #384

  1. sourceType: "module" を指定したにもかかわらず、ecmaVersion5 以下であった (未指定を含む) 場合にエラーになります。ES Modules は ecmaVersion: 2015 とそれ以降のみ利用可能です。
  2. ecmaVersion が不正な値の時にエラーになります。
  3. sourceType が不正な値の時にエラーになります。

なお、これらのエラーはデフォルトのパーサーを利用している場合のみ発生します。

§ 設定のglobalsプロパティが不正な値にエラーを投げるようになりました。

🔖 #11517, #11338 (comment)

設定ファイルのglobals項目について、昔はtrue/falseによって書き込み可能かどうかを指定していました。そして、互換性のために、不正な値も許可されていました (暗黙の型変換でtrueになると書き込み可能として)。

ESLint 6 では、不正な値はエラーになります。厳密には以下の値だけが許可されます。

  • 公式の設定値
    • "writable" (読み書き可能)
    • "readonly" (読み取り専用)
    • "off" (未定義にする)
  • 互換性のために許可される値
    • "writeable" (読み書き可能)
    • "readable" (読み取り専用)
    • "true" (読み書き可能)
    • "false" (読み取り専用)
    • true (読み書き可能)
    • false (読み取り専用)

§ 設定のoverrides[].filesプロパティが dotfiles にマッチするようになりました。

🔖 #11225, #11201

.eslintrc.yml
overrides:
  - files: ["*.ts"]
    parser: "typescript-eslint-parser"

従来は、上記設定は.で始まる TypeScript ファイル (例: .foo.ts) にはマッチしませんでした。ESLint 6 からはマッチするようになります。

§ 設定のexperimentalObjectRestSpreadプロパティが削除されました。

🔖 #11420, #9990

ESLint 5 から非推奨になっていたexperimentalObjectRestSpread設定が削除されました。ecmaVersion: 2018をご利用ください。

§ 共有設定のoverridesプロパティ内の項目が、それをextendsする設定ファイルの項目を上書きしなくなりました。

🔖 #11546, #11510

従来は、共有設定のoverrides内にある設定を普通に書くと、その設定は黙って無視されていました。

extendee.yml
overrides:
  - files: "*.js"
    rules:
      no-console: error
extender.yml
extends: "./extendee.yml"
rules:
  no-console: off # extendee の設定で上書きされてしまう

ESLint 6 からは、あなたの設定ファイルに書かれた設定は常に共有設定より優先されます。

§ /*eslint*/コメントが存在しないルールを無効にする場合にエラーを表示するようになりました。

🔖 #11742, #9505

以下のような、存在しないルールに対する無効化設定は、従来は無視されていました。ESLint 6 からはエラーになります。

/*eslint no-consolw: off */
console.log("typo")

§ スコープ解析 API の中にあるeslintExplicitGlobalCommentプロパティが削除されました。

🔖 #11509, #11370, RFC #17

ESLint のスコープ解析機能の変数オブジェクトが持っていたeslintExplicitGlobalCommentプロパティが削除されました。このプロパティはこれまで正式にドキュメントに書かれたことはありません。

もし、あなたのルールがこのプロパティを利用していた場合、新たに追加されたeslintExplicitGlobalCommentsプロパティを利用するよう修正してください。

§ ルールのオプション スキーマが不正なデフォルト値を持つ場合にエラーを投げるようになりました。

🔖 #11599, #11473

ESLint v5.14.0 から各ルールの schema 定義でデフォルト値を指定できるようになりましたが、このデフォルト値の書き方が不正な場合にRuleTesterがエラーを出力するようになりました。

§ テストのparserプロパティが絶対パスを必要とするようになりました。

🔖 #11761, #11728

従来はテストケースのparserプロパティにパッケージ名を指定することができましが、テスターは自身がどこから実行されているのか知らないため、どこからパッケージを読み込めば良いのか不明瞭でした。6.0.0 からは絶対パスを渡さなければならなくなりました。

  tester.run("foo", rule, {
      valid: [
          {
              "code": "console.log()",
-             "parser": "babel-eslint",
+             "parser": require.resolve("babel-eslint"),
          },
      ],
      invalid: [],
  })

require.resolve()関数を利用する事で、パッケージをテスターを実行しているファイルから相対的に解決することができます。

§ Linterクラスはカスタムパーサーを自動的に読み込まなくなりました。

🔖 #11388, RFC #7

従来はLinter#verify(code, config)メソッドに渡した設定が未知のパーサーを持っていた場合、require(config.parser)を試みてパーサーを読み込んでいました。この動作が削除されました。

あなたの連携ツールがこの動作に依存していた場合、事前にLinter#defineParser(id,parser)メソッドを用いてパーサーを定義するように修正してください。

§ CLIEngineクラスは過去に利用したプラグインを保持しなくなりました。

🔖 #11546

従来はCLIEngineクラスが過去の検証で利用したプラグインを保持していて、同じインスタンスを使い回す場合に、設定ファイルにpluginsキーがなかったとしても、過去に利用したプラグインを利用できてしまっていました。

ESLint v6.0.0 からは、過去に利用したプラグインを保持しなくなりました。そのため、CLIEngineインスタンスを再利用している場合に、plugins設定が不足している不完全な設定が新たにエラーになる可能性があります。

✨ 本体への機能追加

§ Glob-based 設定がextendsをサポートしました。

🔖 #11554, #8813

設定ファイルのoverridesプロパティの中で、extendsとネストしたoverridesを利用できるようになりました (やっと!)。

rules:
  # 省略
overrides:
  - files: "*.ts"
    extends: plugin:@typescript-eslint/recommended

§ プラグイン プリプロセッサを改善しました。

🔖 #11552, #11035, RFC #3

従来のプリプロセッサ機能には、Markdown ファイルの中の Vue.js コードをリントしたい、等の、JavaScript 以外のファイルの中の JavaScript 以外のコードブロックを扱う方法がありませんでした。

6.0.0 では名前付きコードブロックをサポートし、コードブロックの名前 (例: example.md/block01.vue) に基づいて多重にプリプロセッサを適用できるようになりました。

詳細はドキュメントを参照ください。

§ プラグインを読み込むディレクトリを変更する CLI オプションが追加されました。

🔖 #11696, RFC #18

プラグインを読み込むディレクトリを変更するための CLI オプション --resolve-plugins-relative-to が追加されました。例えば $(npm prefix -g) を指定すると、グローバル インストールされたプラグインを読み込むようになります。

💡 新しいルール

特になし。

🔧 オプションが追加されたルール

§ new-parens "never"

🔖 #11379

new式の括弧が省略可能な場合に必ず省略するように矯正するオプションが追加されました。

/*eslint new-parans: [error, never] */

//✘ BAD
const a = new Array()

//✔ GOOD
const b = new Array
const c = new Array(3)

§ function-paren-newline "multiline-arguments"

🔖 #11406

"multiline"オプションと同様に動作するが、引数が1個の場合は括弧の内側の改行を許可するオプション? が追加されました。

§ sort-keys "minKeys"

🔖 #11625

オブジェクトのプロパティが指定数未満だった場合にソートしないオプションが追加されました。

/*eslint sort-keys: [error, asc, {minKeys: 3}] */

//✘ BAD
const obj1 = {
    b: 1,
    a: 0,
    c: 2,
}

//✔ GOOD
const obj2 = {
    b: 1,
    a: 0,
}

🎨 その他の変更

§ no-div-regex ルールが自動修正をサポートしました。

🔖 #11744

const pattern = /=foo/;
// ↓↓↓↓ fixed to ↓↓↓↓
const pattern = /[=]foo/;
mysticatea
ESLint のメンテナ。Vue.js の開発チームメンバー。JavaScript 言語仕様書 ECMA-262 や JavaScript 構文解析器 Acorn のコントリビューター。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした