React の遅延読み込み:コンポーネント、ルート、画像

React の遅延読み込み

React の遅延読み込み:lazy、Suspense、ルート、画像 | We.Inc

lazy() と Suspense によるコンポーネントの遅延読み込み、React Router でのルート分割、loading="lazy" での画像の遅延、メイン画像を遅くしない方法をデモ付きで解説します。

React の遅延読み込みとは、コードや画像を必要になったときにだけ取得することです。動的インポートを lazy() で包み、フォールバック付きの Suspense 境界の中でコンポーネントをレンダリングすると、React は初回レンダリング時にそれをダウンロードします。画像では HTML 属性 loading="lazy" が同じ役割を果たしますが、ファーストビューのメイン画像には決して使わないでください。

どの遅延読み込みの手段がどの用途に合うか

アプリのバンドルが大きいと、設定タブのグラフや管理ページなど、使うかどうか分からないコードのために訪問者全員が待たされます。遅延読み込みは、そのコードをブラウザーが必要に応じて取得する別ファイルに分割します。下のデモを試してから、コンポーネント、ルート、画像、スクロールで表示するコンテンツのパターンをコピーしてください。

よくある質問

React.lazy は何を返しますか?

レンダリングできるコンポーネントです。その読み込み関数は、default プロパティが有効な React コンポーネントであるオブジェクトに解決される Promise を返す必要があります。default export を動的 import() で読み込めばそうなります。

lazy() はコードを複数回読み込みますか?

いいえ。react.dev によると、返された Promise とその解決値の両方がキャッシュされるため、React が読み込み関数を複数回呼ぶことはありません。このページのデモでは、2回目に開いたときに即座に表示されることが確認できます。

名前付きエクスポートを遅延読み込みできますか?

lazy() は default export を前提としています。名前付きエクスポートの場合は、読み込み関数の中で対応付けます:lazy(() => import("./Charts").then((m) => ({ default: m.SalesChart })))。

遅延読み込みでページが遅くなることはありますか?

はい、画面上で最も大きな画像の場合です。web.dev の調査では、ファーストビューの画像を遅延読み込みすると Largest Contentful Paint が遅くなる傾向があり、ファーストビューより下の画像だけを遅延読み込みすれば、その代償なしにデータ削減の効果を得られることが分かりました。

遅延ファイルのダウンロードに失敗するとどうなりますか?

React はレンダリング中に拒否の理由をスローし、最も近いエラーバウンダリがそれを捕捉します。エラーバウンダリがない場合、react.dev によると React はデフォルトでアプリの UI を画面から削除します。

遅延画像と最大の描画

わざわざ使わなくてよい場合

コンポーネントを遅延読み込みする

標準的なパターンです。ファイルの先頭に lazy の宣言を1つ置き、レンダリングする場所を Suspense 境界で囲みます。

Suspense とエラーバウンダリを使った lazy()

showChart が初めて true になるまで、グラフのファイルは取得されません。

React Router でルートを遅延読み込みする

React Router のルートオブジェクトは、ルートのプロパティを返す lazy 関数を受け取るため、各ページを独立したファイルにできます。

createBrowserRouter によるルート単位の分割

レポートページとそのローダーは、誰かが /reports にアクセスしたときにだけダウンロードされます。

画像を遅延読み込みする

ブラウザーは画像の遅延読み込みをネイティブに処理します。ファーストビューより下の画像を lazy にし、メイン画像には高い取得優先度を付けましょう。

ネイティブの遅延画像

幅と高さで領域を確保しておけば、画像が読み込まれても何もずれません。

IntersectionObserver でスクロール時にレンダリングする

地図やレビューウィジェットなど画像以外のコンテンツには、その領域が画面に入ったことを知らせる小さなフックを使います。

useInView フック

rootMargin を200px にすると、領域が見える少し前に読み込みが始まります。一度表示されると、オブザーバーは切断されます。

試してみよう:ダウンロードの遅い遅延コンポーネント

このボタンは lazy() で作ったコンポーネントをレンダリングします。初回のダウンロードには、擬似的に2秒かかるようにしています。

売上グラフを表示

売上グラフを非表示

グラフのファイルを読み込み中...

グラフのファイルを読み込みました。非表示にしてからもう一度表示してみてください。React が初回の読み込みをキャッシュしているので、すぐに表示されます。

月別の売上

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る