🐤

Next.js:Server Component,Client Component

2024/12/04に公開

この記事は、プログラミング初心者である筆者の備忘録です。
今回はコンポーネントについてまとめました。

コンポーネントとは

アプリケーションは、小さな「部品(コンポーネント)」の集合体として構築されます。Next.jsでは、これらのコンポーネントが「どの環境で動作するのか」を設計段階で明確にすることが重要です。この動作環境の設定は、ReactServerComponents(RSC) を活用することで柔軟に行えます。


クライアントコンポーネント

Next.js では、デフォルトでコンポーネントは サーバーコンポーネント として動作しますが、特定のユースケースに応じて クライアントコンポーネント を使用する必要があります。クライアントコンポーネントを指定するには、ファイルの先頭に"use client";をつけます。


クライアントコンポーネント使用時の注意点

  1. 意図しないクライアントコンポーネント化に注意
    サーバーコンポーネントに useStateuseEffect などの React Hooks を追加すると、自動的にクライアントコンポーネントとして扱われることがある。
    必要以上にクライアント化しないよう、設計時にサーバーとクライアントの役割を明確にするとよい。

  2. Client Boundary(クライアントの境界線)の影響
    クライアントコンポーネント内では以下の制約がある。
    ・データフェッチができない
    サーバーコンポーネントでデータを取得し、クライアントコンポーネントに props 経由で渡す必要がある。
    ・パフォーマンスの低下
    過剰なクライアント化により、レンダリング時間やクライアントの負荷が増加する可能性がある。

  3. Composition パターンでの回避
    サーバーコンポーネントとクライアントコンポーネントを組み合わせて、適切にデータやUIを分離することで制約を回避できる。


ユースケース(クライアントコンポーネントを使用する場合)

  1. React Hooks を使用する場合
    useStateuseEffectuseRef などのフックはクライアントコンポーネントでのみ利用可能。
    例:動的な状態管理、ライフサイクル処理。

  2. イベントハンドラを使用する場合
    ボタンクリックやフォーム送信などのユーザー操作を処理する場合はクライアントコンポーネントが必要。

  3. ブラウザ API を使用する場合
    window や document などのブラウザ特有のオブジェクトや機能を利用する場合。

  4. クライアント操作が多い UI コンポーネント
    インタラクティブな要素(例:フォーム、タブ切り替え、モーダル、ハンバーガーメニューの開閉など)。


コンポーネントのベストプラクティス

  1. RSCを積極的に利用
    サーバーで処理可能な部分はサーバーコンポーネントに任せることで、パフォーマンスを最大化できる。再レンダリング時の負荷を軽減し、初期ロードを高速化する。

  2. クライアントコンポーネント は控えめに利用
    クライアントでのみ必要な処理(インタラクションや状態管理)を扱うコンポーネントに限定。
    必要以上にクライアント化すると、パフォーマンスが低下する。

  3. ユースケースに応じた使い分け
    フォームや検索機能useStateuseEffectなどのフックを利用する場合はクライアントコンポーネントで対応。インタラクティブな機能(例:ボタン操作、フォーム入力、モーダル表示など)はまとめてクライアントで処理する。

https://ja.next-community-docs.dev/docs/app/building-your-application/rendering/server-components

https://ja.next-community-docs.dev/docs/app/building-your-application/rendering/client-components

Discussion