JavaScript
ESLint
More than 3 years have passed since last update.

【追記150803】ESLint v1.0.0がリリースされました。メジャーリリースに伴いBreaking Changeが入っていますので、下記のままでは使えないオプションが存在します。1.0.0での新ルールについてはこちらの記事でまとめています。本稿は記録のため、当時のまま残します。


どうも@armorik83です。ESLintのオプションを全部読んで吟味したので応酬を載せます。TypeScriptを辞めたというより、単機能ライブラリならES6の方が早く書けたという程度です。まさかりはブコメから。


小分け

まずは小分けにして。見出し名は公式サイトと同じにしてあります。2がexit code 1投げるやつ、1はログのみ、0が無視。


Possible Errors

{

"no-reserved-keys": 2,

"no-console": 1,
"no-constant-condition": 1,
"no-debugger": 1,
"no-extra-parens": 1,

"no-extra-boolean-cast": 0
}


  • 初期値がキツめなのでそのまま


  • no-reserved-keysは、パッと見たときの脳の引っ掛かりが嫌いなので2

  • 1は「まあ分かってるけどさ…見逃してよ…」みたいなの


  • no-extra-boolean-castは普通に使うから0


  • valid-jsdocは1にしたかったけど、WebStorm向けのゆるふわが許されなかったため初期値0のまま


Best Practices

{

"block-scoped-var": 2,
"curly": [2, "all"],
"default-case": 2,
"no-div-regex": 2,
"no-else-return": 2,
"no-eq-null": 2,
"no-floating-decimal": 2,
"no-multi-spaces": [2, {"exceptions": {"Property": true, "ImportDeclaration": true, "VariableDeclarator": true, "AssignmentExpression": true}}],
"no-self-compare": 2,
"wrap-iife": [2, "inside"],

"complexity": [1, 3],
"dot-notation": 1,
"guard-for-in": 1,
"no-extend-native": 1,
"no-iterator": 1,
"no-loop-func": 1,
"no-multi-str": 1,
"no-process-env": 1,
"no-proto": 1,
"no-throw-literal": 1,
"no-unused-expressions": 1,
"radix": 1,

"no-alert": 0,
"no-extra-bind": 0,
"yoda": 0,
}



  • block-scoped-var: let, const縛りをしているので関係ないっちゃないが、2


  • default-case: 基本的にswitch構文が大嫌いなのでなんでもいい


  • no-else-return: 早期returnで無用な深さは避けようという意志


  • no-eq-null: ==がとにかく嫌いで、たとえ長くてもfoo === void 0 || foo === null使ってくれ頼む! という意志


  • complexityが1なのは「わかってはいるんだ…(吐血」みたいな状況

  • その他、あまり行儀良くはないけど使うことあるなーみたいなものが1


  • yodaってまだやってる人いますか


Strict Mode

{

"strict": 2
}

使います。


Variables

{

"no-catch-shadow": 2,

"no-undefined": 1,
"no-unused-vars": [1, {"vars": "all", "args": "after-used"}],
"no-undef-init": 1
}



  • no-catch-shadow: catch節を漏らしたくないという好み


  • no-undefined: 長らくvoid 0を使っているのでその流れ


  • no-unused-vars: やむを得ず使わない引数を宣言することがあるので(だいたい引数名を_にして、lodashはlodashにしてる)


  • no-undef-init: 禁止するほどでもないか、というところ


Node.js

{

"no-path-concat": 1,
"no-sync": 1
}



  • no-path-concat: 横着することがあっても落とされるとストレス…みたいなやつ


  • no-sync: テストを簡便に書きたいときに使ったりするので


Stylistic Issues

{

"indent": [2, 2],
"comma-style": [2, "last"],
"consistent-this": [2, "_this"],
"func-style": [2, "declaration"],
"no-nested-ternary": 2,
"padded-blocks": [2, "never"],
"quotes": [2, "single"],
"space-before-blocks": [2, "always"],
"space-before-function-paren": [2, "never"],
"space-in-brackets": [2, "never"],
"space-in-parens": [2, "never"],
"space-return-throw-case": 2,
"space-unary-ops": [2, {"words": true, "nonwords": false}],

"brace-style": [1, "1tbs", {"allowSingleLine": true}],
"comma-spacing": [1, {"before": false, "after": true}],
"func-names": 1,
"key-spacing": [1, {"align": "value", "beforeColon": false, "afterColon": true}],
"max-nested-callbacks": [1, 3],
"new-cap": [1, {"newIsCap": true, "capIsNew": true}],
"no-lonely-if": 1,
"no-multiple-empty-lines": [1, {"max": 2}],
"no-trailing-spaces": 1,
"operator-linebreak": [1, "before"],
"semi": [1, "always"],
"semi-spacing": [1, {"before": false, "after": true}],
"space-after-keywords": [1, "always"],
"space-infix-ops": [1, "always"],

"no-underscore-dangle": 0
}

この辺はもう見たまんま。1は横着を許容するやつとか、new-capのような止むに止まれぬ事情とか、見つけ次第直したいけど毎回落とされるとストレス溜まるやつとか。no-underscore-dangleは使うので0なんですが、もしかしてマズかったりしますか。


ECMAScript 6

{

"no-var": 1
}

もうletconstしか使ってないのでno-varを1に。generator-star-spacingは書いた経験が(写経を除いて)無いので、勝手が分かってない。


Legacy

{

"max-len": [1, 100, 2],
"max-params": [1, 4],
"max-statements": [1, 12]
}



  • max-len: 80を目安にしていて、そこから20許容する程度。画面内には120入る


  • max-params: 4くらいはやむを得ない、5は考え直すよな? みたいな境目


  • max-statements: ちょっとチキンな数字。16くらいまでは耐えても、内心モヤモヤするのは14前後


  • max-depth: complexityにお任せ

  • どれも2にしたら生産性が落ちるので1で許して😜


全文


.eslintrc

{

"env": {
"es6": true,
"node": true
},
"rules": {
"no-reserved-keys": 2,

"no-console": 1,
"no-constant-condition": 1,
"no-debugger": 1,
"no-extra-parens": 1,

"no-extra-boolean-cast": 0,

"block-scoped-var": 2,
"curly": [2, "all"],
"default-case": 2,
"no-div-regex": 2,
"no-else-return": 2,
"no-eq-null": 2,
"no-floating-decimal": 2,
"no-multi-spaces": [2, {"exceptions": {"Property": true, "ImportDeclaration": true, "VariableDeclarator": true, "AssignmentExpression": true}}],
"no-self-compare": 2,
"wrap-iife": [2, "inside"],

"complexity": [1, 3],
"dot-notation": 1,
"guard-for-in": 1,
"no-extend-native": 1,
"no-iterator": 1,
"no-loop-func": 1,
"no-multi-str": 1,
"no-process-env": 1,
"no-proto": 1,
"no-throw-literal": 1,
"no-unused-expressions": 1,
"radix": 1,

"no-alert": 0,
"no-extra-bind": 0,
"yoda": 0,

"strict": 2,

"no-catch-shadow": 2,

"no-undefined": 1,
"no-unused-vars": [1, {"vars": "all", "args": "after-used"}],
"no-undef-init": 1,

"no-path-concat": 1,
"no-sync": 1,

"indent": [2, 2],
"comma-style": [2, "last"],
"consistent-this": [2, "_this"],
"func-style": [2, "declaration"],
"no-nested-ternary": 2,
"padded-blocks": [2, "never"],
"quotes": [2, "single"],
"space-before-blocks": [2, "always"],
"space-before-function-paren": [2, "never"],
"space-in-brackets": [2, "never"],
"space-in-parens": [2, "never"],
"space-return-throw-case": 2,
"space-unary-ops": [2, {"words": true, "nonwords": false}],

"brace-style": [1, "1tbs", {"allowSingleLine": true}],
"comma-spacing": [1, {"before": false, "after": true}],
"func-names": 1,
"key-spacing": [1, {"align": "value", "beforeColon": false, "afterColon": true}],
"max-nested-callbacks": [1, 3],
"new-cap": [1, {"newIsCap": true, "capIsNew": true}],
"no-lonely-if": 1,
"no-multiple-empty-lines": [1, {"max": 2}],
"no-trailing-spaces": 1,
"operator-linebreak": [1, "before"],
"semi": [1, "always"],
"semi-spacing": [1, {"before": false, "after": true}],
"space-after-keywords": [1, "always"],
"space-infix-ops": [1, "always"],

"no-underscore-dangle": 0,

"no-var": 1,

"max-len": [1, 100, 2],
"max-params": [1, 4],
"max-statements": [1, 12]
},
"ecmaFeatures": {
"modules": true
}
}


こんな感じで。


参考