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

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分

Server Components

空の状態を経由しない

何も書かなければサーバー

App Router では、app/ の中に置いた部品は何も書かなければサーバーで動きます。これを Server Components と呼びます。特別な宣言も、特別な import も要りません。今まで書いてきた普通の関数のままです。

TypeScript (JSX)

export default function ItemList() { const items = getItems(); return ( <ul> {items.map((item) => ( <li key={item.id}>{item.title}</li> ))} </ul> ); }

これで、商品を読む処理はサーバーで終わり、ブラウザには出来上がった HTML だけが届きます。

React実践の書き方と比べる

React実践では、同じことをするのに次のように書いていました。

TypeScript (JSX)

const [items, setItems] = useState<Item[]>([]); useEffect(() => { setItems(getItems()); }, []);

最初は空の配列で1回描き、そのあと useEffect が動いて、もう一度描き直す。2度手間ですし、一瞬だけ空の一覧が見えます。サーバーで動く部品なら、この往復がまるごと要りません。空の状態を持たなくてよいのが、Server Components のいちばん分かりやすい効き目です。

サーバーで動く部品にできないこと

かわりに、使えなくなるものがあります。

  • useState と useEffect などのフック
  • onClick や onChange のようなイベントの受け取り
  • window や localStorage などブラウザだけにあるもの

どれもブラウザの中の話なので、サーバーには存在しません。これらが要る部品だけを、次のレッスンでブラウザ側に移します。

演習

一覧部品を、サーバーで動く形に書き直します。

ヒント

const items = getItems(); と書くだけで済みます。react からの import はもう要りません

価格は {item.price} 円 のように出します

サーバーで動く部品は、今までどおりの普通の関数です。特別な宣言は要りません

ItemList.tsx
data.ts
page.tsx
layout.tsx
プレビュー

できているか

  • 商品が4件並んでいる
  • 商品名が出ている
  • 価格の欄を4件ぶん出している
  • 価格が出ている
  • 一覧部品をサーバーのままにしている
  • useEffect の往復をやめている
  • 空の状態を持たずに済ませている
  • getItems の結果を直接使っている
  • 一覧ページもサーバーのままにしている
エディタを読み込んでいます