コース一覧
Next.jsフルスタック:サーバー・データ取得・API
サーバーでfetch

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分

サーバーでfetch

サーバーで取ると往復が1回減る

取得のコードが短くなる

React でデータを出すときは、いつも同じ手順でした。空の入れ物を useState で用意し、useEffect の中で fetch を呼び、返ってきたら setState で入れ直す。取得のためだけに3つの仕組みを並べていたわけです。

Next.js のページはサーバーで動くので、この手順が要りません。ページの関数を async にして、return の前に await fetch と書くだけです。

TypeScript (JSX)

export default async function HomePage() { const res = await fetch("/api/items"); const items = await res.json(); return <ul>{items.map((item) => <li key={item.id}>{item.title}</li>)}</ul>; }

なぜこれで足りるのか

useState と useEffect は「あとから届いたものを画面に反映する」ための道具です。ブラウザで動く部品は、まず表示してから通信するしかないので、届いたことを知らせる仕組みが要りました。

サーバーで動くページは順番が逆です。データが揃ってから HTML を組み立てて送るので、届く前の空の状態そのものが存在しません。届いたことを知らせる相手がいないので、状態も副作用も要らなくなります。

消えるもの

書かなくてよくなるものを並べると、減った量がよく分かります。

  • "use client" の宣言
  • useState による空配列の用意
  • useEffect と依存配列
  • 読み込み中フラグの出し入れ

そのうえ、組み立て終わった HTML が返るので、ソースを表示したときに商品名が入っています。第1章で見た SPA の弱点が、ここでひとつ解けます。

演習

useEffect で取っている一覧を、サーバーで取る形に書き換えます。

ヒント

export default async function HomePage() { ... } の形にします

const res = await fetch("/api/items"); のあとに const items: Item[] = await res.json(); と書きます

mock-api.json が返す中身は読めます。書き換えはしません

layout.tsx
page.tsx
mock-api.json
プレビュー

できているか

  • 一覧に5件並んでいる
  • 商品名が出ている
  • 価格が出ている
  • useEffect を使わずにサーバーで取っている
  • return の前に await fetch を書いている
エディタを読み込んでいます