2019-10-09

JavaScript Standardだけだと足りなかったのであれこれ

対象バージョン

このエントリは以下のバージョンを基準にしています。未来において違うことを言っている可能性はおおいにあります。

  • Node.js 12.10.0
  • ESLint 6.5.1
  • Standard 14.3.1
  • Jest 24.9.0
  • Power-Assert 1.6.1
  • eslint-config-standard 14.1.0
  • eslint-plugin-jsdoc 15.10.0

これまで

先月に Flycheck を入れてみて すこぶる快適なのだけど、やはり JavaScript についてはいろいろ不満は残っていて、

  • describe, it が undef で怒られる
  • そのくせ console は ok で browser 向けだとまずそう
  • 現実と戦う際に env: { jquery: true } とか欲しかったり
  • 結局 .eslintrc.js が欲しくなる

ということが分かってきた。多くのエディタでリアルタイムに近いレベルでチェックを走らせるとか、ほんとの基本となる基準としてはよいけど、十分かと言われるとそうでもない。

結局ESLintの設定を見直した

ということで ESLint の設定でしばらく悩んでいたんだけど、こんな感じになった。

module.exports = {
  extends: [
    'standard',
    'plugin:jsdoc/recommended'
  ],
  env: {
    browser: true,
    node: true
  },
  rules: {
    'no-console': process.env.NODE_ENV === 'development' ? 'off' : 'error',
    'no-debugger': process.env.NODE_ENV === 'development' ? 'off' : 'error',
    'jsdoc/require-param-description': 'off',
    'jsdoc/require-returns-description': 'off'
  }
}

端折っている部分もあるし、すべてにおいてこれと同じではないけど、だいぶ減らせたのはありがたい。

基本的な考え方

  • エディタ編集時のチェックで怒られなさすぎるのは良くない
  • でもじゃあエディタ編集時のチェックを全部「ESLint + .eslintrc + エディタの設定」に寄せるのはコストと合わない
    • describe, it についてはファイルローカルの /* global describe, it */ で回避
  • プロジェクトローカルではこれまで通り ESLint を入れて(ブラウザ向けかどうかなど考慮しつつ)設定を追加

JSDoc 周りは ESLint 4 以下の時代の方が自分の意図にはしっくりきてたので、今後の eslint-plugin-jsdoc の進化に期待。2019-10 現在まさに breaking changes をモリモリ入れながら開発が進んでいる感じ。1

特に痛いのは require-jsdoc してるのに function definition に対しては lint が有効だけど method definition に対しては効かない点。これはだいぶ痛い。

describe, it については ESLint を使うなら globals の設定で ok だし、standard でもコマンドラインオプションを渡せばよいのも分かっているんだけど、上に書いた通り、まず(現在メンバーの使っている)

すべてのエディタでカジュアルに動かせること

を優先した結果、

/* global describe, it */

あたりが落としどころかなと考えている。

// eslint-disable-line

と同じような考え方だと思ってもらえればよいです。

  1. semver のおかげでバージョンがすごいことになってる 

About

例によって個人のなんちゃらです