テストが遅いなと思ったら faker がデカすぎた
Note
#Jest
Storybook x MSW x Jest を使ってコンポーネント駆動のとても開発体験のいいものにしたいなと思い、変更を入れてみるとかなり時間がかかるようになりました。
composeStories
があまりよくないのか?とか、Jest のメモリ管理周りなのか?と色々調査をしていると、意外なところで遅くなっていることが判明しました。
結論: faker がデカすぎた
API モックに MSW を使用していて、一覧取得や詳細取得のモックデータを用意する際に人間がデータを決めるとどうしても偏りがあったりコピペになったりとあまり健全なデータではないなと思い、モックデータをランダム化するために @faker-js/faker
を利用しています。
FakerJS
Generate massive amounts of fake (but reasonable) data for testing and development.
![FakerJS](https://fakerjs.dev/social-image.png)
どうやらこいつのパッケージサイズがデカすぎたのが問題のようで、テストの実行ではなくインポートがボトルネックになっていたようでした。
解決案: インポート先を変える
では、もうズブズブな関係である faker と別れなければいけないのかというとそうでもなく、インポート先を変えるだけで相当速度は改善されます。(英語であれば ja -> en)
- import { faker } from '@faker-js/faker'
+ import { faker } from '@faker-js/faker/locale/ja'
これだけで結構サイズが下がるっぽく、私はバンドルサイズとか全然詳しくないので認識が異なる可能性がありますが、pkg-size.dev で確認してみると以下のようになりました:
@faker-js/faker
: 3.9 MB minified (1MB gzip)@faker-js/faker/locale/ja
: 607 KB minified (179KB gzip)
より早くするには
これだけでも自分の確認した限りではかかる時間が 1/2 ほどになりましたが、より早くするには faker を必要な場所でのみインポートするに限るかなと思います。
たとえば、
- .storybook/preview.tsx で MSW のデフォルトハンドラをなくし、各 Story でハンドラを入れる
- setupTests で faker.seed を設定するのではなく、各 Story で設定する
とかが考えられます。試してはないですが。
おわりに
Storybook x Jest x faker を使っているプロジェクトって全然ないんでしょうか?ググっても全然引っ掛からなかたのでだいぶハマりました。