Next.js では、クライアント側コンポーネント (「クライアントを使用する」) が SSR (サーバーサイド レンダリング) と連携する方法がわかりにくい場合があります。細かく見てみましょう:
Next.js でのクライアント コンポーネントとサーバー コンポーネントの動作:
-
サーバー コンポーネント: これらは Next.js のデフォルトであり、サーバー上で事前にレンダリングされます。これらは JavaScript としてクライアントに送信されるのではなく、HTML としてのみ送信されます。
-
クライアント コンポーネント: コンポーネントに「クライアントを使用」とマークすると、そのコンポーネントには対話性 (useState、useEffect など) がある可能性があるため、クライアント側 で実行する必要があることを意味します。または、サーバー環境では機能しないブラウザ API に依存しています。
クライアント コンポーネントが依然としてサーバー上で HTML をレンダリングする理由:
コンポーネントが「クライアントを使用」としてマークされている場合でも、そのコンポーネントの 初期 HTML は サーバー (SSR) 上で生成できますが、それは静的 HTML の目的のみです。 。これは次のことを意味します:
-
初期レンダリング: サーバーは、パフォーマンスと SEO を向上させるために、クライアント コンポーネントを含むページの HTML を生成します。これは静的な HTML であり、インタラクティブではありません。
-
ハイドレーション: この HTML がブラウザーに到達すると、Next.js は JavaScript を使用してクライアント側コンポーネントをハイドレーションし、対話性を有効にします。
なぜこれが起こるのか:
-
パフォーマンス: 初期 HTML をサーバーでレンダリングすることにより、ユーザーはクライアント側の JavaScript が読み込まれるのを待たずに、コンテンツをより速く表示できます (最初のバイトまでの時間 (TTFB) が短縮されます)。
-
SEO: HTML の事前レンダリングは、検索エンジンがコンテンツをクロールしてインデックスに登録できるようにするため、SEO にとって重要です。
-
ハイドレーション: HTML が提供されると、Next.js は JavaScript バンドルをクライアントに送信します。これにより、静的 HTML が「ハイドレーション」され、イベント リスナーがアタッチされ、インタラクティブになります。
「クライアントを使用」ではどうなりますか?
-
サーバー側の HTML レンダリング: コンポーネントがクライアント側であっても、Next.js は初期ビューの HTML を生成します。したがって、サーバー上でインタラクティブな JavaScript は実行されませんが、HTML マークアップはクライアントに送信されます。
-
クライアント側のハイドレーション: インタラクティブ性に必要な JavaScript がクライアントに送信され、ページが読み込まれると、Next.js がコンポーネントをハイドレートして、コンポーネントが完全に機能できるようにします。
誤解:
コンポーネントに「クライアント使用」のマークを付けても、サーバー側で HTML を生成しないというわけではありません。これは単に、インタラクティブな JavaScript がクライアントにのみロードされるが、サーバーはレンダリング用の初期静的 HTML を生成する可能性があることを意味します。
要約すると:
-
クライアント コンポーネントの SSR: クライアント コンポーネントの HTML はサーバー上で (初期ロード用に) 事前にレンダリングされる場合がありますが、クライアント上でハイドレートされるまで対話型ではありません。
-
"use client": このディレクティブは、クライアント側の対話性のための JavaScript がブラウザー内でのみ実行されるようにしますが、サーバー上での静的 HTML 生成は停止しません。
コンポーネントの動作が異なることを確認したい場合、特にクライアント固有の動作 (ウィンドウやドキュメントへのアクセスなど) が予想される場合は、特定の動的コンテンツをロードする場所と方法を再考する必要がある場合があります。
以上がnextjs でクライアント コンポーネントが SSR としてレンダリングされ、コンポーネントを「クライアントを使用」としてマークしても、その HTML が SSR としてレンダリングされるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。