Server Components

React 19 のサーバーで実行されるコンポーネントで、JS バンドルサイズを削減しパフォーマンスを向上させる

Reactフロントエンド

Server Components とは

React Server Components (RSC) は、サーバーで実行されるコンポーネントで、JavaScript がクライアントに送信されない。DB アクセスや API キーの使用がサーバーで安全に行え、バンドルサイズが削減される。Next.js App Router ではデフォルトで全コンポーネントが Server Component。

Server vs Client Component

観点 Server Component Client Component
実行場所 サーバー ブラウザ
JS バンドル 含まれない 含まれる
DB アクセス ✅ 直接可能 ❌ API 経由
useState / useEffect ❌ 使えない ✅ 使える
イベントハンドラ ❌ 使えない ✅ 使える
宣言 デフォルト 'use client'

使い分け

// Server Component (デフォルト): DB アクセス、データ取得
async function UserList() {
  const users = await db.users.findMany(); // サーバーで直接 DB アクセス
  return (
    <ul>
      {users.map(u => <li key={u.id}>{u.name}</li>)}
    </ul>
  );
}

// Client Component: インタラクティブな UI
'use client';
function SearchBox() {
  const [query, setQuery] = useState('');
  return <input value={query} onChange={e => setQuery(e.target.value)} />;
}

// 組み合わせ
async function Page() {
  return (
    <div>
      <SearchBox />       {/* Client Component */}
      <UserList />        {/* Server Component */}
    </div>
  );
}

バンドルサイズへの影響

従来の SSR:
  サーバーで HTML 生成 → クライアントに全 JS を送信 → Hydration

Server Components:
  サーバーで HTML 生成 → Client Component の JS のみ送信
  Server Component の JS は送信されない → バンドルサイズ削減

Server Actions

// Server Action: サーバーで実行される関数
async function createUser(formData: FormData) {
  'use server';
  await db.users.create({
    name: formData.get('name') as string,
    email: formData.get('email') as string,
  });
}

// Client Component から呼び出し
'use client';
function CreateUserForm() {
  return (
    <form action={createUser}>
      <input name="name" />
      <input name="email" />
      <button type="submit">Create</button>
    </form>
  );
}

判断基準

コンポーネント 推奨
データ取得、DB アクセス Server Component
静的な表示 Server Component
フォーム、ボタン、入力 Client Component
useState, useEffect が必要 Client Component
重いライブラリ (チャート等) Client Component (lazy load)

Server Components を扱う関連書籍も多い。

関連用語