投稿

[今さら始める Next.js マスター #3] Server Componentsとデータ取得

Server ComponentsとClient Componentsの違い、データ取得の基本、並列取得、実務での使い分けを説明します。

[今さら始める Next.js マスター #3] Server Componentsとデータ取得

Server Componentsとは

Server Componentsは、サーバー側で実行されるReactコンポーネントです。ブラウザへ送るJavaScriptを減らしながら、データベースや外部APIに近い場所で処理できます。

Next.jsのApp Routerでは、コンポーネントは標準でServer Componentとして扱われます。ブラウザ側の状態やイベントが必要な場合だけ、"use client"を付けてClient Componentにします。

Client Componentsとの違い

項目 Server Component Client Component
実行場所 サーバー ブラウザ
状態管理 useState不可 useState使用可
イベント onClick不可 onClick使用可
データ取得 直接書きやすい API経由になりやすい
JavaScript量 少なくしやすい 増えやすい

データ取得の基本

Server Componentではasyncコンポーネントとしてデータを取得できます。

1
2
3
4
5
6
7
8
9
10
11
export default async function PostsPage() {
  const posts = await getPosts();

  return (
    <ul>
      {posts.map((post) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
}

ページ表示に必要なデータをサーバー側で準備してからHTMLを返せるため、初期表示やSEOの面でも扱いやすくなります。

並列取得を意識する

複数のデータが互いに依存していない場合は、順番に待たずに並列で取得します。

1
2
3
4
const [posts, profile] = await Promise.all([
  getPosts(),
  getProfile(),
]);

不要な待ち時間を減らすだけで、体感速度が大きく変わることがあります。

実務での使い分け

データ表示中心のページはServer Component、クリック操作やフォーム入力などユーザー操作が中心の部品はClient Componentに分けると考えやすくなります。

最初は「サーバーでできることはサーバーに寄せる」「ブラウザでしかできないことだけクライアントに置く」と覚えておくと、Next.jsらしい設計に近づきます。

この投稿は投稿者によって CC BY 4.0 の下でライセンスされています。