Chapter 10

React エコシステム

Reactの世界の全体地図を眺めます。ルーティング、状態管理、データ取得、UIライブラリ、テスト、メタフレームワーク——それぞれどんなライブラリが存在し、どれを選べばいいのか。ここからの学習ロードマップも紹介します。

30 min

このチャプターで学ぶこと

  • Reactエコシステムの主要なカテゴリーと代表ライブラリを知っている
  • 問題に応じてどのライブラリを調べればいいか判断できる
  • Next.jsがLaravelのようなフルスタックフレームワークであることを理解できる
  • Reactを学んだ先の学習ロードマップを把握している

React エコシステム

このコースの最後のチャプターです。

チャプター9で体験したように、Reactの力はコア機能だけでなく、その周辺に広がる豊かなエコシステムにあります。このチャプターでは、Reactの世界の「地図」を眺めましょう。これからの学習の羅針盤になります。

エコシステムの基本パターン

Reactを使い続けると、こんなサイクルに入ります:

  1. 「この機能が欲しい」と思う
  2. Reactのコアだけでは足りないと気づく
  3. その問題を解決するライブラリを探す
  4. ライブラリを学んで使う
  5. さらに次の問題が出てくる → 1に戻る

これは設計通りです。 Reactは意図的に「最小限のコア」として設計されており、残りはコミュニティのライブラリに委ねています。この考え方を「バッテリー別売り」と表現する人もいます。

以下では、カテゴリーごとに主要なライブラリを紹介します。


ルーティング: React Router

シングルページアプリケーション(SPA)では、URLと表示するコンポーネントの対応をJavaScript側で管理します。これを「クライアントサイドルーティング」と言います。

React Router は事実上の標準ルーティングライブラリです。

import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';

function App() {
  return (
    <BrowserRouter>
      <nav>
        <Link to="/">ホーム</Link>
        <Link to="/about">アバウト</Link>
      </nav>
      <Routes>
        <Route path="/" element={<HomePage />} />
        <Route path="/about" element={<AboutPage />} />
        <Route path="/users/:id" element={<UserPage />} /> {/* 動的ルート */}
      </Routes>
    </BrowserRouter>
  );
}
📝 Laravelルーティングとの比較

Laravelでは routes/web.php にルートを定義します:

Route::get('/', [HomeController::class, 'index']);
Route::get('/users/{id}', [UserController::class, 'show']);

React Routerも同じ発想です。パスとコンポーネントを対応させます。違いは、ページ遷移時にサーバーへのリクエストが発生せず、JavaScriptがコンポーネントを切り替えるだけという点です。体感速度は劇的に速くなります。


状態管理: Zustand

コンポーネントをまたいで共有したいStateがある場合(ログインユーザー情報、ショッピングカートの中身など)、グローバルな状態管理が必要になります。

Zustand は最もシンプルで学習コストが低い状態管理ライブラリです:

import { create } from 'zustand';

// ストアを定義する
const useUserStore = create((set) => ({
  user: null,  // ログインユーザー情報
  setUser: (user) => set({ user }),
  logout: () => set({ user: null }),
}));

// どのコンポーネントからでも使える
function Header() {
  const user = useUserStore((state) => state.user);
  const logout = useUserStore((state) => state.logout);

  return (
    <header>
      <span>{user?.name}さん</span>
      <button onClick={logout}>ログアウト</button>
    </header>
  );
}
📝 ReduxとZustand

状態管理ライブラリとして長年の定番は Redux でした。強力ですが、設定ファイルが多くて学習コストが高いのが課題でした。Zustand はその反省から生まれた、よりシンプルなライブラリです。新規プロジェクトでは Zustand を選ぶことが増えています。既存プロジェクトでReduxを見かけることは多いので、Redux(特にRedux Toolkit)も名前として覚えておくとよいでしょう。


データ取得: TanStack Query

APIからデータを取得する処理には、想像以上に多くの「状態」があります:

チャプター7で useEffect + useState を組み合わせてこれを手動管理しましたね。TanStack Query(旧名: React Query)はこれを完全に自動化します:

import { useQuery } from '@tanstack/react-query';

function UserList() {
  // ローディング・エラー・データ・リフェッチが全自動
  const { data: users, isLoading, error } = useQuery({
    queryKey: ['users'],           // キャッシュのキー
    queryFn: () => fetch('/api/users').then(res => res.json()),
    staleTime: 5 * 60 * 1000,     // 5分間キャッシュを使い回す
  });

  if (isLoading) return <p>読み込み中...</p>;
  if (error) return <p>エラーが発生しました</p>;

  return <ul>{users.map(user => <li key={user.id}>{user.name}</li>)}</ul>;
}
📝 Laravelのキャッシュとの比較

Laravelの Cache::remember() のように、TanStack QueryはAPIレスポンスを自動的にキャッシュします。同じデータを短時間に複数のコンポーネントが要求しても、APIリクエストは1回だけ発生します。チャプター7で苦労した「ローディング・エラー・データ」の三状態管理が、ライブラリで完全に解消されます。


UIコンポーネント: shadcn/ui と Radix UI

スタイリングされたUIコンポーネント(ボタン、モーダル、ドロップダウンなど)を0から作るのは時間がかかります。UIライブラリを使うと開発速度が劇的に上がります。

shadcn/ui は近年最も注目を集めているUIライブラリです。「ライブラリをインストール」する従来の方式ではなく、コンポーネントのソースコードを自分のプロジェクトにコピーする方式をとっており、カスタマイズが容易です。

Radix UI はアクセシビリティ(WAI-ARIA対応)に特化した「スタイルなし」のコンポーネントライブラリです。shadcn/ui はRadix UIを内部で使用しています。

他に有名なUIライブラリとして Material UI(MUI)Ant DesignChakra UI などがあります。


CSS: Tailwind CSS

Tailwind CSS はユーティリティファーストのCSSフレームワークです。クラス名を組み合わせてスタイルを記述します:

// Tailwindのクラスで直接スタイリングする
<button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
  登録する
</button>

CSSファイルを別に書く必要がなく、JSXと一体化したスタイリングができます。React(とNext.js)との相性が非常によく、業界標準になりつつあります。

CSS Modules も選択肢の一つです。CSSファイルをコンポーネントごとにスコープして、クラス名の衝突を防ぎます:

/* Button.module.css */
.button { background-color: blue; }
import styles from './Button.module.css';
<button className={styles.button}>ボタン</button>

メタフレームワーク: Next.js

Reactはあくまで「UIライブラリ」です。ルーティング、APIエンドポイント、サーバーサイドレンダリング、ファイルシステムとの統合……これらが必要な「フルスタックWebアプリ」を作りたい場合は Next.js を使います。

Next.js はReactをベースにしたフルスタックフレームワークです。

📝 LaravelとNext.jsの比較

Laravelはバックエンドも含めたフルスタックフレームワークです。ルーティング、ORM、認証、テンプレートエンジン……すべてが最初から含まれています。

Next.jsもReact世界における同様の存在です。ページルーティング、APIルート、サーバーサイドレンダリング、画像最適化……Reactだけでは得られない多くの機能が最初から含まれています。

「Reactで本格的なWebアプリを作る」という文脈では、Next.jsはほぼ必須の選択肢です。実際に多くの企業がReact単体ではなく、Next.jsを採用しています。


テスト: Vitest と React Testing Library

コードが意図通りに動くことを自動で確認するテストも、Reactエコシステムの重要な一部です。

import { render, screen, fireEvent } from '@testing-library/react';
import { test, expect } from 'vitest';
import RegistrationForm from './RegistrationForm';

test('空のフォームを送信するとエラーが表示される', async () => {
  render(<RegistrationForm />);

  // ユーザーの操作をシミュレートする
  fireEvent.click(screen.getByText('登録する'));

  // エラーメッセージが表示されることを確認する
  expect(await screen.findByText('名前を入力してください')).toBeInTheDocument();
});

これからの学習ロードマップ

このコースで学んだことをベースに、次に学ぶべきことを整理します:

近いうちに学ぶべきもの

  1. Next.js — ReactでWebアプリを作るなら、ほぼ必須の次のステップ
  2. TanStack Query — API連携を本格化するとすぐに必要になる
  3. Tailwind CSS — スタイリングをより実践的に

必要になったら学ぶもの

  1. Zustand / Redux — アプリが大きくなり、状態共有が複雑になったとき
  2. React Router — Next.jsを使わないSPAを作るとき
  3. Vitest + React Testing Library — テストを書き始めるとき
  4. TypeScript — チーム開発や大きなプロジェクトで型安全性が欲しいとき

Reactの公式ドキュメント

react.dev はReactの公式ドキュメントです。日本語対応もされており、このコースで学んだ内容をより深く学べます。特に「Learn」セクションは、実際に手を動かしながら学べる構成になっています。


コースの終わりに

このコースを最後まで完走した皆さん、本当におめでとうございます。

チャプター1でJSXに戸惑い、チャプター4でStateの考え方に頭を使い、チャプター7でuseEffectの依存配列に悩み、チャプター8でフォームを手作りする苦労を経験し、チャプター9でライブラリの威力に「おお!」と感じた——その旅程は、Reactを「使える」開発者になるために必要な経験でした。

Laravelのバックエンド知識を持つ皆さんは、フロントエンド開発者として非常に有利な出発点に立っています。「データはどこから来るのか」「バリデーションはなぜ必要か」「フォームの送信処理はどう動くのか」——これらを既に知っているからです。

あとは React の文法とエコシステムに慣れるだけです。その第一歩を、このコースで踏み出せました。

自分でプロダクトを作りながら学ぶ——それが最速の上達法です。小さいものでも構いません。「このフォームを作ってみよう」「このAPIにつないでみよう」と手を動かし続けてください。

React の世界で皆さんが活躍されることを願っています。

💡 次のステップ

このコースの次に試してほしいこと:

  1. Next.js の公式チュートリアル(nextjs.org/learn)を一周する
  2. 自分が使いたいと思うWebアプリのフロントエンドを作ってみる
  3. GitHub に公開して、ポートフォリオにする

コードを書いた数だけ成長します。ぜひ書き続けてください。