ここまでのあらすじ:ESLint は便利。でも実行すると妙に遅い? CI の実行時間には問題なく、VS Code のプラグインもストレスなく動く。でも手元のコンソールから実行するととても遅い……というか一生終わらない。どうして? どこかで詰まっている? なにが?

先にまとめ

  • ビルドファイルなんかが対象になってるかも
  • DEBUG=eslint:* eslint . で実行し、詳細出力
  • 目的でないファイルが含まれていないか確認
  • ignorePatterns へ追加して除外

なんか遅い……

あるとき大きめの自動変更をしました。

目視確認の前に機械的に判断できるものは判断してしまおうとコンソールから ESLint を実行したところ……終わらない。ESLint のエラーは VS Code 上ではちゃんと出てくるし、CI もご機嫌に回っているので特に気にしていなかったんですが、どこかに何か問題があるようです。

実はこのとき「なんかいらんファイル読みに行ってそうだな」という予感はしていました。たぶん過去にそういう失敗をしたんだろうと思います、具体的には思い出せないけど。問題はそれをどう確認するかです。

多くの CLI ツールはログをたっぷり出す --verbose というオプションを備えています。(verbose で「おしゃべりな」という意味です。) しかし ESLint にはないようでした。

ないこたないじゃろと “eslint cli verbose” で検索すると、その --verbose オプションを追加しようという issue を見つけました。(そうじゃないけどそういうことにします。)

で、なんやかんやあってオプションは追加しない、既存の環境変数を使う方法を取れ、とのことみたいです。

何をしているのか確認

というわけで DEBUG=eslint:* という環境変数を与えることで詳細な記録を出力しながら実行してくれるらそうです。* はそのままでも良いし特定のものを指定することもできるらしい。

mac や Linux なら空白に続けてコマンドを入力すると、その設定をした状態でコマンド実行できます。Windows はわからないけど WSL 使うといいよ。

というわけで試したところ、ここで停止してしまいました。

$ DEBUG=eslint:* npx eslint .

…

  eslint:file-enumerator Enter the directory: /path/to/my-app/build/static/js  0ms
  eslint:file-enumerator Yield: 2.f787083e.chunk.js  0ms
  eslint:cli-engine Lint /path/to/my-app/build/static/js/2.f787083e.chunk.js  191ms
  eslint:linter Linting code for /path/to/my-app/build/static/js/2.f787083e.chunk.js (pass 1)  6ms
  eslint:linter Verify  0ms
  eslint:linter With ConfigArray: /path/to/my-app/build/static/js/2.f787083e.chunk.js  0ms
  eslint:code-path onCodePathStart s1  4s
  eslint:code-path onCodePathSegmentStart s1_1  0ms
  eslint:code-path s1_1) Program  0ms
▓

この /path/to/my-app/build/static/js/2.f787083e.chunk.js というファイルの作業中に止まるようです。このファイルは Next.js で出力した成果物で、もちろん ESLint で検証する予定ではありません。

なんで止まるのか(時間がかかるのか)はわかりませんが、いずれにせよこのファイルが対象に含まれているのは意図した動作ではありません。

除外する

build/ ディレクトリー下のファイルを見に行かないよう、除外設定をします。

設定は .eslintrc.js へ記述します。package.json とか使ってる人もいると思うんだけどそこら辺はまあうまいこと読み替えてください。

使う設定は ignorePatterns です。

module.exports = {
  …
  ignorePatterns: ["/build/"],
};

設定した状態でもう一度試してみます。

$ DEBUG=eslint:* npx eslint .

…

  eslint:cli-engine Linting complete in: 2873ms  60ms

無事に 3 秒で終わるようになりました。やったね。

おしまい

該当ディレクトリーは .gitignore へは追加していたので油断していました。というか自動で .gitignore から引っ張ってきて対象にしてほしいような。いやそれはそれでなんか違うかなあ。スクリプト書くのもアレだしなあ。

参考