
React Server Components (RSC) の登場は、React アプリケーションのアーキテクチャパラダイムを根本的に変えました。RSC 以前は、React は主にブラウザでのインタラクティブなコンポーネントのレンダリング(または、時折 SSR を介して HTML にプリレンダリングすること)に焦点を当てていました。React Server Components の登場により、サーバー上でのみ実行されるコンポーネントと、クライアント上で実行されるコンポーネントという明確な分割が生まれました。
このガイドでは、このハイブリッドアプローチの核となる違い、アーキテクチャ上の利点、そしてサーバーコンポーネントとクライアントコンポーネントのどちらを使用するかを決定するための意思決定マトリックスについて詳しく説明します。
React Server Components は、サーバー上でのみ実行されるコンポーネントです。これらは JavaScript としてブラウザに送信されることはありません。代わりに、サーバーが React コンポーネントのロジックを実行し、データベースや内部 API から必要なデータを直接フェッチし、結果の HTML/UI をクライアントに直接ストリーミングします。
useEffect のデータフェッチのウォーターフォールに対処したりすることなく、コンポーネントから直接データベースを安全にクエリできます。サーバーコンポーネントはブラウザで実行されないため、ブラウザ専用の API やクライアントサイドの状態に依存する React フックを使用できません。サーバーコンポーネント内では、useState、useEffect、onClick、または window.localStorage を使用できません。
クライアントコンポーネントは、すでにおなじみの標準的な React コンポーネントです。これらは JavaScript としてブラウザに送信され、そこで実行およびハイドレートされて豊富なインタラクティブ性を提供します。Next.js App Router では、ファイルの先頭に "use client" ディレクティブを配置することで、コンポーネントをクライアントコンポーネントとして明示的にマークします。
UI にインタラクティブ性やクライアントサイドの状態が必要な場合は、常にクライアントコンポーネントを使用する必要があります。
onClick、onChange などのユーザーイベントやフォーム送信の処理。useState を使用したローカル状態の管理、または useReducer を使用した複雑なロジックの管理。useEffect を介した副作用の利用(例:WebSocket の購読や DOM との対話)。Geolocation や IntersectionObserver などのブラウザ API の使用。現代の React の真の力は、両方のパラダイムを組み合わせることにあります。最善のプラクティスは、アプリケーションツリー全体をサーバーコンポーネントで構築し、インタラクティブ性が必要なツリーの特定の葉の部分にのみクライアントコンポーネントを「散りばめる」ことです。
ブログ投稿ページを構築することを想像してみてください。
onClick ハンドラーとクライアントサイドの状態が必要です。これらの部分のみを別のファイルに抽出し、"use client" でマークし、サーバーコンポーネントのレイアウトにインポートします。// This is a Server Component (default in Next.js)
import db from '@/lib/db';
import LikeButton from './LikeButton'; // Client Component
export default async function BlogPost({ id }) {
// Direct, secure database access
const post = await db.post.findUnique({ where: { id } });
return (
<article>
<h1>{post.title}</h1>
<div dangerouslySetInnerHTML={{ __html: post.content }} />
{/* We pass static data to an interactive Client Component */}
<LikeButton initialLikes={post.likes} postId={post.id} />
</article>
);
}
関連資料: SSR で苦労している場合は、Next.js Hydration Errors の修正に関するこのガイドをチェックしてください。
できません。クライアントコンポーネントはブラウザで実行されるため、インポートするコンポーネントもすべてブラウザで実行され(そして JS バンドルに含まれ)ます。ただし、サーバーコンポーネントをクライアントコンポーネントの children プロップとして渡すことはできます。これにより、サーバーコンポーネントの環境が維持されます。
はい!Next.js のようなフレームワークでは、クライアントコンポーネントは初期 HTML を生成するためにサーバーでプリレンダリングされます(SSR)。しかし、インタラクティブ性を持たせるためにクライアントにも送信され、ハイドレートされます。一方、サーバーコンポーネントはサーバーでのみレンダリングされ、クライアントでハイドレートされることはありません。
サーバーコンポーネントはステートレスです。静的なデータ(データベースクエリの結果など)は、プロップを介してクライアントコンポーネントに渡すことができます。ショッピングカートやユーザーテーマのようなグローバルなインタラクティブな状態が必要な場合は、Zustand、Jotai、React Context などのライブラリを使用して、その状態をクライアントコンポーネントツリー内で完全に管理する必要があります。
AI CLIログの整形、Cron式の作成、JWTの解析、chmod権限の計算をオフラインで実行。

React Server Components Flightプロトコルのストリーミングワイヤーフォーマット、シリアライゼーション、選択的ハイドレーションについて、プロダクショングレードのアーキテクチャとコード例を交えて解説する包括的なガイド。
続きを読む
Next.js14でServer Actions、useFormState、useFormStatus、Zodを使ったフォーム管理を詳しく解説し、クライアントサイドJavaScriptの負担なく、モダンでプログレッシブエンハンスメントなフォームを構築する方法を学びましょう。
続きを読む
ServerComponentsでのReactハイドレーションミスマッチのデバッグ方法を習得し、クライアントとサーバーのマークアップの違いを回避し、Next.jsでのハイドレーションエラーを解消しましょう。
続きを読む