📋

.eslintrc晒す

2021/07/04に公開約7,100字

【追記 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
  }
}

こんな感じで。

参考

Discussion

ログインするとコメントできます