ESLint v3.0.0

前 [v2.13.0] | 次 [v3.1.0]

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">I just turned 3! <a href="https://t.co/vLGUoCy7Cn">https://t.co/vLGUoCy7Cn</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/748302044490932227">2016年6月29日</a></blockquote>

2016年 6月 30日 (日本時間) に ESLint は 3 歳の :birthday: 誕生日を迎えました。
特にイベントがあったわけではありませんが、Nicholas がちょっとした[誕生秘話](https://github.com/eslint/eslint/commit/a658d7b0e7d915750f18d666823d54ef2129a9af#commitcomment-18046669)を披露していました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">ESLint v3.0.0 released: <a href="https://t.co/keetKOrgXI">https://t.co/keetKOrgXI</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/748946805140824064">2016年7月1日</a></blockquote>

さて、その週末に ESLint 3.0.0 がリリースされました。

メジャーバージョン アップなので、互換性のない変更があります。変更内容についてはこの記事でも解説していますが、詳しくは[マイグレーション ガイド](http://eslint.org/docs/user-guide/migrating-to-3.0.0) (英語) を御覧ください。

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

|     | URI |
|:----|:----|
| :globe_with_meridians: 日本語 Issue 管理リポジトリ | https://github.com/eslint/eslint-jp |
| :speech_balloon: 日本語サポート チャット | https://gitter.im/eslint/eslint-jp |
| :globe_with_meridians: 本家リポジトリ | https://github.com/eslint/eslint |
| :speech_balloon: 本家サポート チャット | https://gitter.im/eslint/eslint |

----

# :collision: 互換性のない変更

## [#4483]: Node 4 未満のバージョンのサポートを終了

Node.js `v0.10` は9月末、Node.js `v0.12` は12月末でメンテナンス サポートが終了します (参考: https://github.com/nodejs/LTS )。これに先立って、ESLint では `v0.10` と `v0.12` のサポートを終了します。 ESLint 3 がサポートするのは Node.js `v4` 以上のバージョンとなります。

Node.js `v0.10`, `v0.12` で ESLint を実行する必要がある場合は ESLint 3 へのアップグレードをお控えください。

> Travis CI のようなツールで複数の Node バージョンでのテストを実施する場合、同じソースコードをすべての Node バージョンで ESLint によるチェックをする必要はないかもしれません。その場合は、[if-node-version](https://www.npmjs.com/package/if-node-version) のようなツールで ESLint が実行される Node バージョンを限定することもできます。

## [#5987]: ルール設定が必須になった

ESLint 2 では、設定がない状態で ESLint を実行すると構文エラーだけをチェックしていました。
ESLint 3 からは、設定がない状態で ESLint を実行すると常にエラーを表示し、`eslint --init` コマンドによって設定ファイルを作成することを促します。

    ESLint couldn't find a configuration file. To set up a configuration file for this project, please run:

        eslint --init

    ESLint looked for configuration files in <%= directory %> and its ancestors.

    If you think you already have a configuration file or if you need more help, please stop by the ESLint chat room: https://gitter.im/eslint/eslint

なお、設定ファイルが存在しない場合でも、"設定" があればこのエラーは表示されません。

例:

    $ eslint . --rule semi:error
    $ eslint . --config airbnb
    $ eslint . --no-eslintrc

## [#6021], [#6403], [#6550]: `eslint:recommended` プリセットが更新された

- [no-native-reassign] ルールが追加されました。
- [no-unsafe-finally] ルールが追加されました。
- [require-yield] ルールが追加されました。
- [comma-dangle] ルールが**削除**されました。
- [complexity] ルールのオプションが `11` から `20` へ変更されました。

ES3 環境では末尾カンマが無効な構文なので、`eslint:recommended` に [comma-dangle] ルールが入っていました。しかし、もはや必要なくなったと判断されたため削除されました。これに伴い、[comma-dangle] ルールは「エラーを防ぐルール」カテゴリから「スタイル ルール」カテゴリへ移動されました。

[complexity] ルールのオプション変更については、以前の「["eslint:recommended" がルール本来の振る舞いを変更しないようになった](http://qiita.com/mysticatea/items/8bcecd821cca9e849078#-eslintrecommended%E3%81%8C%E3%83%AB%E3%83%BC%E3%83%AB%E6%9C%AC%E6%9D%A5%E3%81%AE%E6%8C%AF%E3%82%8B%E8%88%9E%E3%81%84%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F-4809)」修正から漏れてしまっていたのを改めて修正したものです。深い意図はありません。

## [#6302]: `CLIEngine#executeOnText()` API の挙動が変更された

この API は、文字列を渡して静的検証を行う公開メソッドです。
オプションとして文字列のもととなったファイルへのパスを渡すことができます。

従来は `.eslintignore` ファイルなどで「無視するファイル」を設定してあったとしても、`CLIEngine#executeOnText()` はオプションとして渡されたファイルパスが無視すべきファイルかどうかをチェックしませんでした。無視すべきファイルかどうかチェックするのは `CLIEngine#executeOnFiles()` の方です。

しかし、`Gulp` 等のタスク ランナーから利用するのに不便とのことで、`CLIEngine#executeOnText()` でもオプションとして渡されたファイルパスが無視すべきファイルかどうかをチェックするようになりました。



# :wrench: オプションが追加されたルール

## [#6259]: [indent]

`outerIIFEBody` オプションが追加されました。
このオプションを利用すると、一番外側の即時関数はインデントなしにできます。
jQuery のスタイルガイド等がそうなっているらしいです。

```js
/*eslint indent: ["error", 4, {"outerIIFEBody": 0}]*/

// ✔ GOOD
(function() {

function foo(x) {
    return x + 1;
}

})();


// ✘ BAD
(function() {
    function foo(x) {
        return x + 1;
    }
})();
```

# :pencil: 新たに 2 つのルールが `eslint --fix` をサポートした

- [#4766]: [arrow-parens]
- [#6448]: [prefer-const] - (ただし単一の変数宣言のみ)

[v2.13.0]: http://qiita.com/mysticatea/items/22d97bdeb790683e4599
[v3.1.0]: http://qiita.com/mysticatea/items/723a467a4eb47e4913e2
[#4483]: https://github.com/eslint/eslint/issues/4483
[#4766]: https://github.com/eslint/eslint/issues/4766
[#5987]: https://github.com/eslint/eslint/issues/5987
[#6021]: https://github.com/eslint/eslint/issues/6021
[#6259]: https://github.com/eslint/eslint/issues/6259
[#6302]: https://github.com/eslint/eslint/issues/6302
[#6403]: https://github.com/eslint/eslint/issues/6403
[#6448]: https://github.com/eslint/eslint/issues/6448
[#6550]: https://github.com/eslint/eslint/issues/6550
[arrow-parens]: http://eslint.org/docs/rules/arrow-parens
[comma-dangle]: http://eslint.org/docs/rules/comma-dangle
[complexity]: http://eslint.org/docs/rules/complexity
[indent]: http://eslint.org/docs/rules/indent
[no-native-reassign]: http://eslint.org/docs/rules/no-native-reassign
[no-unsafe-finally]: http://eslint.org/docs/rules/no-unsafe-finally
[prefer-const]: http://eslint.org/docs/rules/prefer-const
[require-yield]: http://eslint.org/docs/rules/require-yield