フォントと画像の最適化
前の章では、Next.jsアプリケーションのスタイリング方法を学びました。カスタムフォントとヒーロー画像を追加して、ホームページの作業を続けましょう。
フォントを最適化する理由
フォントはウェブサイトのデザインにおいて重要な役割を果たしますが、プロジェクトでカスタムフォントを使用すると、フォントファイルの取得と読み込みが必要な場合、パフォーマンスに影響を与える可能性があります。
Cumulative Layout Shift(累積レイアウトシフト)は、Googleがウェブサイトのパフォーマンスとユーザーエクスペリエンスを評価するために使用する指標です。フォントに関して、レイアウトシフトは、ブラウザが最初にフォールバックまたはシステムフォントでテキストをレンダリングし、カスタムフォントが読み込まれた後にそれを置き換えるときに発生します。この置き換えにより、テキストのサイズ、間隔、またはレイアウトが変更され、周囲の要素が移動する可能性があります。

Next.jsでは、next/font
モジュールを使用すると、アプリケーション内のフォントが自動的に最適化されます。ビルド時にフォントファイルをダウンロードし、他の静的アセットと共にホストします。これにより、ユーザーがアプリケーションを訪問した際に、パフォーマンスに影響を与える追加のネットワークリクエストが発生しません。
プライマリフォントの追加
アプリケーションにカスタムGoogleフォントを追加して、この仕組みを確認してみましょう。
/app/ui
フォルダ内に、fonts.ts
という新しいファイルを作成します。このファイルを使用して、アプリケーション全体で使用するフォントを管理します。
next/font/google
モジュールからInter
フォントをインポートします - これがプライマリフォントになります。次に、読み込むサブセットを指定します。ここでは'latin'
を使用します:
最後に、/app/layout.tsx
の<body>
要素にフォントを追加します:
Inter
を<body>
要素に追加することで、フォントがアプリケーション全体に適用されます。ここでは、フォントを滑らかにするTailwindのantialiased
クラスも追加しています。このクラスを使用する必要はありませんが、見栄えが良くなります。
ブラウザで開発者ツールを開き、body
要素を選択してください。スタイルの下にInter
とInter_Fallback
が適用されているのが確認できるはずです。
練習: セカンダリフォントの追加
アプリケーションの特定の要素にフォントを追加することもできます。
次はあなたの番です!fonts.ts
ファイルにLusitana
というセカンダリフォントをインポートし、/app/page.tsx
ファイルの<p>
要素に渡してください。前に指定したサブセットに加えて、異なるフォントウェイト(例:400
(通常)と700
(太字))も指定してください。
準備ができたら、以下のコードスニペットを展開して解決策を確認してください。
ヒント:
- フォントに渡すウェイトオプションがわからない場合は、コードエディタのTypeScriptエラーを確認してください。
- Google Fontsウェブサイトにアクセスし、
Lusitana
を検索して利用可能なオプションを確認してください。- 複数のフォントの追加と全オプションのリストのドキュメントを参照してください。
最後に、<AcmeLogo />
コンポーネントもLusitanaを使用しています。エラーを防ぐためにコメントアウトされていましたが、今ならコメントを解除できます:
素晴らしい、アプリケーションに2つのカスタムフォントを追加しました!次に、ホームページにヒーロー画像を追加しましょう。
画像を最適化する理由
Next.jsは、トップレベルの/public
フォルダの下に画像などの静的アセットを提供できます。/public
内のファイルはアプリケーションで参照できます。
通常のHTMLでは、次のように画像を追加します:
しかし、これには手動で以下の対応が必要です:
- 異なる画面サイズで画像がレスポンシブであることを確認する。
- 異なるデバイス向けに画像サイズを指定する。
- 画像の読み込み時にレイアウトシフトを防ぐ。
- ユーザーのビューポート外にある画像を遅延読み込みする。
画像最適化はウェブ開発における大きなトピックであり、それ自体が専門領域と言えるでしょう。これらの最適化を手動で実装する代わりに、next/image
コンポーネントを使用して画像を自動的に最適化できます。
<Image>
コンポーネント
<Image>
コンポーネントはHTMLの<img>
タグを拡張したもので、以下のような自動画像最適化機能を備えています:
- 画像の読み込み時に自動的にレイアウトシフトを防止。
- ビューポートが小さいデバイスに大きな画像を送信しないようリサイズ。
- デフォルトで遅延読み込み(ビューポートに入った時点で画像を読み込み)。
- ブラウザがサポートしている場合、WebPやAVIFなどの最新フォーマットで画像を提供。
デスクトップヒーロー画像の追加
<Image>
コンポーネントを使用してみましょう。/public
フォルダ内を見ると、hero-desktop.png
とhero-mobile.png
の2つの画像があります。これらは完全に異なる画像で、ユーザーのデバイスがデスクトップかモバイルかに応じて表示されます。
/app/page.tsx
ファイルで、next/image
からコンポーネントをインポートします。次に、コメントの下に画像を追加します:
ここでは、width
を1000
、height
を760
ピクセルに設定しています。レイアウトシフトを防ぐために画像のwidth
とheight
を設定するのは良い習慣です。これらは画像がレンダリングされるサイズではなく、アスペクト比を理解するための実際の画像ファイルのサイズです。
また、モバイル画面では画像をDOMから削除するhidden
クラスと、デスクトップ画面で画像を表示するmd:block
クラスにも注目してください。
これが現在のホームページの見た目です:

練習: モバイルヒーロー画像の追加
次はあなたの番です!先ほど追加した画像の下に、hero-mobile.png
用の別の<Image>
コンポーネントを追加してください。
- 画像の
width
は560
、height
は620
ピクセルに設定します。 - モバイル画面で表示され、デスクトップでは非表示にする必要があります - 開発者ツールを使用して、デスクトップとモバイルの画像が正しく切り替わっているか確認できます。
準備ができたら、以下のコードスニペットを展開して解決策を確認してください。
素晴らしい!ホームページにカスタムフォントとヒーロー画像が追加されました。
推奨読書
これらのトピックには、リモート画像の最適化やローカルフォントファイルの使用など、さらに学ぶべきことがたくさんあります。フォントと画像についてさらに深く学びたい場合は、以下を参照してください: