クライアントコンポーネントとライブラリの遅延読み込み方法
Next.jsの遅延読み込みは、ルートのレンダリングに必要なJavaScriptの量を減らすことで、アプリケーションの初期読み込みパフォーマンスを向上させます。
これにより、クライアントコンポーネントやインポートしたライブラリの読み込みを遅延させ、必要な時だけクライアントバンドルに含めることができます。例えば、ユーザーがクリックして開くまでモーダルの読み込みを遅らせることができます。
Next.jsで遅延読み込みを実装する方法は2つあります:
next/dynamic
を使用した動的インポートReact.lazy()
とSuspenseの使用
デフォルトでは、サーバーコンポーネントは自動的にコード分割され、ストリーミングを使用してサーバーからクライアントへUIを段階的に送信できます。遅延読み込みはクライアントコンポーネントに適用されます。
next/dynamic
next/dynamic
はReact.lazy()
とSuspenseの複合体です。app
とpages
ディレクトリで同じように動作し、段階的な移行を可能にします。
例
クライアントコンポーネントのインポート
注記: サーバーコンポーネントがクライアントコンポーネントを動的にインポートする場合、現在は自動的なコード分割はサポートされていません。
SSRのスキップ
React.lazy()
とSuspenseを使用する場合、クライアントコンポーネントはデフォルトでプリレンダリング(SSR)されます。
注記:
ssr: false
オプションはクライアントコンポーネントでのみ機能します。クライアントコード分割が正しく動作するように、クライアントコンポーネント内に移動してください。
クライアントコンポーネントのプリレンダリングを無効にしたい場合は、ssr
オプションをfalse
に設定します:
サーバーコンポーネントのインポート
サーバーコンポーネントを動的にインポートする場合、サーバーコンポーネント自体ではなく、その子のクライアントコンポーネントのみが遅延読み込みされます。 また、サーバーコンポーネントで使用する場合、CSSなどの静的アセットのプリロードにも役立ちます。
注記: サーバーコンポーネントでは
ssr: false
オプションはサポートされていません。サーバーコンポーネントで使用しようとするとエラーが発生します。ssr: false
はサーバーコンポーネントでのnext/dynamic
使用時には許可されません。クライアントコンポーネント内に移動してください。
外部ライブラリの読み込み
外部ライブラリはimport()
関数を使用してオンデマンドで読み込めます。この例では、ファジー検索のために外部ライブラリfuse.js
を使用しています。モジュールはユーザーが検索入力欄に入力した後にのみクライアントで読み込まれます。
カスタムローディングコンポーネントの追加
名前付きエクスポートのインポート
名前付きエクスポートを動的にインポートするには、import()
関数が返すPromiseから返します: