重い腰を上げて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ほどこれ拾えやみたいな辛さもない。肌にあっているのか快適に気持ちよく修正していけた。
無効になっているルールも機会があったら有効にしてみたいと感じるものが多い。例えば以下のルールは気になる。
- valid-jsdoc - JSDocのバリデーション
- block-scoped-var -
var
をなんとなくlet
扱いするぞ - no-process-env -
process.env
いじっちゃダメ - no-warning-comments - コメントにTODOとか書くなや
- vars-on-top -
var
はスコープの先頭にまとめてね - no-undefined - その
undefined
はundefined
なの - no-sync - 同期とかウケる
- brace-style - 中括弧の前後の改行スタイルは統一してくれ
- sort-vars - 変数はソートするとわかりやすいぞ
歴史的な事情により今すぐJSHintを投げ捨てるということは難しい。まずは手元でESLintを使ってJSHintよりのルール(一重引用符だとか半角空白二つによるインデントだとか)でチェックし、JSHintはタスク・ランナーなどからのみ実行するようにしておくようにするのが良さそう。そうしておけばうまく機会を捉えて切り替えを断行することができるはず。