コース一覧
Next.jsフルスタック:サーバー・データ取得・API
どちらに置くか

Next.jsフルスタック:サーバー・データ取得・API

Server ComponentsとClient Components、use client、サーバーfetch、asyncコンポーネント、動的ルート、params、notFound、キャッシュ、Route Handler、GET・POST API、Server Actions、フォームを扱う全24レッスンのフルスタックコースです。fleamaの商品取得と出品機能をNext.js内へ実装します。

1
Server / Client Components
01. サーバーで動く部品10分
02. Server Components15分
03. use clientの宣言15分
04. どちらに置くか15分
05. 境界をまたぐ合成15分
06. 境界の設計15分
07. つくる - 部品の仕分け20分
08. 第4章クイズ15分
2
データ取得と動的ルート
01. サーバーでfetch15分
02. asyncコンポーネント15分
03. 動的ルート15分
04. paramsを受け取る15分
05. notFoundで404にする15分
06. キャッシュのきほん10分
07. 検索をサーバーで15分
08. つくる - サーバー取得化20分
09. 第5章クイズ15分
3
API Routesとフォーム
01. Route Handler15分
02. GET APIを作る15分
03. POST APIを作る15分
04. Server Actionsの触り15分
05. フォーム実装15分
06. つくる - 受け口の完成20分
07. 第6章クイズ15分

どちらに置くか

置き場所は4つの質問で決まる

迷ったときの判断基準

部品ごとに "use client" を書くかどうかは、感覚で決めるものではありません。次の4つのどれか1つでも当てはまればクライアント、どれも当てはまらなければサーバーです。

  1. state を持つ — useState や useReducer で値を持ち続ける
  2. イベントを受け取る — onClick や onChange や onSubmit が付いている
  3. ブラウザだけにあるものを使う — window document localStorage など
  4. フックを使う — useEffect や自作フック、useRouter のようなものも含む

上から順に見ていって、1つでも当たったらそこで打ち切ってクライアントにします。全部外れたらサーバーのままにします。

fleama で当てはめてみる

部品当てはまるもの置き場所
ItemCardどれも無いサーバー
ItemListどれも無いサーバー
SearchBoxstate とイベントクライアント
CartButtonイベントクライアント
ThemeTogglelocalStorageクライアント

表示するだけの部品はほとんどサーバーに残ります。ブラウザ側に移るのは、受講生が指で触る部分だけだと考えると、だいたい合っています。

迷いやすいところ

map で一覧を並べるのは state ではないので、サーバーのままで構いません。日付を整形する関数も、計算しているだけならサーバーで動きます。逆に、一見ただの表示に見えても new Date() の結果をそのまま出すものは、サーバーとブラウザで表示がずれることがあるので注意が要ります。

判断に迷ったら、まずサーバーのままにしてみて、動かなくなってからクライアントにするのが安全です。あとから足すのは簡単ですが、いちど広げた境界を戻すのは手間がかかります。

演習

判断基準を関数にして、部品を自動で仕分けます。

ヒント

if (part.hasState || part.hasHandler || part.usesBrowserApi) return "client"; の形です

最後に return "server"; を書けば、残りは全部サーバーになります

部品の名前で場合分けすると、部品が増えたときに破綻します

layout.tsx
page.tsx
プレビュー

できているか

  • 6つの部品を仕分けている
  • サーバーに残す部品が3つある
  • クライアントに移す部品が3つある
  • 表示だけの ItemCard はサーバー
  • state を持つ SearchBox はクライアント
  • イベントを受け取る CartButton はクライアント
  • ブラウザ API を使う ThemeToggle はクライアント
  • 仕分けの結果が表に出ている
  • state の有無を判断に使っている
  • ブラウザ API の有無を判断に使っている
エディタを読み込んでいます