React学習ロードマップ(実装例付き) - nyg1971/vanillaVsReact GitHub Wiki
実装ベースでReactの核心概念を段階的に理解していく学習プランです。
- 実装中心: 各概念を実際のコードで体験
- 段階的: 簡単 → 複雑に進む
- 比較学習: 従来手法 vs Reactで違いを実感
- 実用的: 実際の開発で使える知識
- Virtual DOMの概念理解
- パフォーマンス特性の体感
- 差分検出の威力を実感
// 実装例:手動DOM操作 vs React
// ファイル:VirtualDomDemo.jsx
- 1000件のアイテム生成・更新
- 処理時間の測定・比較
- シンプルなデータ構造
// 実装例:差分検出の威力体感
// ファイル:VirtualDomAdvanced.jsx
- 複雑なデータ構造(進捗バー、タグ、優先度)
- 部分更新(10%のアイテムのみ)
- 手動差分管理の複雑さを実感
// 実装予定:Virtual DOMツリー可視化
// ファイル:VirtualDomVisualizer.jsx
- Virtual DOMツリーの表示
- 差分計算プロセスの可視化
- Reconciliation(調停)の理解
- Virtual DOMが有利/不利なケース
- 差分検出アルゴリズムの基本
- パフォーマンス最適化の考え方
- クラスコンポーネントの問題点理解
- Hooksの革新性を体感
- 関数コンポーネント中心設計の理解
// 実装例:同じ機能を2つの方法で実装
// ファイル:ClassVsFunctionDemo.jsx
// クラスコンポーネント版
class CounterClass extends Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
// ライフサイクルメソッド...
}
// 関数コンポーネント + Hooks版
function CounterFunction() {
const [count, setCount] = useState(0);
// useEffectでライフサイクル...
}
// 実装例:ロジックの再利用
// ファイル:CustomHooksDemo.jsx
// カスタムHook
function useCounter(initialValue = 0) {
const [count, setCount] = useState(initialValue);
const increment = () => setCount(c => c + 1);
const decrement = () => setCount(c => c - 1);
return { count, increment, decrement };
}
// 複数のコンポーネントで再利用
function Counter1() {
const { count, increment } = useCounter(0);
// ...
}
function Counter2() {
const { count, decrement } = useCounter(10);
// ...
}
// 実装例:データフェッチとクリーンアップ
// ファイル:EffectHooksDemo.jsx
- APIからのデータ取得
- リアルタイム通信(WebSocket)
- タイマー管理
- クリーンアップの重要性
- this binding問題の解決
- ロジックの分離と再利用
- 副作用の適切な管理
- 状態管理の複雑化問題を体感
- useState → useReducer → 外部ライブラリの流れ
- 適切な状態管理手法の選択
// 実装例:複雑になるuseStateの管理
// ファイル:StateComplexityDemo.jsx
- 50個の相互依存する状態
- useState地獄の体験
- デバッグの困難さ
// 実装例:同じ機能をuseReducerで実装
// ファイル:ReducerDemo.jsx
const initialState = {
user: null,
todos: [],
filter: 'all',
loading: false
};
function appReducer(state, action) {
switch (action.type) {
case 'LOGIN':
return { ...state, user: action.user };
case 'ADD_TODO':
return { ...state, todos: [...state.todos, action.todo] };
// ...
}
}
// 実装例:コンポーネント間での状態共有
// ファイル:ContextDemo.jsx
- Provider/Consumer パターン
- prop drilling 問題の解決
- パフォーマンス考慮事項
// 実装例:同じアプリを異なる手法で実装
// ファイル:StateManagementComparison.jsx
- Pure React(useState + Context)
- Zustand
- Redux Toolkit (簡易版)
- 状態管理の選択基準
- パフォーマンスとのトレードオフ
- 開発体験と保守性
- 再利用性の高いコンポーネント作成
- デザインパターンの理解
- 実際のプロジェクトで使える設計力
// 実装例:再利用可能なコンポーネント群
// ファイル:UIComponentsDemo.jsx
// Button コンポーネント
function Button({ variant, size, onClick, children, ...props }) {
return (
<button
className={`btn btn-${variant} btn-${size}`}
onClick={onClick}
{...props}
>
{children}
</button>
);
}
// Input コンポーネント
// Modal コンポーネント
// Card コンポーネント
// 実装例:複雑なUIの構造化
// ファイル:CompoundComponentsDemo.jsx
// 使用例
<Select onValueChange={handleChange}>
<Select.Trigger>
<Select.Value placeholder="選択してください" />
</Select.Trigger>
<Select.Content>
<Select.Item value="option1">オプション1</Select.Item>
<Select.Item value="option2">オプション2</Select.Item>
</Select.Content>
</Select>
// 実装例:ロジックの抽象化パターン
// ファイル:AdvancedPatternsDemo.jsx
// Render Props
function DataFetcher({ url, render }) {
const [data, setData] = useState(null);
// データ取得ロジック...
return render(data);
}
// HOC
function withLoading(Component) {
return function WithLoadingComponent(props) {
// ローディング状態管理...
return <Component {...props} />;
};
}
// 実装例:最適化テクニック
// ファイル:PerformanceDemo.jsx
- React.memo の使用
- useMemo と useCallback
- コンポーネントの分割戦略
- 仮想化(virtualization)
- コンポーネント設計の原則
- パフォーマンスとのバランス
- メンテナブルなコード構造
- Node.js: v18+
- React: v18+
- Vite: 開発サーバー
- TypeScript: 型安全性(オプション)
- React Developer Tools: ブラウザ拡張
- VS Code: React/TypeScript対応
- ESLint/Prettier: コード品質管理
src/
├── components/
│ ├── Stage1/
│ │ ├── VirtualDomDemo.jsx
│ │ └── VirtualDomAdvanced.jsx
│ ├── Stage2/
│ │ ├── ClassVsFunctionDemo.jsx
│ │ └── CustomHooksDemo.jsx
│ ├── Stage3/
│ │ └── StateManagementDemo.jsx
│ └── Stage4/
│ └── ComponentDesignDemo.jsx
├── hooks/
├── utils/
└── App.jsx
- 概念の簡単な説明
- 実装する内容の概要
- 期待される学習効果
- コードを提供
- 段階的に機能追加
- 動作確認とデバッグ
- 実装結果の確認
- 質問・ディスカッション
- 追加実験の提案
- 前Stageの復習
- 新しい概念の導入
- 実践的な応用例
このロードマップを完了すると以下ができるようになります:
- Reactの動作原理の深い理解
- パフォーマンス最適化の実践
- 適切な設計パターンの選択
- 再利用可能なコンポーネント設計
- 効率的な状態管理
- 保守性の高いコード作成
- 複雑なUI要件への対応
- パフォーマンス問題の解決
- チーム開発での協業
このロードマップにより、Reactの表面的な使い方ではなく、思想を理解した上での実践的な開発力を身につけることができます。