コンポーネントの動的インポート
次に、初期ページ読み込み時に不要なReactコンポーネントに注目しましょう。
Reactコンポーネントも動的インポートを使用してインポートできますが、この場合はnext/dynamic
と組み合わせて使用することで、他のReactコンポーネントと同様に動作するようにします。
この方法を使用して、Hello World
のコードサンプルを含むモーダルの読み込みを遅延させます。これにより、初期ページ読み込みからさらに2つのサードパーティライブラリを削除できます。
pages/index.js
ファイルを開き、ファイルの先頭にnext/dynamic
からdynamic
をインポートします:
また、この行を削除します:
次に、以下のコードをファイルの先頭に追加して、動的コンポーネントとしてインポートします:
CodeSampleModal
は../components/CodeSampleModal
から返されるデフォルトのコンポーネントになります。これは通常のReactコンポーネントと同じように動作し、通常通りpropsを渡すことができます。
このコンポーネントはサーバー側で不要なため、ssr: false
を使用して無効にしています。
次に、このコンポーネントの読み込みをユーザーが必要とするまで遅延させたいと思います。これを行うには、モーダルが開くべきかどうかを確認する条件でコンポーネントをラップします。条件が満たされた場合、コンポーネントが読み込まれます。
CodeSampleModal
コンポーネントを次のようにラップします:
これで、isModalOpen
が初めてtrue
に切り替えられたときに、必要なJavaScriptがリクエストされます。
これらの最適化により、Web Vitalsの値が改善されているはずです。Chrome DevToolsで再度Lighthouseレポートを実行して確認しましょう。
残っている最適化の提案は次の2つです:
- HTTP2の使用:この問題を解決するには、HTTP2をサポートする場所(例:Vercel)にデプロイします。
- 画像要素に明示的な
width
とheight
がない:これは実際にはLighthouseのバグであり、サイトのパフォーマンスには影響しません。
さらに詳しく
- Next.js: 動的インポートのドキュメント