自動画像最適化
最適化されていない画像
通常のHTMLを使用して、ヒーロー画像を次のように追加しました:
しかし、これでは以下のような最適化を手動で行う必要があります:
- 異なる画面サイズで画像がレスポンシブになるようにする
- サードパーティツールやライブラリで画像を最適化する
- ビューポートに入ったときに画像を遅延読み込み (lazy-load) する
Imageコンポーネント
Next.jsはこれらの最適化を組み込みで処理できるImageコンポーネントを提供しています。
next/image
はHTMLのimg
要素を拡張したもので、モダンなWeb向けに進化しています。
つまり、next/image
を使用することで、画像のリサイズ、最適化、WebPのようなモダンなフォーマット(ブラウザがサポートしている場合)での配信を自動的に行うことができます。
このコンポーネントは、小さなビューポートを持つデバイスに大きな画像を送信することを防ぎ、Next.jsが将来の画像フォーマットを採用し、それらをサポートするブラウザに提供できるようにします。
自動画像最適化は、どの画像ソースでも動作します。CMSのような外部データソースでホストされている画像でも、最適化できます。
自動画像最適化の仕組み
オンデマンド最適化
Next.jsはビルド時に画像を最適化するのではなく、ユーザーが要求したときにオンデマンドで最適化します。静的サイトジェネレーターや静的のみのソリューションとは異なり、10枚の画像でも1000万枚の画像でも、ビルド時間は増加しません。
遅延読み込み画像
画像はデフォルトで遅延読み込みされます。ビューポート外にある画像のためにページ速度が低下することはありません。画像はビューポートに入ったときのみ読み込まれます。
CLSを回避
画像は常にレンダリングされ、累積レイアウトシフト (CLS) を防ぎます。
Imageコンポーネントの使用
next/image
を使用してヒーロー画像を表示するようにアプリを更新しましょう。heightとwidthプロパティは、ソース画像と同じアスペクト比で、希望のレンダリングサイズにする必要があります。
pages/index.js
ファイルを開き、ファイルの先頭にnext/image
からImage
をインポートします:
次に、ヒーロー画像のimg
をImage
コンポーネントに置き換えます:
フッターにも画像があります。これも置き換えましょう:
最後に、Chrome DevToolsで再度Lighthouseレポートを実行し、結果を比較してください。
さらなる学習
- Next.js: 自動画像最適化のドキュメント
- Next.js:
next/image
のAPIリファレンス