クライアントとサーバーの境界 — 'use client' がすべてを変える
クライアントとサーバーの境界 — 'use client' がすべてを変える
💡 なぜ学ぶべきか? — サーバー/クライアントの境界はバンドルサイズとセキュリティの境界
境界の3つの核心ルール
1. 'use client' の本当の意味
- ▸このファイルとこのファイルがインポートするすべてのコンポーネントが Client Component になります(感染性があります)。
- ▸つまり、'use client' は「このコンポーネントだけ」ではなく、「ここを起点とするツリー」の境界を示すものです。
- ▸1つのページの中に複数の 'use client' 境界があっても自然なことです。
2. 'use client' が必要な5つのシグナル
このうち1つでも必要なら → 'use client'。不要なら Server Component のままに。
3. Server → Client は OK、Client → Server は ❌
4. 解決策 — children prop による composition
ポイント: Client が Server を「インポート」して直接埋め込むことはできませんが、Server が生成した JSX を Client の children prop として「渡す」ことは問題ありません。これが App Router で最も重要なパターンです。
5. Server Component 内でよく混乱すること
💡 💡 境界をうまく引く5つのルール
1. 'use client' はできるだけ leaf に近い場所に
ページやレイアウトのような大きなコンポーネントに 'use client' を付けるのはほぼ誤った判断です。本当にインタラクションが必要な小さなコンポーネント(ボタン・インプット・ドロップダウン)にだけ使いましょう。
2. 'use client' の感染性を忘れない
'use client' が付いたファイルがインポートするものはすべて Client Component になります。Server Component であっても、そのインポートツリーの中に入ればクライアント扱いになります。
3. Client 内で Server コンテンツが必要なら children で受け取る
4. Server に onClick は付けられない — Client の leaf に切り出す
ビルドエラーとして検出されますが、パターンを最初から知っておくほうが効率的です。
5. 'use client' を付けても、hydration 前はサーバーでもレンダリングされる
初期 HTML はサーバーが生成し、ブラウザで hydration によって動作するようになります。つまり SSR は常に行われます。'use client' は「ブラウザ専用」という意味ではなく、「hydration 後にブラウザでも動作する」という印です。