We're excited to announce that ESLint v6.0.0 has been released: https://t.co/EO4ZrZIMYM
— ESLint (@geteslint) 2019年6月22日
ESLint 6.0.0
がリリースされました。
既存の機能を改善するための非互換な変更があります。特に、グローバル インストール (npm install -g
) された ESLint コマンドを利用している場合、今まで通りには利用できない可能性が高いです。逆に、ローカル インストールを利用している場合はほとんど変化を感じないかもしれません。
また、先日の TC39 会議で Dynamic Imports と BigInt が採択されたため、ESLint でもそれら構文の実装が開始しました。進捗状況は #11803 をご覧ください。
互換性のない変更 for ユーザー:
- Node.js 6.x のサポートを終了しました。
- プラグインの読み込み方が大幅に変更されました。
eslint:recommended
に含まれるルールが更新されました。- no-redeclare ルールのチェックがより厳しくなりました。
- comma-dangle ルールのチェックがより厳しくなりました。
- オプションに正規表現を指定できるルールが正規表現構文の誤りに厳しくなりました。
- 設定の
parserOptions
プロパティが不正な値にエラーを投げるようになりました。 - 設定の
globals
プロパティが不正な値にエラーを投げるようになりました。 - 設定の
overrides[].files
プロパティが dotfiles にマッチするようになりました。 - 設定の
experimentalObjectRestSpread
プロパティが削除されました。 - 共有設定の
overrides
プロパティ内の項目が、それをextends
する設定ファイルの項目を上書きしなくなりました。 /*eslint*/
コメントが存在しないルールを無効にする場合にエラーを表示するようになりました。
互換性のない変更 for プラグイン開発者:
- Node.js 6.x のサポートを終了しました。
- プラグインの読み込み方が大幅に変更されました。
- スコープ解析 API の中にある
eslintExplicitGlobalComment
プロパティが削除されました。 - ルールのオプション スキーマが不正なデフォルト値を持つ場合にエラーを投げるようになりました。
- テストの
parser
プロパティが絶対パスを必要とするようになりました。
互換性のない変更 for 連携ツール開発者:
マイグレーション ガイド:
- Migrating to v6.0.0 (英語)
リリースノート:
- 2019-04-13 JST - 6.0.0-alpha.0
- 2019-04-27 JST - (canceled; みんな忙しかったので)
- 2019-05-11 JST - 6.0.0-alpha.1
- 2019-05-25 JST - 6.0.0-alpha.2 (すべての Breaking Changes がマージされました)
- 2019-06-08 JST - 6.0.0-rc.0
- 2019-06-22 JST - 6.0.0
質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。
💥 互換性のない変更
§ Node.js 6.x のサポートを終了しました。
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
以上)
§ プラグインの読み込み方が大幅に変更されました。
従来は ESLint がインストールされた場所を基準に (即ち、ESLint がインストールされた node_modules
ディレクトリから) プラグインを読み込んでいました。これは babel
等の一緒に使われることが多いツール群とは異なる振る舞いであり、混乱の原因になっていました。また、lerna や Yarn 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 ルールのチェックがより厳しくなりました。
-
no-redeclare ルールの
builtinGlobals
オプションがデフォルトで有効になりました。グローバル スコープでの変数定義が、設定ファイルで定義したグローバル変数と同じ名前の時に再定義エラーとなります。 -
/*globals xxx*/
のようなコメントによるグローバル変数定義と、他のグローバル変数定義との再宣言をチェックするようになりました。
/*globals Object */ "ERROR: Object は既に定義されています。"
§ comma-dangle ルールのチェックがより厳しくなりました。
comma-dangle ルールのfunctions
オプションがデフォルトで有効になりました。
§ オプションに正規表現を指定できるルールが正規表現構文の誤りに厳しくなりました。
オプションに正規表現パターンを指定できるすべてのルールについて、その正規表現をu
フラグがついているものとして解釈するようになりました。これによりサロゲート ペアを正しく扱えるようになるほか、ブラウザ互換性のための緩い構文解釈 (a.k.a. Annex B) が無効化され、より厳密な構文解釈が行われるようになります。
以下のルールが影響を受けます。
- camelcase
- capitalized-comments
- default-case
- dot-notation
- handle-callback-err
- id-match
- line-comment-position
- lines-around-comment
- max-len
- new-cap
- no-fallthrough
- no-unused-vars
- spaced-comment
- valid-jsdoc
§ 設定のparserOptions
プロパティが不正な値にエラーを投げるようになりました。
🔖 #11610, #9687, espree #412, espree #384
-
sourceType: "module"
を指定したにもかかわらず、ecmaVersion
が5
以下であった (未指定を含む) 場合にエラーになります。ES Modules はecmaVersion: 2015
とそれ以降のみ利用可能です。 -
ecmaVersion
が不正な値の時にエラーになります。 -
sourceType
が不正な値の時にエラーになります。
なお、これらのエラーはデフォルトのパーサーを利用している場合のみ発生します。
§ 設定のglobals
プロパティが不正な値にエラーを投げるようになりました。
設定ファイルのglobals
項目について、昔はtrue
/false
によって書き込み可能かどうかを指定していました。そして、互換性のために、不正な値も許可されていました (暗黙の型変換でtrue
になると書き込み可能として)。
ESLint 6 では、不正な値はエラーになります。厳密には以下の値だけが許可されます。
- 公式の設定値
-
"writable"
(読み書き可能) -
"readonly"
(読み取り専用) -
"off"
(未定義にする)
-
- 互換性のために許可される値
-
"writeable"
(読み書き可能) -
"readable"
(読み取り専用) -
"true"
(読み書き可能) -
"false"
(読み取り専用) -
true
(読み書き可能) -
false
(読み取り専用)
-
§ 設定のoverrides[].files
プロパティが dotfiles にマッチするようになりました。
overrides:
- files: ["*.ts"]
parser: "typescript-eslint-parser"
従来は、上記設定は.
で始まる TypeScript ファイル (例: .foo.ts
) にはマッチしませんでした。ESLint 6 からはマッチするようになります。
§ 設定のexperimentalObjectRestSpread
プロパティが削除されました。
ESLint 5 から非推奨になっていたexperimentalObjectRestSpread
設定が削除されました。ecmaVersion: 2018
をご利用ください。
§ 共有設定のoverrides
プロパティ内の項目が、それをextends
する設定ファイルの項目を上書きしなくなりました。
従来は、共有設定のoverrides
内にある設定を普通に書くと、その設定は黙って無視されていました。
overrides:
- files: "*.js"
rules:
no-console: error
extends: "./extendee.yml"
rules:
no-console: off # extendee の設定で上書きされてしまう
ESLint 6 からは、あなたの設定ファイルに書かれた設定は常に共有設定より優先されます。
§ /*eslint*/
コメントが存在しないルールを無効にする場合にエラーを表示するようになりました。
以下のような、存在しないルールに対する無効化設定は、従来は無視されていました。ESLint 6 からはエラーになります。
/*eslint no-consolw: off */
console.log("typo")
§ スコープ解析 API の中にあるeslintExplicitGlobalComment
プロパティが削除されました。
ESLint のスコープ解析機能の変数オブジェクトが持っていたeslintExplicitGlobalComment
プロパティが削除されました。このプロパティはこれまで正式にドキュメントに書かれたことはありません。
もし、あなたのルールがこのプロパティを利用していた場合、新たに追加されたeslintExplicitGlobalComments
プロパティを利用するよう修正してください。
§ ルールのオプション スキーマが不正なデフォルト値を持つ場合にエラーを投げるようになりました。
ESLint v5.14.0 から各ルールの schema
定義でデフォルト値を指定できるようになりましたが、このデフォルト値の書き方が不正な場合にRuleTester
がエラーを出力するようになりました。
§ テストのparser
プロパティが絶対パスを必要とするようになりました。
従来はテストケースのparser
プロパティにパッケージ名を指定することができましが、テスターは自身がどこから実行されているのか知らないため、どこからパッケージを読み込めば良いのか不明瞭でした。6.0.0 からは絶対パスを渡さなければならなくなりました。
tester.run("foo", rule, {
valid: [
{
"code": "console.log()",
- "parser": "babel-eslint",
+ "parser": require.resolve("babel-eslint"),
},
],
invalid: [],
})
require.resolve()
関数を利用する事で、パッケージをテスターを実行しているファイルから相対的に解決することができます。
§ Linter
クラスはカスタムパーサーを自動的に読み込まなくなりました。
従来はLinter#verify(code, config)
メソッドに渡した設定が未知のパーサーを持っていた場合、require(config.parser)
を試みてパーサーを読み込んでいました。この動作が削除されました。
あなたの連携ツールがこの動作に依存していた場合、事前にLinter#defineParser(id,parser)
メソッドを用いてパーサーを定義するように修正してください。
§ CLIEngine
クラスは過去に利用したプラグインを保持しなくなりました。
🔖 #11546
従来はCLIEngine
クラスが過去の検証で利用したプラグインを保持していて、同じインスタンスを使い回す場合に、設定ファイルにplugins
キーがなかったとしても、過去に利用したプラグインを利用できてしまっていました。
ESLint v6.0.0 からは、過去に利用したプラグインを保持しなくなりました。そのため、CLIEngine
インスタンスを再利用している場合に、plugins
設定が不足している不完全な設定が新たにエラーになる可能性があります。
✨ 本体への機能追加
§ Glob-based 設定がextends
をサポートしました。
設定ファイルのoverrides
プロパティの中で、extends
とネストしたoverrides
を利用できるようになりました (やっと!)。
rules:
# 省略
overrides:
- files: "*.ts"
extends: plugin:@typescript-eslint/recommended
§ プラグイン プリプロセッサを改善しました。
従来のプリプロセッサ機能には、Markdown ファイルの中の Vue.js コードをリントしたい、等の、JavaScript 以外のファイルの中の JavaScript 以外のコードブロックを扱う方法がありませんでした。
6.0.0 では名前付きコードブロックをサポートし、コードブロックの名前 (例: example.md/block01.vue
) に基づいて多重にプリプロセッサを適用できるようになりました。
詳細はドキュメントを参照ください。
§ プラグインを読み込むディレクトリを変更する CLI オプションが追加されました。
プラグインを読み込むディレクトリを変更するための 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/;