コンポーネント関数が呼び出されて返したJSXがBabelを通じてReact Element (JavaScript オブジェクト) にトランスパイルされます。この React Element は DOM に表現するための情報を含んでいるオブジェクトであり、Fiber に拡張されて Virtual DOM のノードとなります。
Next.js は React が生成した RSC Payload とクライアントコンポーネントの JavaScript のかたまりを活用して HTML をレンダリングします。ここで重要な点はクライアントコンポーネントコードの一部、例えば useState の初期値などがまるでサーバーコンポーネントがスタティック HTML を渡すようにすでにサーバーで HTML に含まれうるということです。HTML と RSC Payload が準備されるとクライアントに転送される準備が整います。
Client-Side Steps
Step 1:HTML Preview
クライアント(ブラウザー)はサーバーから受け取った HTML を即座に画面に表示します。これは Next.js が該当ルートのプレビューとして HTML をすぐに提供するということです。ユーザーはこの段階でページの骨組みを素早く見ることができます。プレビューの表示はページの初回ロード時にのみ発生し、その後のクライアントサイドルーティング(Next.js の Link など)時には HTML ではなく別の方法でデータを取得します。
HTML が表示された後、クライアントはサーバーから共に受け取った RSC Payload を使用して Reconciliation 段階を経ます。この段階では、クライアントコンポーネントツリーとサーバーコンポーネントツリーを RSC Payload に基づいて照合する作業が行われます。RSC Payload に含まれるクライアントコンポーネントの「プレースホルダー」情報をもとにどのクライアントコンポーネントが来るべきかを把握し、React コンポーネントツリー、すなわち Vitual DOM を構成します。必要であればこの過程で実際の DOM アップデートも行われます。
Step 3:Hydration
Reconciliationが完了して Vitual DOM が構成されると、最後にハイドレーション段階に進みます。この段階の核心はインタラクションが可能になることです。サーバーで HTML 生成時に使用して残ったクライアントコンポーネントの JavaScript ファイル(イベントハンドラーなどが含まれている)を持ってきてコンポーネントに繋ぎます。