next/imageが遅いのでやめた
に公開(に更新)履歴 (6)
iPadケースを作った記事の画像が読み込みに2秒以上かかることがあり閲覧に支障があったため改善したまとめです。
next/imageは画像を調整してくれるのはいいのですが、元の画像が3MBくらいでキャッシュがないと表示まで3秒くらいかかっていました。ここは私の個人サイトなので編集がなければコンテンツは変わらないので、事前にいい具合のサイズの画像を生成しておいてブラウザに選択させるようにしました。実装した機能は以下の通りです。
- srcとpublicの画像を列挙する
- それぞれについて 幅(300, 400, ..., 1800) × 形式(オリジナル, webp, avif) の画像を生成する
- 例えば 幅(300, 400, 800) × 形式(jpeg, webp, avif) なら9種類
- 生成した画像の一覧を使って
{元ファイル}.component.tsx
を生成する(このファイルは.gitignoreする)
- 画像がすでに生成してあれば省略する(.gitignoreしてるのでコンポーネントの生成は毎度やる)
{元ファイル}.component.tsx
は例えばこんな感じです。
この対策により表示にかかる時間(の最大値)は3,000msから200ms以下になりました。
訂正
このツイートの50msはおそらくx-vercel-cache: HIT
のを見ているので正しくないです。
参考文献
- MDN Web Docs
<picture>
: The Picture element
<source>
: The Media or Image Source element
<img>
: The Image Embed element