重い腰を上げてESLintを使い始めた。そろそろv1.0.0になるらしい。これは良いなと思ったところを簡単にまとめておく。ついでに引っかかって対処にちょっと悩んだところも。既にすごく好感触なので、このまま素直に乗り換えられると良いな。

package.jsonに設定が書ける

外部設定ファイルとしては.eslinrcの他にもpackage.jsonに混ぜ込むこともできる。フィールド名はeslintConfigで、それ以下は同じ。

{
  "eslintConfig": {
    "env": {
      "node": true
    }
  }
}

通常のnpmパッケージでは別にした方が良さそうだが、依存解決にnpmを使うだけとかコマンド作るためだけのようなプライベートなケースでは特に気にせず混ぜてしまって良さそう。

no-multi-spaces

複数の連続した空白が検出できる。

var a =  1;

これで警告出るのはかなり助かる。ソロエルノスキーさんには厳しそう。

no-comma-dangle

JSHintではes3オプションを有効にしないと検出できない不必要なカンマを検出できる。とにかくあのカンマを消したい人なのですごくうれしい。

curly

中括弧なしの制御構文を検出できる。一行ifとか書くなやみたいな感じで、僕はそっち派なのですごい助かる。

出現順の検出

先にvarなどで定義されているかや定義される前に関数が使われていないかなどを検出できる。他、定義済みで使われていないというケースも検出できる。メンテナンスのお供に。


あまり気にしたことがなくて対処に困ったものも挙げておく。

quotes

JSHintで一重引用符を強制されて以降、そっちを使っていたが、ESlintではデフォルトは二重引用符になっていた。書き直すのがとても面倒な気がするので、~/.eslintrcで以下のようにして一重引用符をデフォルトにしてしまった。

{
  "rules": {
    "quotes": [
      1,
      "single"
    ]
  }
}

camelcase

変数名などにアンダースコアを使えなくなり、キャメルケースで書くことを要求される。厳しいのはGruntの設定ファイルなどでアンダースコアがばんばん出てくるあたり。グローバルやファイルごとに無効にしたいところだけど、素直に引用符で括ってパスさせるのが良さそう。

no-underscore-dangle

アンダースコアで始まるまたは終わる変数やプロパティーへアクセスするだけで怒られる。ライブラリー側で使っていることもあるので、そういったファイルでのみ無効にするのが良さそう。

var _ = require('underscore');

だけは特別視されてて、現実的。

no-process-exit

Node.js (つまり"node": true)でprocess.exit()を使ってプログラムを終了しようとしていると怒られる。とりあえずは以下のようにして逃げるのも可能だが、完全に悪手っぽい。

var exit = process.exit;

if (process.argv[3] === '--version') {
  console.log('Foo v0.1.0');
  exit();
}

CLIプログラムのような完全に最上流であることを保証できるファイルのみで無効にするなら悪くはなさそう。だけど埋め込みコメントでの設定はなるべく避けた方が良いという経験則があるので、switch構文などをうまく使って書き直すのが良さそう。

他にecmaFeaturesフィールドでglobalReturnを許可してやり、process.exit()の代わりにreturnを使うという手もなくはないみたいだけど、どうなんだろう。


凶悪なルール(one-varとか)がデフォルトで無効なことが多いので、JSLintほどイラッとすることはない。しかしコード・スタイル的な面で様々なチェックが入るので、JSHintほどこれ拾えやみたいな辛さもない。肌にあっているのか快適に気持ちよく修正していけた。

無効になっているルールも機会があったら有効にしてみたいと感じるものが多い。例えば以下のルールは気になる。

歴史的な事情により今すぐJSHintを投げ捨てるということは難しい。まずは手元でESLintを使ってJSHintよりのルール(一重引用符だとか半角空白二つによるインデントだとか)でチェックし、JSHintはタスク・ランナーなどからのみ実行するようにしておくようにするのが良さそう。そうしておけばうまく機会を捉えて切り替えを断行することができるはず。