🗂

Next.js 13.2 => サーバーコンポーネントとクライアントコンポーネントの使い分け

2023/03/25に公開

はじめに

Next.js 13.2で、サーバーコンポーネントとクライアントコンポーネントの概念が導入されました。この記事では、それぞれの違いと、ユースケースについて解説します。

サーバーコンポーネントとクライアントコンポーネントの違い

  1. レンダリング環境
    サーバーコンポーネントは、サーバー上でレンダリングされ、クライアントには HTML が送られます。一方、クライアントコンポーネントは、サーバーでプリレンダリングされた後、クライアントで JavaScript によってハイドレートされます。

  2. 使用目的
    サーバーコンポーネントは、主にデータフェッチやバックエンドリソースへのアクセス、秘密情報の保持、クライアントへ送信する JavaScript の量を削減するために使用されます。一方、クライアントコンポーネントは、インタラクティブな機能やイベントリスナー、状態管理、ブラウザ固有の API の使用に適しています。

使い分け方

  1. データフェッチング
    できるだけサーバーコンポーネント内でデータを取得することが推奨されています。これにより、パフォーマンスが向上し、ユーザーエクスペリエンスが向上します。

  2. バックエンドリソースへのアクセス
    サーバーコンポーネントは、バックエンドリソースに直接アクセスできます。API キーやデータベースへのアクセスなど、サーバー上で行うべき処理はサーバーコンポーネントで実装しましょう。

  3. インタラクティブな機能
    イベントリスナーや状態管理が必要なコンポーネントは、クライアントコンポーネントとして実装します。これにより、インタラクティブな機能が正しく動作し、ユーザーエクスペリエンスが向上します。

  4. パフォーマンス最適化
    クライアントコンポーネントをコンポーネントツリーの葉に移動し、サーバーコンポーネントで静的な要素をレンダリングすることで、アプリケーションのパフォーマンスを向上させることができます。

書き方

サーバーコンポーネント:

サーバーコンポーネントは、デフォルトでサーバーコンポーネントとして扱われるため、特別な記述は必要ありません。

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

クライアントコンポーネントは、ファイルの先頭に use client ディレクティブを追加することで定義します。

// @use client
import React, { useState } from 'react';

function MyClientComponent() {
  const [count, setCount] = useState(0);

  return (
    <div>
      <h1>クライアントコンポーネントです</h1>
      <p>カウント: {count}</p>
      <button onClick={() => setCount(count + 1)}>カウントアップ</button>
    </div>
  );
}
export default MyClientComponent;

ディレクトリ構成

サーバーコンポーネントとクライアントコンポーネントのファイル名に特別な命名規則はありません。ですが、コンポーネントの種類を明確にするために、以下のような方法が考えられます。

1. ファイル名やフォルダ名に接尾辞を付ける

例: サーバーコンポーネントの場合、MyServerComponent.server.tsx
クライアントコンポーネントの場合、MyClientComponent.client.tsx

2. サーバーコンポーネントとクライアントコンポーネントのフォルダを分ける

src/
├── components/
│   ├── server/
│   │   ├── MyServerComponent.tsx
│   │   └── AnotherServerComponent.tsx
│   └── client/
│       ├── MyClientComponent.tsx
│       └── AnotherClientComponent.tsx

まとめ

この記事では、Next.js 13.2で導入されたサーバーコンポーネントとクライアントコンポーネントの違い、使い分け方、それぞれの書き方、およびディレクトリ構成について解説しました。サーバーコンポーネントは主にデータフェッチやバックエンドリソースへのアクセスに適しており、クライアントコンポーネントはインタラクティブな機能や状態管理に適しています。適切な使い分けを行うことで、アプリケーションのパフォーマンスやユーザーエクスペリエンスを向上させることができます。また、コンポーネントの種類を明確にするために、ファイル名やフォルダ構造に工夫をすることが役立ちます。

Discussion