ESLintの推奨設定(eslint:recommended)のチェック内容
前々回から引き続き、今回もESLintについて調べてみました。
ESLintの概要については、以前に公開した記事をご確認ください。
ESLintでJavaScriptの構文チェックを始める
ESLintのチェック項目の設定は手間が掛かる
ESLintは.eslintrc.jsのような設定ファイルにチェック内容を記述しなければチェックを行いません。
チェック内容は、設定ファイルのrules
プロパティに、チェック項目をひとつずつ追加することで設定することができます。
// .eslintrc.jsの設定例 module.exports = { "rules": { "indent": ["error", 4], "quotes": ["error", "double"] } }
この方法は、案件に合わせて最適なチェック項目を設定することが可能なのですが、ESLintに慣れていなければ設定に手間が掛かります。
"eslint:recommended"で推奨チェック項目だけを手軽にチェック
設定ファイルのextends
プロパティには"eslint:recommended"
という設定項目があります。
これを設定すると、チェック項目をひとつずつ追加しなくてもESLintが推奨するチェック項目でまとめてチェックすることができます。
// .eslintrc.jsの設定例 module.exports = { "extends": "eslint:recommended" }
チェック項目の設定が面倒!
チェック項目に何を設定すれば良いのかわからない!
という方は、これだけでも基本的なソースの不備を手軽にチェックできるようになります。
"eslint:recommended"で何をチェックしているのか
"eslint:recommended"
を使うことで手軽にチェックを始めることができましたが、
実際にチェックをしてエラーが発生すると、個々のエラーの内容について理解しておく必要があります。
エラーが発生する度に、必要に応じてエラー項目を調べていたのですが、
"eslint:recommended"
でどのようなチェックが行われているのか、
一通り確認してみようと思いましたので、今回はこれについて調べた内容をまとめてみました。
全部で43のチェック項目がありますが、今回は20項目をご紹介します。
残りは次の機会にご紹介できればと思います。
ESLintのチェック項目一覧
ESLintで用意されているチェック項目は下記のページにまとめられています。
■List of available rules - ESLint - Pluggable JavaScript linter
http://eslint.org/docs/rules/
表の一番左の列にチェックマークが表示されている項目がありますが、
このマークが"eslint:recommended"
で使用しているチェック項目を表しています。
"eslint:recommended" のチェック項目(v:3.13.1)
以下では、各チェック項目とエラーが発生するコードのサンプル、サンプルのコードをチェックした場合のエラー文言(他のチェック項目のエラーは除外)を記載しています。
コードのサンプルは主に公式サイトのコードを使用し、必要に応じて補足のコメントを追加しています。
下記のリストは記事作成時の最新のバージョン(3.13.1)を元にしています。
今後のバージョンアップで項目の追加・削除があると思いますのでご注意ください。
no-cond-assign
if, for, while, and do...whileの条件式で代入演算子(=など)を許可しない。
比較演算子(==,===など)のタイプミスで代入演算子が入力された箇所などを見つけてくれます。
▼ エラーコードの例
var x; if (x = 0) { // 比較演算子ではなく代入演算子になっている var b = 1; }
2:5 error Expected a conditional expression and instead saw an assignment no-cond-assign
no-console
consoleオブジェクトのメソッド(console.log等)の記述を許可しない。
公開時の消し忘れを防いでくれます。
▼ エラーコードの例
console.log("Log a debug level message."); // 公開時は不要
1:1 error Unexpected console statement no-console
no-constant-condition
if, for, while, and do...whileや三項演算子(?:)の条件式を定数式(リテラルなど)にすることを許可しない。
必ず実行されたり、一度も実行されなかったりするなど、条件文として不適切な記述が無いかチェックしてくれます。
▼ エラーコードの例
if (false) { // trueにならない条件 doSomethingUnfinished(); } if (void x) { // trueにならない条件 doSomethingUnfinished(); } for (;-2;) { // 終了しないループ doSomethingForever(); } while (typeof x) { // 終了しないループ doSomethingForever(); } do { // 終了しないループ doSomethingForever(); } while (x = -1); var result = 0 ? a : b; // 必ず「b」になる
1:1 error Unexpected constant condition no-constant-condition
5:1 error Unexpected constant condition no-constant-condition
9:1 error Unexpected constant condition no-constant-condition
13:1 error Unexpected constant condition no-constant-condition
17:1 error Unexpected constant condition no-constant-condition
21:14 error Unexpected constant condition no-constant-condition
no-control-regex
正規表現内でASCII制御文字の使用を許可しない。
ASCII制御文字が使用されることはほとんどありませんので、正規表現中に含まれる場合は間違いである可能性が高いです。
▼ エラーコードの例
var pattern1 = /\x1f/; // 「\x1f」は制御文字 var pattern2 = new RegExp("\x1f"); // 「\x1f」は制御文字
1:16 error Unexpected control character(s) in regular expression: \x1f no-control-regex
2:27 error Unexpected control character(s) in regular expression: \x1f no-control-regex
no-debugger
開発時のブレークポイントの設定などに使用するdebuggerステートメントの記述を許可しない。
公開時の消し忘れを防いでくれます。
▼ エラーコードの例
function isTruthy(x) { debugger; // 公開時は不要 return Boolean(x); }
2:5 error Unexpected 'debugger' statement no-debugger
no-dupe-args
関数宣言や関数式の引数の重複を許可しない。
引数が重複している場合、先に指定された引数の値は無視されますので、引数に同じ値を重複させる必要はありません。
▼ エラーコードの例
function foo(a, b, a) { // 「a」が重複 console.log("value of the second a:", a); } var bar = function (a, b, a) { // 「a」が重複 console.log("value of the second a:", a); };
1:1 error Duplicate param 'a' no-dupe-args
5:11 error Duplicate param 'a' no-dupe-args
no-dupe-keys
オブジェクトリテラルでキーの重複を許可しない。
先に指定されたキーの値は無視されますので、キーを重複させる必要はありません。
▼ エラーコードの例
var foo = { bar: "baz", bar: "qux" // 「bar」が重複 }; var foo = { "bar": "baz", bar: "qux" // 「bar」が重複 }; var foo = { 0x1: "baz", 1: "qux" // 「0x1」は16進数の「1」 };
3:5 error Duplicate key 'bar' no-dupe-keys
8:5 error Duplicate key 'bar' no-dupe-keys
13:5 error Duplicate key '1' no-dupe-keys
no-duplicate-case
switch文でcaseの重複を許可しない。
先に指定されたcaseの値は無視されますので、caseを重複させる必要はありません。
▼ エラーコードの例
switch (a) { case 1: break; case 2: break; case 1: // 「1」が重複 break; default: break; }
6:5 error Duplicate case label no-duplicate-case
no-empty-character-class
正規表現で空の文字クラス([])を許可しない。
マッチする文字列が無いので、基本的に空の文字クラスが使用されることはありません。
▼ エラーコードの例
/^abc[]/.test("abcdefg"); // false "abcdefg".match(/^abc[]/); // null
1:1 error Empty class no-empty-character-class
2:17 error Empty class no-empty-character-class
no-empty
空のブロックを許可しない。
ただし、コメントのみを含むブロックは空とみなされません。
▼ エラーコードの例
if (foo) { // 空ブロック } while (foo) { // 空ブロック } switch(foo) { // 空ブロック }
1:10 error Empty block statement no-empty
4:13 error Empty block statement no-empty
7:1 error Empty switch statement no-empty
no-ex-assign
try...catch 文でcatchブロック内で例外オブジェクトを上書きすることを許可しない。
▼ エラーコードの例
try { // code } catch (e) { e = 10; // 例外オブジェクトを上書き }
4:5 error Do not assign to the exception parameter no-ex-assign
no-extra-boolean-cast
不必要なboolean型の型変換を許可しない。
▼ エラーコードの例
var foo = !!!bar; // !!!bar === !bar var foo = !!bar ? baz : bat; // !!bar === bar var foo = Boolean(!!bar); // !!bar === bar var foo = new Boolean(!!bar); // !!bar === bar if (!!foo) { // !!foo === foo // ... } if (Boolean(foo)) { // Boolean(foo) === foo // ... } while (!!foo) { // !!foo === foo // ... } do { // ... } while (Boolean(foo)); // Boolean(foo) === foo for (; !!foo; ) { // !!foo === foo // ... }
1:13 error Redundant double negation no-extra-boolean-cast
3:12 error Redundant double negation no-extra-boolean-cast
5:20 error Redundant double negation no-extra-boolean-cast
7:24 error Redundant double negation no-extra-boolean-cast
9:6 error Redundant double negation no-extra-boolean-cast
13:5 error Redundant Boolean call no-extra-boolean-cast
17:9 error Redundant double negation no-extra-boolean-cast
23:10 error Redundant Boolean call no-extra-boolean-cast
25:9 error Redundant double negation no-extra-boolean-cast
no-extra-semi
不必要なセミコロンを許可しない。
▼ エラーコードの例
var x = 5;; // セミコロンが重複 function foo() { // code }; // 関数宣言にセミコロンは不要
1:11 error Unnecessary semicolon no-extra-semi
5:2 error Unnecessary semicolon no-extra-semi
no-func-assign
関数宣言として記述された関数への上書きを許可しない。
▼ エラーコードの例
function foo() {} foo = bar; // 1行目と4行目の関数宣言fooを上書きしようとしている function foo() { foo = bar; // 1行目と4行目の関数宣言fooを上書きしようとしている }
2:1 error 'foo' is a function no-func-assign
2:1 error 'foo' is a function no-func-assign
5:5 error 'foo' is a function no-func-assign
5:5 error 'foo' is a function no-func-assign
no-inner-declarations
ネストブロック内での変数や関数宣言を許可しない。 (デフォルトでは関数宣言のみ)
▼ エラーコードの例
if (test) { function doSomething() { } } function doSomethingElse() { if (test) { function doAnotherThing() { } } }
2:5 error Move function declaration to program root no-inner-declarations
7:9 error Move function declaration to function body root no-inner-declarations
no-invalid-regexp
RegExp コンストラクタ内で無効な正規表現文字列を許可しない。
▼ エラーコードの例
RegExp('[') // 「[」はエスケープが必要です。 RegExp('.', 'z') // 「z」は正規表現のフラグとして無効 new RegExp('\\')
1:1 error Invalid regular expression: /[/: Unterminated character class no-invalid-regexp
3:1 error Invalid flags supplied to RegExp constructor 'z' no-invalid-regexp
5:1 error Invalid regular expression: /\/: \ at end of pattern no-invalid-regexp
no-irregular-whitespace
Unicodeの特殊な空白文字を許可しない。
▼ エラーコードの例
function thing?/*<MVS>*/(){ // U+180E MONGOLIAN VOWEL SEPARATOR return 'test'; } function thing() { return 'test';?/*<ENSP>*/ // U+2002 EN SPACE }
1:15 error Irregular whitespace not allowed no-irregular-whitespace
6:19 error Irregular whitespace not allowed no-irregular-whitespace
no-obj-calls
グローバルオブジェクトを関数として呼び出すことを許可しない。
▼ エラーコードの例
var math = Math(); var json = JSON();
1:12 error 'Math' is not a function no-obj-calls // Mathオブジェクト
2:12 error 'JSON' is not a function no-obj-calls // JSONオブジェクト
no-regex-spaces
正規表現文字列の中で2文字以上の連続した空白を許可しない。
▼ エラーコードの例
var re = /foo bar/; // 2文字の連続した空白は「/ {2}/」を使う。 var re = new RegExp("foo bar"); // 3文字の連続した空白は「/ {3}/」を使う。
1:10 error Spaces are hard to count. Use {2} no-regex-spaces
2:10 error Spaces are hard to count. Use {3} no-regex-spaces
no-sparse-arrays
空のスロットを含む配列を許可しない。
連続したカンマはカンマのタイプミスである可能性がある。
▼ エラーコードの例
var items = [,]; var colors = [ "red",, "blue" ];
1:13 error Unexpected comma in middle of array no-sparse-arrays
2:14 error Unexpected comma in middle of array no-sparse-arrays
参考
・ESLint - Pluggable JavaScript linter(公式)
http://eslint.org/
・ESLintのエラールール。日本語ざっくり解説[可能性あるエラー編] - Qiita
http://qiita.com/M-ISO/items/f9097a75b362206c2a99 など