Next.js:Server Component,Client Component
この記事は、プログラミング初心者である筆者の備忘録です。
今回はコンポーネントについてまとめました。
コンポーネントとは
アプリケーションは、小さな「部品(コンポーネント)」の集合体として構築されます。Next.jsでは、これらのコンポーネントが「どの環境で動作するのか」を設計段階で明確にすることが重要です。この動作環境の設定は、ReactServerComponents(RSC) を活用することで柔軟に行えます。
クライアントコンポーネント
Next.js では、デフォルトでコンポーネントは サーバーコンポーネント として動作しますが、特定のユースケースに応じて クライアントコンポーネント を使用する必要があります。クライアントコンポーネントを指定するには、ファイルの先頭に"use client";
をつけます。
クライアントコンポーネント使用時の注意点
-
意図しないクライアントコンポーネント化に注意
サーバーコンポーネントにuseState
やuseEffect
などの React Hooks を追加すると、自動的にクライアントコンポーネントとして扱われることがある。
必要以上にクライアント化しないよう、設計時にサーバーとクライアントの役割を明確にするとよい。 -
Client Boundary(クライアントの境界線)の影響
クライアントコンポーネント内では以下の制約がある。
・データフェッチができない
サーバーコンポーネントでデータを取得し、クライアントコンポーネントに props 経由で渡す必要がある。
・パフォーマンスの低下
過剰なクライアント化により、レンダリング時間やクライアントの負荷が増加する可能性がある。 -
Composition パターンでの回避
サーバーコンポーネントとクライアントコンポーネントを組み合わせて、適切にデータやUIを分離することで制約を回避できる。
ユースケース(クライアントコンポーネントを使用する場合)
-
React Hooks を使用する場合
useState
、useEffect
、useRef
などのフックはクライアントコンポーネントでのみ利用可能。
例:動的な状態管理、ライフサイクル処理。 -
イベントハンドラを使用する場合
ボタンクリックやフォーム送信などのユーザー操作を処理する場合はクライアントコンポーネントが必要。 -
ブラウザ API を使用する場合
window や document などのブラウザ特有のオブジェクトや機能を利用する場合。 -
クライアント操作が多い UI コンポーネント
インタラクティブな要素(例:フォーム、タブ切り替え、モーダル、ハンバーガーメニューの開閉など)。
コンポーネントのベストプラクティス
-
RSCを積極的に利用
サーバーで処理可能な部分はサーバーコンポーネントに任せることで、パフォーマンスを最大化できる。再レンダリング時の負荷を軽減し、初期ロードを高速化する。 -
クライアントコンポーネント は控えめに利用
クライアントでのみ必要な処理(インタラクションや状態管理)を扱うコンポーネントに限定。
必要以上にクライアント化すると、パフォーマンスが低下する。 -
ユースケースに応じた使い分け
フォームや検索機能useState
やuseEffect
などのフックを利用する場合はクライアントコンポーネントで対応。インタラクティブな機能(例:ボタン操作、フォーム入力、モーダル表示など)はまとめてクライアントで処理する。
Discussion