React・新しい書き方とその先

Next.jsへ移るとき

求人でもよく見るNext.js。ReactとNext.jsの関係、サーバーコンポーネントで何が変わるのか、移る判断と移らない判断を整理します。このコースで学んだことがどこまでそのまま使えるかも、正直に線引きします。

コースの最後はNext.jsです。ここまでで作ったのは「ブラウザの中だけで動くReactアプリ」でした。実務では、そこにサーバー側が加わることが多くあります。

ReactとNext.jsの関係

  • React——UIを作るライブラリ。画面の組み立て方だけを提供する
  • Next.js——Reactを使ってサイトやアプリを組み立てるフレームワーク

Next.jsには、Reactに無いものが最初から入っています。

Next.jsが持っているものこのコースではどうしていたか
ルーティングReact Routerを自分で入れた
サーバー側での描画無し(ブラウザで組み立てていた)
データ取得の仕組みuseEffect/TanStack Queryを自分で入れた
画像・フォントの最適化無し
APIを書く場所無し(別サーバーが必要)

「Reactの上に、足りないものを載せた箱」——これがフレームワークです。

いちばん大きい変化:どこで動くか

Next.jsのApp Routerでは、コンポーネントは既定でサーバー側で動きます(サーバーコンポーネント)。

// これはサーバーで動く。ブラウザにJavaScriptは送られない
export default async function BirdsPage() {
  const birds: Bird[] = await getBirds()      // データ取得を直接書ける

  return (
    <ul>
      {birds.map((bird) => <li key={bird.id}>{bird.name}</li>)}
    </ul>
  )
}

useEffectuseStateuseQueryも出てきません。サーバーで取ってきて、そのままHTMLにするからです。

ブラウザ側の機能(state・イベント・useEffect)が必要な部品だけ、印を付けて分けます。

'use client'   // ← この1行で、ここから下はブラウザで動く

import { useState } from 'react'

export function FavoriteButton() {
  const [liked, setLiked] = useState(false)

}

ルーティングはフォルダで決まる

React Routerでは対応表を書きましたが、Next.jsはフォルダの構造がそのままURLになります。

app/
├── page.tsx              → /
├── birds/
│   ├── page.tsx          → /birds
│   └── [id]/
│       └── page.tsx      → /birds/1
└── not-found.tsx         → 404

[id]useParamsにあたる部分です。<Routes>を書かなくていい代わりに、フォルダの置き方を覚えることになります。

いつ移るか、いつ移らないか

これが実務での判断です。

状況判断
検索エンジンに読ませたい(メディア・EC・LP)Next.js。ブラウザで組み立てるReactは不利
サーバー側の処理が要る(APIキーを隠す、DBを触る)Next.js
表示速度が事業に直結するNext.js
ログインの内側だけのアプリ(管理画面・社内ツール)ViteとReactで十分
個人の小さなアプリ・練習ViteとReactで十分
すでにあるサイトに一部だけ足すReact

移るときの学習順

移ると決めたら、この順で学ぶのが効率的です。

  1. App Routerのフォルダ構成——page / layout / loading / error
  2. サーバーとクライアントの境界——'use client'をどこに置くか
  3. データ取得——サーバーコンポーネントでawaitする形
  4. キャッシュ——ここがNext.jsでいちばん難しく、バージョンで変わりやすい
  5. デプロイ——Vercelが最短。他社でも動くが制約を確認する

公式ドキュメントも見てみる

ja.react.dev外部サイトReact アプリの作成 – ReactReact公式の「Reactアプリの作成」。フレームワークを勧める理由と選択肢がまとまっていますnextjs.org外部サイトGetting Started: Server and Client Components | Next.jsNext.js公式の「Server and Client Components」。境界の考え方は、ここを読むのがいちばん確実です(英語)

このレッスンのまとめ

  1. ReactはUIのライブラリ、Next.jsはアプリを組み立てるフレームワーク
  2. Next.jsが持っているのはルーティング・サーバー描画・データ取得・最適化・API
  3. App Routerでは既定でサーバー側。ブラウザ機能が要る部品に'use client'を付ける
  4. 'use client'の中身は、このコースでやってきたことそのもの
  5. サーバーコンポーネントではstate・イベント・windowが使えない
  6. ルーティングはフォルダ構造がURLになる
  7. 検索エンジン・サーバー処理が要るなら移る。ログインの内側だけなら移らなくていい

長い道のりでした。次でいよいよ最終回、ビルドして公開します

やってみよう:Next.jsを1つ立ち上げてみる

移るかどうかは別として、触ってみると距離感がつかめます

  1. 別のフォルダでnpx create-next-app@latestを実行する(TypeScriptは「Yes」で)
  2. npm run devで立ち上げ、app/page.tsxを書きかえて反映されるのを見る
  3. app/page.tsxuseStateを書いて、エラーになるのを確認する
  4. ファイルの先頭に'use client'を足して、動くようになるのを確認する
  5. app/birds/page.tsxを作り、/birdsで開けることを確認する
npx create-next-app@latest

3番と4番が今回の核心です。「サーバーで動くのか、ブラウザで動くのか」を意識する——これがNext.jsに入るときの最初の壁で、越えてしまえば残りはこのコースの知識で戦えます。

ことりずかんはViteのままで構いません。 移植は、必要になったときにやればいい作業です。

よくある質問

Next.jsとReactの違いは何ですか?
ReactはUIを作るライブラリ、Next.jsはそれを使ってサイトやアプリを組み立てるためのフレームワークです。ルーティング、サーバー側の処理、画像やフォントの最適化など、Reactに無い部分が最初から入っています。
このコースで学んだことは使えますか?
コンポーネント・props・state・フックの考え方はそのまま使えます。変わるのはルーティングの書き方と、どこでコードが動くか(サーバーかブラウザか)の意識です。
サーバーコンポーネントとは何ですか?
サーバー側だけで実行され、ブラウザにJavaScriptを送らないコンポーネントです。データ取得を直接書ける代わりに、useStateやイベントハンドラは使えません。
個人開発でもNext.jsにすべきですか?
検索エンジンに読ませたい、サーバー側の処理が要る、という条件が無いなら、ViteとReactのままで十分です。むしろ覚えることが増えるぶん、目的が無いと遠回りになります。