現実モデリング

データとかエンジニアリングとか健エミュとか

荒ぶるjestのwatchモードよ、鎮まりたまえ

概要

  • jestのwatchモードを発動した際、特に何も変更していないにもかかわらず、再読み込みを繰り返す現象が手元で確認された
  • 原因は、MongoDBがバインドマウントされたディレクトリに対してファイルの書き込みを頻繁に行ったことにより、当該ディレクトリの変更をjest側が検知し、結果的に書き込みの頻度に合わせてリロードされたことだった
  • jest.config.ts内のwatchPathIgnorePatternsに当該バウンドマウントされたディレクトリを追加し、挙動が修正されたことを確認した

自分用にメモを残しておく。

はじめに

jestのwatchモードを使うとテスト結果をリアルタイムで確認しながらコードが書けて便利で、最近はよく使っている。ある日仕事をしていると、突如 jestのwatchモードが荒ぶるようになった。

Image from Gyazo

具体的には以下のような症状である。

  • 変更をしていないのに常に変更が走っているような感じになる
  • ファイル名に絞り込んだモードを選んでも、すぐ変更が走ったかのようにrunし始める

なお、上記画像はCursorだが、Mac標準のターミナルでやっても同様の現象が起こった。

原因の切り分け

  • CursorではなくWezTermや標準ターミナルでやってみる
    • 結果変化せず
    • したがってIDEのプロセスが悪さをしているわけではない
  • rm -rf node_modulesして再インストールする
    • 結果変化せず
  • docker pruneする
    • 結果変化せず
  • レポジトリをいったん削除、git clone して再セットアップ
    • 結果変化せず
  • watchman:falseを試す
    • 結果変化せず

調べた結果

同僚「docker-compose.ymlの中のバインドマウントされてるディレクトリが怪しいんじゃないの?」

なるほど確かに。

そういうわけで、怪しそうなところを手あたり次第jest.config.ts内部のwatchPathIgnorePatternsに入れていく。

jestjs.io

mongodbのバインドマウント元のディレクトリを指定したところで例の挙動は終焉した。

学びとしては以下である

  • mongodbのバインドマウントディレクトリは.gitIgnoreで指定されていたが、watchモードはその変化もとらえ続けていた
  • 無意識のうちに.gitIgnoreされているディレクトリはwatchの対象外だと思っていたが、別にそんなことはどこにも書いていなかった