React環境構築
この章では、現代のWebアプリ開発に欠かせない「React」の環境構築について一緒に学んでいきましょう。Reactは最初は少し難しく感じるかもしれませんが、コンポーネントという考え方に慣れてしまえば、とても効率的にWebアプリが作れるようになりますよ。
学習目標
- Reactの基本的な考え方とコンポーネントについて理解する
 - Viteを使った最新のReact開発環境を作る
 - シンプルなTodoアプリを作りながらReactに慣れる
 - ビルドとデプロイの基本を覚える
 
Reactって何?
基本的な概念
React は、Meta(旧Facebook)が開発したユーザーインターフェース(UI)を作るためのJavaScriptライブラリです。「部品(コンポーネント)を組み合わせてWebページを作る」という考え方が特徴です。
Reactの魅力
- コンポーネントベース: UIを再利用できる部品として作成
 - 宣言的なUI: 「どう表示するか」ではなく「何を表示するか」を記述
 - 仮想DOM: 画面更新が高速で効率的
 - 単方向データフロー: データの流れが分かりやすい
 
Reactの基本的な概念
Reactには押さえておくべき重要な概念がいくつかあります。ここでは最低限必要なものだけ紹介します。
Note: より詳しい内容はReact公式ドキュメント(日本語)で学べます。
1. コンポーネント
コンポーネントは、UIの一部分を担当する再利用可能な部品です。
// 関数コンポーネント(現在の主流)
const Welcome = ({ name }) => {
  return <h1>こんにちは、{name}さん!</h1>;
};
「コンポーネント」という名前が難しそうに聞こえるかもしれませんが、入力(Props)を受け取り、出力として見た目(JSX)を返すただのJavaScriptの関数です。
Reactではこれを <Welcome name="太郎" /> のように使うことができ、画面上に「こんにちは、太郎さん!」と表示されます。
2. Props(プロップス)
親コンポーネントから子コンポーネントへデータを渡す仕組みです。
// Props - 親から子への値の渡し方
function Button({ text, onClick }) {
  return <button onClick={onClick}>{text}</button>;
}
ただの関数の引数です。JavaScriptの関数なので文字列だけでなく数値や関数、オブジェクトなどあらゆるものを渡すことができます。
3. State(状態)
コンポーネントが持つ内部データです。useStateを使って管理します。
// State - コンポーネントの内部状態
import { useState } from "react";
function Counter() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>カウント: {count}</p>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
}
Viteによるプロジェクト作成
1. Viteとは
Vite(ヴィート)は、高速で軽量なビルドツール・開発サーバーです。
特徴:
- ⚡ 高速: ES modules とネイティブESMを活用
 - 🔥 HMR: Hot Module Replacement
 - 📦 最適化: Rollup ベースのプロダクションビルド
 - 🔧 設定不要: ゼロコンフィグで開始可能
 
2. プロジェクト作成
# Viteでプロジェクト作成
pnpm create vite my-react-app --template react-ts
# プロジェクトに移動
cd my-react-app
# 依存関係インストール
pnpm install
# 開発サーバー起動
pnpm run dev
3. プロジェクト構造
my-react-app/
├── public/           # 静的ファイル
│   └── vite.svg
├── src/             # ソースコード
│   ├── assets/      # アセット(画像、CSS等)
│   ├── components/  # コンポーネント
│   ├── hooks/       # カスタムフック
│   ├── types/       # TypeScript型定義
│   ├── App.tsx      # メインアプリコンポーネント
│   ├── main.tsx     # エントリーポイント
│   └── index.css    # グローバルCSS
├── index.html       # HTMLテンプレート
├── package.json     # 依存関係・スクリプト
├── tsconfig.json    # TypeScript設定
└── vite.config.ts   # Vite設定
TypeScript設定
Viteで作成されたプロジェクトには、既に最適な設定が含まれています。パスエイリアスを使いたい場合は以下を追加します。
// tsconfig.json
{
  "extends": "@tsconfig/vite-react/tsconfig.json",
  "compilerOptions": {
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": ["src"]
}
# ベース設定のインストール
pnpm add -D @tsconfig/vite-react
Note Viteはtsconfig.jsonの
paths設定を自動的に認識するため、vite.config.tsでの追加設定は不要です。
基本的なReactアプリケーション構築
シンプルなTodoアプリ
型定義
// src/types/todo.ts
export interface Todo {
  id: number;
  text: string;
  completed: boolean;
}
メインアプリケーション
// src/App.tsx
import { useState } from "react";
import type { Todo } from "@/types/todo";
function App() {
  const [todos, setTodos] = useState<Todo[]>([]);
  const [input, setInput] = useState("");
  const addTodo = () => {
    if (input.trim()) {
      setTodos([...todos, { id: Date.now(), text: input, completed: false }]);
      setInput("");
    }
  };
  const toggleTodo = (id: number) => {
    setTodos(
      todos.map((todo) =>
        todo.id === id ? { ...todo, completed: !todo.completed } : todo,
      ),
    );
  };
  return (
    <div className="app">
      <h1>Todo App</h1>
      <div>
        <input
          value={input}
          onChange={(e) => setInput(e.target.value)}
          placeholder="Add a new todo..."
        />
        <button onClick={addTodo}>Add</button>
      </div>
      <ul>
        {todos.map((todo) => (
          <li key={todo.id} onClick={() => toggleTodo(todo.id)}>
            <span
              style={{
                textDecoration: todo.completed ? "line-through" : "none",
              }}
            >
              {todo.text}
            </span>
          </li>
        ))}
      </ul>
    </div>
  );
}
export default App;
Note 実際のアプリでは、コンポーネントを分割して再利用性を高めます。上記は学習用の最小構成です。
React Hooks の基本
Reactには「Hooks」という機能があります。最もよく使う2つを紹介します。
useState - 状態管理
import { useState } from "react";
function Counter() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>カウント: {count}</p>
      <button onClick={() => setCount(count + 1)}>+1</button>
    </div>
  );
}
useEffect - 副作用処理
import { useState, useEffect } from "react";
function UserProfile({ userId }: { userId: number }) {
  const [user, setUser] = useState(null);
  useEffect(() => {
    fetch(`/api/users/${userId}`)
      .then((res) => res.json())
      .then(setUser);
  }, [userId]); // userIdが変わったら再実行
  return <div>{user?.name}</div>;
}
Note より詳しくはReact公式ドキュメントを参照してください。
ビルドとデプロイ
プロダクションビルド
pnpm run build      # ビルド実行
pnpm run preview    # ビルド結果の確認
環境変数
# .env.local
VITE_API_BASE_URL=http://localhost:3001/api
// 使用例
const apiUrl = import.meta.env.VITE_API_BASE_URL;
Vercel デプロイ (任意)
npm i -g vercel
vercel --prod
Note VercelはViteプロジェクトを自動検出するため、設定ファイルは通常不要です。
トラブルシューティング
ホットリロードが効かない
# 開発サーバーを再起動
Ctrl+C
pnpm run dev
ビルドエラー
# 依存関係を再インストール
rm -rf node_modules pnpm-lock.yaml
pnpm install
参考リンク
まとめ
この章では、React環境構築の基本を学びました。
ポイント
- Vite: 高速な開発サーバーとビルドツール
 - コンポーネント: UIを部品として作る考え方
 - Props: 親から子へデータを渡す仕組み
 - State: コンポーネントが持つ内部データ
 - Hooks: 
useStateとuseEffectが基本 
Reactは最初は難しく感じるかもしれませんが、コンポーネントを作りながら慣れていくことが一番の近道です。まずは小さなアプリから始めて、少しずつ機能を追加していきましょう!