React Server Componentsをわかりやすく解説

React Server Componentsの解説

React Server Componentsの解説:use client、Server Actions、Suspense | We.Inc

React Server Components をわかりやすく解説します。境界の図解、"use client" のルール、データ取得、useActionState を使ったフォームのサーバーアクション、Suspense によるストリーミング、よくあるエラーの直し方まで。

React Server Components はサーバーでレンダリングされ、自身のJavaScriptではなく、完成したUIをブラウザーに送ります。データを直接 await したり、秘密情報をそのまま使ったりできます。インタラクティブな部分はすべて、"use client" で始まるファイルである Client Component に置きます。フォームからは "use server" を付けたサーバー関数を呼び出せ、Suspense を使えば遅い部分を後からストリーミングできます。

必要な3つのディレクティブとフック

まずは図から見てください。青い箱はサーバーにとどまり、オレンジの箱はブラウザーにも送られます。そのうえで、データ取得、フォーム、ストリーミングのパターンをコピーし、ビルドでエラーが出たらエラー表を使ってください。

よくある質問

Server Components はサーバーサイドレンダリングと同じですか?

いいえ。サーバーサイドレンダリングは、どんなコンポーネントでも初回読み込み用にHTMLへ変換しますが、JavaScriptも送ります。Server Component は自身のJavaScriptを一切送らず、出力だけを送ります。Client Components も、初回読み込みではサーバーでレンダリングされます。

Server Components を使うには Next.js が必要ですか?

対応しているフレームワークかバンドラーが必要です。最も広く使われているのは Next.js の App Router で、Waku など、ほかにもいくつか対応しているものがあります。

Client Component から Server Component をインポートできますか?

いいえ。クライアント側のファイルからインポートすると、そのモジュールはクライアントのバンドルに含まれてしまいます。代わりに、親の Server Component から children や別の props として Server Component を渡してください。

サーバーアクションとサーバー関数の違いは何ですか?

React は現在、"use server" を付けた関数をすべてサーバー関数と呼んでいます。それがフォームの action として使われたり、トランジションの中で呼ばれたりする場合、よくサーバーアクションと呼ばれます。サーバーアクションという用語を最初に使ったのは Next.js です。

useActionState は JavaScript なしでも動きますか?

ハイドレーション前でもフォームはサーバー関数に送信されるので、送信自体はできます。保留中の状態やインラインのメッセージには JavaScript が必要なので、どちらの場合でもサーバーが役に立つページを返すようにしてください。

このモデルがWebサイトに役立つ理由

サーバー関数のセキュリティチェックリスト

どこで何が実行されるか

それぞれが実行できる場所

Server Components と Client Components

データを読む Server Component

App Router では、特に指定しない限りコンポーネントは Server Components です。非同期にでき、データベースと直接やり取りできます。このコードは一切ブラウザーに届きません。

インタラクションのための Client Component

ファイルの先頭に置いた "use client" が境界を示します。このファイルと、そこからインポートされるすべてがブラウザー向けにバンドルされます。これらのファイルは小さく保ち、ツリーの末端に置きましょう。

Client Component を通して Server Component を渡す

Client Component は Server Component をインポートできませんが、children として受け取ることはできます。サーバーが先にそれをレンダリングし、クライアントは結果を配置するだけです。

秘密情報がうっかりブラウザーに漏れないようにする

server-only パッケージをインポートしておくと、クライアント側のファイルがこのモジュールをインポートした時点でビルドが失敗します。そのため、不注意なインポートから API キーが漏れることはありません。

フォームのためのサーバー関数

サーバー関数に送信するフォーム

"use server" を付けると、非同期関数がフォームから呼び出せるエンドポイントになります。本物のフォーム送信なので、JavaScriptの読み込み前でもフォームは動作します。

useActionState で保留中の状態と結果を扱う

useActionState(React 19)はサーバー関数をラップし、直前の結果と保留中フラグを返します。そのため、余分な状態を持たなくても、ボタンに「送信中」と表示したり、メッセージを表示したりできます。

変更後にページのデータを更新する

データを変更した後は、どのパスのデータが古くなったかを Next.js に伝えましょう。そうすれば次のレンダリングで変更が反映されます。

Suspense によるストリーミング

遅い部分を Suspense でストリーミングする

遅い Server Component を Suspense で囲みます。ページの残りはフォールバックを表示した状態ですぐに送られ、遅い部分はデータが届いたときにストリーミングで表示されます。

ルート全体のための loading.tsx

page.tsx の隣に loading.tsx ファイルを置くと、そのページが自動で Suspense の境界に囲まれます。そのため、ページのデータを読み込む間も、画面遷移ですぐにそれが表示されます。

リクエストをまとめて開始する

Server Component の中で取得処理を1つずつ順番に await すると、それぞれの時間が足し合わされます。まとめて開始してから、両方を await しましょう。

よく遭遇するエラー

よくあるエラーと直し方

非同期処理が初めてならこちらから:

Promise、async/await、fetch

境界の図解

サーバー

クライアント

無料で始める · クレジットカード不要

関連: ガイド|Webマーケティングと集客を学ぶ

製品

ご利用いただける方

機能

リソース

会社情報

サイトマップを見る