# TODOアプリ開発カリキュラム (Next.js + TypeScript) ## 概要 このカリキュラムは、JavaScript/TypeScript初学者がNext.js 15 (App Router)を使って実践的なTODOアプリを開発できるようになることを目的としています。 ## 学習目標 - React/Next.jsの基本的な概念を理解する - TypeScriptの型システムに慣れる - 状態管理の基本を学ぶ - CRUDアプリケーションの実装パターンを習得する - モダンなWeb開発のベストプラクティスを身につける ## 前提知識 - HTML/CSSの基礎知識 - JavaScriptの基本文法(変数、関数、配列、オブジェクト) - コマンドラインの基本操作 ## 開発環境セットアップ ### 必要なツール 1. **Node.js (v18.17以上)** - [Node.js公式サイト](https://nodejs.org/ja/)からダウンロード - `node --version`で確認 2. **Visual Studio Code** - [公式サイト](https://code.visualstudio.com/)からダウンロード - 推奨拡張機能: - TypeScript and JavaScript Language Features - React snippets - Tailwind CSS IntelliSense - Prettier - Code formatter - ESLint 3. **Git** - [Git公式サイト](https://git-scm.com/)からダウンロード - `git --version`で確認 ### プロジェクトの作成 ```bash # プロジェクトの作成 npx create-next-app@latest my-todo-app --typescript --tailwind --eslint --app --src-dir --import-alias "@/*" # プロジェクトディレクトリに移動 cd my-todo-app # 開発サーバーの起動 npm run dev ``` **📚 参考文献:** - [Next.js公式 - Installation](https://nextjs.org/docs/getting-started/installation) - [Next.js App Router入門](https://zenn.dev/hayato94087/articles/e9712c4ab7a8f1) ## 学習ステップ ### Phase 1: 基礎理解 (2-3時間) #### 学習目標 - Next.js App Routerの基本構造を理解する - ReactコンポーネントとJSXの基本を学ぶ - TypeScriptの型定義の基礎を身につける #### Step 1.1: プロジェクト構造の理解 **学習内容:** - `src/app/`ディレクトリの役割 - `page.tsx`と`layout.tsx`の違い - TypeScriptファイル(.ts/.tsx)の意味 **詳細解説:** ``` src/app/ ├── layout.tsx # 全ページ共通のレイアウト ├── page.tsx # ホームページ(/) ├── globals.css # 全体のスタイル └── favicon.ico # ファビコン ``` **📚 このステップの参考文献:** - [Next.js App Router概要](https://nextjs.org/docs/app) - [ファイルベースルーティング解説](https://zenn.dev/frontendflat/articles/nextjs-app-router-file-based-routing) #### Step 1.2: 最初のコンポーネント作成 **学習内容:** - Hello Worldコンポーネントの作成 - JSXの基本文法 - 型定義の初歩(stringやnumberの使い方) **💡 詳細な実装手順:** 1. **新しいコンポーネントファイルを作成** ```typescript // src/app/components/HelloWorld.tsx export default function HelloWorld() { return (
Reactコンポーネントの第一歩です
TODOがありません
) : ( todos.map((todo) => (本当に削除しますか?
{filter === 'active' && 'すべて完了しました!'} {filter === 'completed' && '完了したTODOがありません'} {filter === 'all' && 'TODOがありません'}
) : ( getFilteredTodos().map((todo) => ( // 通常のTODOアイテム表示TODOがありません
) : ( todos.map((todo) => (申し訳ございません。予期しないエラーが発生しました。