JavaScript
Node.js
ESLint

ESLint v6.0.0 の変更点まとめ

v5.16.0 | 次 (未定)

ESLint 6.0.0-alpha.0 がリリースされました。

以後、6.0.0 安定版リリースまでの間、この記事に変更内容をまとめていきます。

プレリリースであるため、インストールには@nextタグが必要です。

npm install --save-dev eslint@next

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



  • :information_source: 6.0.0-alpha.0では、まだ一部の非互換な変更がマージされていません。状況はプロジェクトボードで確認できます。

互換性のない変更 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) が無効化され、より厳密な構文解釈が行われるようになります。

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


§ 設定のrulesプロパティが存在しないルールを無効にする場合にエラーを投げるようになりました。

🔖 #9505

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


.eslintrc.json

{

"rules": {
"non-existence-rule": "off"
}
}


§ 設定の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 からは、あなたの設定ファイルに書かれた設定は常に共有設定より優先されます。


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

🔖 #11509, #11370, RFC #17

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

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

TODO: ドキュメントへのリンク


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

🔖 #11599, #11473

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


§ 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設定が不足している不完全な設定が新たにエラーになる可能性があります。


✨ 本体への機能追加

特になし。


💡 新しいルール

特になし。


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


§ function-paren-newline "multiline-arguments"

🔖 #11406

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


🎨 その他の変更

特になし。