⚙️ 講座04応用 応用編・スキップ可

Vite×AIエディタでモダンWebアプリを本格的に開発できるようになる

⏱ 想定学習時間 25時間(1日5時間 × 5日間)
📋 前提条件 講座04修了 / Node.js インストール済み
🛤 パス Path B
💻 前提スキル 講座04(Path A)修了・Cursor 基本操作ができる
講座04(Path A)との違い
比較項目 講座04(Path A) 講座04応用(Path B)
Node.js 不要 必須
ファイル構成 単一 HTML ファイル 複数コンポーネント (.tsx)
型安全 なし TypeScript で型チェックあり
ビルド 不要(ファイルをそのまま使用) npm run build で最適化
デプロイ連携 手動アップロード GitHub 連携で自動デプロイ
Vite + React + TypeScript 開発フロー(Path B)
⚡ Vite プロジェクト作成
npm create vite@latest
🤖 AI コンポーネント生成
AI Studio + Cursor
🔑 環境変数設定
.env + Gemini API
📦 本番ビルド
npm run build
1

Phase 1: Vite プロジェクト作成

⏱ 約5時間(1日目)
1-1

STEP 1-1: ターミナルで Vite プロジェクトを作成する

Vite + React + TypeScript のプロジェクトをゼロから作成します。npm create vite@latest コマンド1つでプロジェクトの骨格が生成されます。

Windows PowerShell
PS C:\Users\user\Documents> npm create vite@latest my-vite-app
✔ Project name: … my-vite-app
✔ Select a framework: › React
✔ Select a variant: › TypeScript
Scaffolding project in C:\Users\user\Documents\my-vite-app...
Done. Now run:
cd my-vite-app
npm install
npm run dev

▲ Viteプロジェクト作成の対話式セットアップ

【Windows版】手順

  1. Cursor を起動してターミナルを開く(Ctrl + `
  2. 作業フォルダに移動する(例: ドキュメントフォルダ)
ターミナル Windows PowerShell
PS> cd /c/Users/[ユーザー名]/Documents
PS> npm create vite@latest my-vite-app

対話式の設定で以下を選択します(↑↓キーで移動、Enterで決定):

  • Select a framework: React
  • Select a variant: TypeScript

【Mac版】手順

操作は Windows と同一です。Cursor のターミナルまたはターミナルアプリで同じコマンドを実行します。

npm create vite@latest とは
Vite という高速ビルドツールのプロジェクトを作成するコマンドです。「React + TypeScript」を選ぶと、最初から型チェックが効く構成が自動生成されます。
⚠️ エラーが出た場合

「npm: command not found」/ 「npm は内部コマンドとして認識されていません」
→ Node.js が正しくインストールされていません。node -v を実行してNode.jsのバージョンが表示されるか確認してください。表示されない場合は講座00のPhase 2に戻り、Node.jsを再インストールしてください。nvm use --lts を実行してから再試行してください。

「EACCES permission denied」(Mac)
→ npmのインストール先の権限問題です。以下を実行してから再試行してください:sudo chown -R $(whoami) ~/.npm

1-2

STEP 1-2: プロジェクト構成の確認

作成されたプロジェクトのフォルダ構成を確認しましょう。最初に触るのは src/App.tsxsrc/App.css だけです。

Cursor — my-vite-app
EXPLORER
📁 public
📁 src
📁 assets
📄 App.tsx
📄 App.css
📄 main.tsx
📄 index.css
📄 index.html
📄 package.json
📄 tsconfig.json
📄 vite.config.ts
📄 App.tsx ●
1import React from 'react'
2import './App.css'
3
4function App() {
5 return (
6 <div className="App">
7 Hello Vite + React!
8 </div>
9 )
10}

▲ Viteプロジェクトのフォルダ構成(Cursorのエクスプローラービュー)

フォルダ構成 my-vite-app/
my-vite-app/
├── public/             ← 画像・フォントなど静的ファイル
├── src/                ← ここがメインの作業場所
│   ├── assets/         ← 画像などのリソース
│   ├── App.tsx         ← メインコンポーネント(最初に修正する場所)
│   ├── App.css         ← App コンポーネントのスタイル
│   ├── main.tsx        ← アプリのエントリーポイント(基本触らない)
│   └── index.css       ← グローバルなスタイル
├── index.html          ← ベースのHTMLファイル(基本触らない)
├── package.json        ← 依存パッケージの一覧
├── tsconfig.json       ← TypeScript の設定
└── vite.config.ts      ← Vite の設定
最初は2ファイルだけ触れば大丈夫
src/App.tsx: メインのUIを書く場所(毎回触る)
src/App.css: App のスタイル(よく触る)
他のファイルは「存在する」ことを知っておけば十分です。
⚠️ エラーが出た場合

フォルダ構成が違う・一部ファイルが見当たらない
→ Cursorのエクスプローラービューで隠しファイルが表示されていない可能性があります。ファイルツリーで「.」から始まるファイル(.gitignore, .env など)を表示する設定を確認してください。

1-3

STEP 1-3: npm install → npm run dev で開発サーバー起動確認

依存パッケージをインストールして、開発サーバーを起動します。

Windows PowerShell
PS C:\Users\user\Documents> cd my-vite-app
PS C:\Users\user\Documents\my-vite-app> npm install
added 342 packages in 18s
PS C:\Users\user\Documents\my-vite-app> npm run dev
VITE v5.x.x ready in 432 ms
➜ Local: http://localhost:5173/
➜ Network: use --host to expose

▲ npm install と npm run dev でローカル開発サーバーを起動

ターミナル Windows / Mac 共通
# プロジェクトフォルダに移動
cd my-vite-app

# 依存パッケージをインストール(node_modules が作成される)
npm install

# 開発サーバーを起動
npm run dev

ブラウザで http://localhost:5173 を開き、Vite + React のデモページが表示されれば成功です。

便利なショートカット
サーバー停止: Ctrl + C(Windows / Mac 共通)
ブラウザ更新(通常): Ctrl + R(Mac: Cmd + R
ブラウザ更新(キャッシュ無視): Ctrl + Shift + R(Mac: Cmd + Shift + R
Viteのホットリロードについて
Vite の開発サーバーは「ホットリロード」機能付きです。コードを保存するたびに自動でブラウザが更新されます。Ctrl+S で保存するだけで変更が反映されます。
⚠️ エラーが出た場合

localhost:5173 にアクセスしても何も表示されない
→ ターミナルでエラーメッセージが出ていないか確認してください。ブラウザのアドレスバーに http://localhost:5173 と直接入力してください(https ではなく http)。ポート番号が異なる場合(例: 5174)は、ターミナルの出力に表示されているURLを使用してください。

npm install で「WARN deprecated」が大量に表示される
WARN deprecated は警告であり、エラーではありません。赤字で ERROR と表示されていなければ問題ありません。

1-4

STEP 1-4: 既存ファイルをAIに理解させる(CLAUDE.md 作成)

AIエディタに「このプロジェクトは何か」を事前に伝えておくと、より的確な提案をしてくれます。プロジェクトのルートフォルダに CLAUDE.md(Cursor用)を作成します。

Markdown CLAUDE.md
# プロジェクト概要

Vite + React + TypeScript で作成したWebアプリです。

## 技術スタック

- Vite(ビルドツール)
- React(UIライブラリ)
- TypeScript(型安全な JavaScript)

## ディレクトリ構成

- src/App.tsx: メインコンポーネント
- src/components/: 個別コンポーネント
- src/services/: API 通信ロジック
- src/styles/: スタイルファイル

## 開発サーバー

npm run dev で http://localhost:5173 で起動

## ビルド

npm run build で dist/ に出力

## ルール

- TypeScript の型エラーを残さない
- コンポーネントは src/components/ フォルダに作成する
- API 通信は src/services/ フォルダに切り出す
- .env ファイルの内容を直接コードに書かない
⚠️ エラーが出た場合

CLAUDE.md を作成しても Cursor が参照してくれない
→ Cursor のチャットで @CLAUDE.md と入力するとファイルを明示的に参照させることができます。また、プロジェクトルートに置いた CLAUDE.md は Cursor の新しいバージョンでは自動読み込みされます。

✅ Phase 1 修了条件チェックリスト
npm create vite@latest で React + TypeScript プロジェクトを作成できた
npm run dev で開発サーバーが起動してブラウザで確認できた
☐ プロジェクト構成(src/ の各ファイルの役割)を説明できる
2

Phase 2: AI エディタで React コンポーネント開発

⏱ 約10時間(2〜3日目)
2-1

STEP 2-1: Google AI Studio で初期コードを生成する

大まかなコンポーネントの骨格を Google AI Studio で生成し、Cursor で細かく修正する流れが効率的です。

🔒 https://aistudio.google.com
モデル
🤖 Gemini 2.0 Flash ▼
System instruction
React + TypeScriptのエキスパートとして、型定義を含む完全なTSXコードを生成してください。
あなた
React + TypeScriptでチャットUIコンポーネントを作って。ユーザーメッセージは右、AIは左。型定義も含めて。
AI
ChatUI.tsx の完全なコードを生成しました。interface Message でメッセージ型を定義し、useState でメッセージリストを管理しています...
プロンプトを入力...

▲ Google AI Studio で React コンポーネントを生成

プロンプト例 React コンポーネント生成
React + TypeScript で以下の仕様のコンポーネントを作ってください。

【仕様】
- コンポーネント名: ChatUI
- 機能: テキストを入力して送信ボタンを押すとメッセージ一覧に追加される
- ユーザーのメッセージは右側に、AIの返答は左側に表示する(AIの返答は今はモック文字列でOK)
- TypeScript の型定義を含める(interface Message など)
- スタイルはインラインスタイルまたは CSS モジュールを使う

【出力形式】
- ChatUI.tsx のコード全体
- App.tsx に組み込む方法
- 必要な場合は ChatUI.css のコードも

生成されたコードをコピーして、Cursor で src/components/ChatUI.tsx として保存します。

⚠️ エラーが出た場合

生成されたコードにTypeScriptエラーが含まれている
→ エラーメッセージをコピーして「このTypeScriptエラーを修正してください:[エラーメッセージ]」と追加で依頼してください。

コンポーネントが .tsx ではなく .jsx で生成された
→ 「TypeScript(.tsx)形式で再生成してください。型定義も含めてください。」と追加で依頼してください。

2-2

STEP 2-2: Cursor Agent で @ファイル指定修正

Cursor のチャット(Ctrl+L / Cmd+L)を開き、Agent モードで修正を依頼します。@ファイル名 でファイルを参照させると精度が上がります。

Cursor — my-vite-app
EXPLORER
📁 src
📁 components
📄 ChatUI.tsx
📄 App.tsx
📄 ChatUI.tsx ●
1import React, { useState } from 'react'
2
3interface Message {
4 role: 'user' | 'ai';
5 text: string;
6}
🤖 Cursor AI (Agent)
@src/components/ChatUI.tsx のデザインを修正してください。入力欄を画面下部に固定して、メッセージバブルに角丸を追加してください。
ChatUI.tsx を修正しました。入力欄を position:fixed で下部に配置し、border-radius: 12px を追加しました。
💬 @ファイル名 を指定して修正依頼...

▲ Cursor の Agent モードで @ファイル指定修正

Cursor Agent 指示例 デザイン修正
@src/components/ChatUI.tsx のデザインを修正してください。

- チャット入力欄を画面下部に固定する
- メッセージバブルに角丸(border-radius: 12px)を追加する
- ユーザーのメッセージ背景色を #1565c0、文字色を白にする
- AIのメッセージ背景色を #f5f5f5、文字色を #333 にする
Cursor Agent 指示例 機能追加
@src/components/ChatUI.tsx に以下の機能を追加してください。

- Enter キーでメッセージ送信できるようにする(Shift+Enter は改行)
- 送信後に入力欄を空にする
- メッセージが追加されたら自動で一番下にスクロールする
@ファイル指定のポイント
@ファイル名 を入力すると、AI がそのファイルの中身を参照して修正案を考えてくれます。「何を変えたいか」を具体的に箇条書きで書くと精度が上がります。
⚠️ エラーが出た場合

Accept後にTypeScriptエラーが残る
→ Cursor のターミナルで npx tsc --noEmit を実行してエラーの詳細を確認してください。エラーメッセージをコピーして「以下のTypeScriptエラーが発生しています。修正してください。[エラーメッセージ]」とチャットに貼り付けてください。

2-3

STEP 2-3: Antigravity の Agent Manager で複数ファイル同時修正

複数のコンポーネントファイルを一括して整理したい場合は Antigravity が便利です。

Antigravity 指示例 複数ファイル対応
以下の修正を行ってください。

[App.tsx] ChatUI コンポーネントをインポートして表示するよう修正する
[ChatUI.tsx] Props の型定義を外部ファイルに切り出す
[types.ts] Message と ChatProps の型定義ファイルを src/ 直下に新規作成する
Antigravity は指示した複数ファイルを同時に修正してくれます。
大規模なリファクタリング(型定義の切り出し、コンポーネント分割など)には Antigravity の複数ファイル対応機能が効果的です。
⚠️ エラーが出た場合

複数ファイルを修正したら import パスが壊れた
→ 「修正後にimportパスが全て正しいか確認して、壊れている部分があれば修正してください」と追加で依頼してください。

2-4

STEP 2-4: スクショ修正の実践(React 構造を維持する注意点)

React のコンポーネント修正でスクショを使う場合、「React の構造は変えないで」という一言を付けると、AI が機能を壊さずにデザインだけ修正してくれます。

スクショ指示の手順:

  1. 【Windows】 ブラウザで開発サーバーのページを開く(http://localhost:5173
  2. Win + Shift + S でスクショを撮る
  3. Cursor のチャット欄に Ctrl+V で貼り付ける
  4. 以下のように指示する

スクショ指示の手順(Mac):

  1. 【Mac】 ブラウザで開発サーバーのページを開く(http://localhost:5173
  2. Cmd + Shift + 4 でスクショを撮る
  3. Cursor のチャット欄に Cmd+V で貼り付ける
  4. 以下のように指示する
スクショ修正プロンプト React構造を維持
このスクショを見てください。@src/components/ChatUI.tsx を修正して、
スクショの通りにデザインを修正してください。

修正内容:
- 入力欄が切れているので全幅に修正
- 送信ボタンがテキストと重なっているので右端に配置

※ React のコンポーネント構造(useState の使い方など)は変えないでください。
⚠️ エラーが出た場合

スクショを貼り付けたが認識されない
→ Cursor のチャットパネルを開いた状態で Ctrl+V(Mac: Cmd+V)を押してください。スクショが表示されない場合は、ファイルとして保存してからドラッグ&ドロップで添付してください。

✅ Phase 2 修了条件チェックリスト
☐ Cursor Agent で React コンポーネントを修正できた
☐ @ファイル指定でデザイン修正・機能追加ができた
☐ スクショを使ってデザイン修正の指示が出せた
3

Phase 3: 環境変数・APIキーの設定

⏱ 約5時間(4日目)
3-1

STEP 3-1: .env ファイル作成と VITE_ プレフィックスの意味

Vite では、ブラウザで読み込まれる環境変数には必ず VITE_ プレフィックスが必要です。プロジェクトのルートフォルダ(package.json と同じ階層)に .env を作成します。

Cursor — my-vite-app
EXPLORER
📁 src
📄 package.json
📄 .env
📄 .gitignore
📄 .env ●
1# Gemini API キー(Google AI Studio から取得)
2VITE_GEMINI_API_KEY=AIzaSy...
3
4# VITE_ プレフィックスが必須(ブラウザから見える変数)

▲ .env ファイルの作成と VITE_ プレフィックスの設定

環境変数ファイル .env(プロジェクトルートに作成)
VITE_GEMINI_API_KEY=AIzaSy...(ここに取得したAPIキーを貼り付ける)
重要: = の前後にスペースを入れないでください
KEY = value はNG。KEY=value が正しい書き方です。
なぜ VITE_ プレフィックスが必要か
VITE_API_KEY=...: ブラウザから見える(フロントエンドで使うキー)
API_KEY=...: ブラウザから見えない(Viteでは使えない)
VITE_ で始まる変数のみがビルド時にブラウザに埋め込まれます。
TypeScript 環境変数へのアクセス方法
const apiKey = import.meta.env.VITE_GEMINI_API_KEY;
⚠️ エラーが出た場合

.env を追加したのに変数が undefined になる
→ .env ファイルがプロジェクトルート(package.json と同じ階層)にあるか確認してください。変数名が VITE_ で始まっているか確認してください(大文字・小文字を区別します)。.env を変更したら開発サーバーを再起動する必要があります(Ctrl+Cnpm run dev)。

3-2

STEP 3-2: .gitignore の確認(.env が含まれているか)

Vite プロジェクトには最初から .gitignore が含まれています。.env が含まれているか確認しましょう。

セキュリティ上の重要注意
.env.gitignore に入っていない状態で git push すると、API キーが公開されます。必ず確認してください。

Cursor のエディタで .gitignore を開き、以下の行があるか確認してください。ない場合は末尾に追記します。

設定ファイル .gitignore(末尾に追記)
# 依存パッケージ(npm install で再生成できる)
node_modules/

# 環境変数(APIキーなど)
.env
.env.local
.env.*.local
.env.production

# ビルド成果物(git で管理する必要なし)
dist/

# エディタの設定ファイル(任意)
.vscode/
node_modules/ の注意
node_modules/ は数万ファイルになることがあります。.gitignore に入れておかないと GitHub へのアップロードに何時間もかかります。必ず確認してください。
⚠️ エラーが出た場合

すでに .env を git に追加してしまった
git rm --cached .env を実行してgitの追跡から除外し、その後 .gitignore.env を追記してください。GitHubにすでにpushしてしまった場合は、APIキーを無効化して新しいキーを取得してください。

3-3

STEP 3-3: Gemini API を React アプリに組み込む

API 通信をコンポーネントから切り出し、src/services/geminiService.ts として管理します。これがベストプラクティスです。

TypeScript src/services/geminiService.ts
// src/services/geminiService.ts

const API_KEY = import.meta.env.VITE_GEMINI_API_KEY;
const API_URL = `https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?key=${API_KEY}`;

export interface GeminiResponse {
  text: string;
  error?: string;
}

export async function sendMessage(userMessage: string): Promise<GeminiResponse> {
  try {
    const response = await fetch(API_URL, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        contents: [{ parts: [{ text: userMessage }] }],
      }),
    });

    if (!response.ok) {
      throw new Error(`API Error: ${response.status}`);
    }

    const data = await response.json();
    const text = data.candidates?.[0]?.content?.parts?.[0]?.text ?? '返答を取得できませんでした';

    return { text };
  } catch (error) {
    const errorMessage = error instanceof Error ? error.message : '不明なエラー';
    return { text: '', error: errorMessage };
  }
}
TypeScript src/components/ChatUI.tsx(サービス呼び出し部分)
// ChatUI.tsx に追加する import
import { sendMessage } from '../services/geminiService';

// メッセージ送信時の処理例
const handleSend = async () => {
  if (!inputText.trim()) return;

  const userMessage = { role: 'user' as const, text: inputText };
  setMessages(prev => [...prev, userMessage]);
  setInputText('');
  setIsLoading(true);

  // Gemini API 呼び出し
  const response = await sendMessage(inputText);

  if (response.error) {
    setMessages(prev => [...prev, { role: 'ai', text: `エラー: ${response.error}` }]);
  } else {
    setMessages(prev => [...prev, { role: 'ai', text: response.text }]);
  }

  setIsLoading(false);
};
サービスファイルに API 通信を切り出す理由
コンポーネント(見た目)とロジック(通信)を分けることで、修正がしやすくなります。将来APIを変更する場合も geminiService.ts だけを修正すれば済みます。
⚠️ エラーが出た場合

CORS エラーが発生する
→ APIキーが .env に正しく設定されているか確認してください。APIキーが有効かGoogle AI Studioのコンソールで確認してください。URLの ?key= の後ろにAPIキーが含まれているか確認してください。

import.meta.env.VITE_GEMINI_API_KEY が undefined になる
→ 開発サーバーを再起動してください(Ctrl+Cnpm run dev)。環境変数の変更はサーバー再起動が必要です。

✅ Phase 3 修了条件チェックリスト
.env ファイルを作成して VITE_ プレフィックス付きの変数を設定できた
.gitignore.env が含まれていることを確認した
src/services/geminiService.ts を作成してAPI通信を切り出せた
4

Phase 4: 本番ビルドと公開準備

⏱ 約5時間(5日目)
4-1

STEP 4-1: npm run build → dist フォルダ確認

開発が完了したら、本番用の最適化ファイルを生成します。

Windows PowerShell
PS C:\...\my-vite-app> npm run build
vite v5.x.x building for production...
✓ 42 modules transformed.
dist/index.html 0.48 kB │ gzip: 0.31 kB
dist/assets/index-Cjxxxx.css 12.34 kB │ gzip: 3.21 kB
dist/assets/index-Bkxxxx.js 145.21 kB │ gzip: 47.89 kB
✓ built in 2.34s

▲ npm run build で本番用ファイルを dist フォルダに生成

ターミナル Windows / Mac 共通
# 開発サーバーを停止してから実行
npm run build

完了すると dist フォルダが生成されます。

フォルダ構成 ビルド後の dist/
my-vite-app/
├── dist/                 ← ここが生成された本番ファイル
│   ├── assets/
│   │   ├── index-xxxx.js    ← 圧縮・最適化された JavaScript
│   │   └── index-xxxx.css   ← 圧縮された CSS
│   └── index.html
├── src/                  ← ソースコード(開発用)
└── ...
開発版と本番版の違い
開発版(dev): ファイルサイズ大・詳細エラーメッセージ・開発中に使用
本番版(build): 圧縮済みで高速・最小限エラーメッセージ・公開サーバーへのアップロードに使用
⚠️ エラーが出た場合

TypeScript エラーでビルドが失敗する
→ ビルド時は TypeScript のエラーが厳密にチェックされます。エラーメッセージ全体をコピーして Cursor のチャットに貼り付けます:「npm run build で以下のTypeScriptエラーが発生しています。修正してください。[エラーメッセージ]」

4-2

STEP 4-2: npm run preview で本番ビルドの動作確認

本番ビルドをローカルでテストできます。開発サーバー(5173ポート)ではなく、本番に近い環境(4173ポート)で動作確認します。

ターミナル Windows / Mac 共通
npm run preview
Windows PowerShell
PS C:\...\my-vite-app> npm run preview
➜ Local: http://localhost:4173/
➜ Network: use --host to expose

▲ npm run preview で本番ビルドを 4173 ポートで確認

ブラウザで http://localhost:4173 を開いて、開発サーバー(5173)と同じように動作するか確認します。

確認すべき点
☐ ページが正常に表示されるか
☐ ボタン・フォームが機能するか
☐ API 通信が動作するか
☐ コンソールにエラーが出ていないか(F12 → Console タブ)
⚠️ エラーが出た場合

preview では動くが本番URLにデプロイしたら動かない
→ 環境変数(APIキー)がVercelの設定にも登録されているか確認してください。Vercelのプロジェクト設定 → Environment Variables で VITE_GEMINI_API_KEY を追加してください。

4-3

STEP 4-3: GitHub push の準備(講座05へ)

本番ビルドが確認できたら、コードを GitHub に push します。詳細は講座05で扱いますが、事前に .gitignore の確認だけ行います。

push 前の最終確認チェックリスト
.env.gitignore に含まれているか
node_modules/.gitignore に含まれているか
dist/.gitignore に含まれているか
☐ APIキーがソースコード内に直接書かれていないか(import.meta.env.VITE_... 経由のみ)
⚠️ エラーが出た場合

git push が遅い / node_modules がアップロードされている
.gitignorenode_modules/ が含まれているか確認してください。すでにgitの追跡対象になっている場合は git rm -r --cached node_modules を実行してから再度 push してください。

実践

実践課題: チャットUI または 天気・ニュース表示アプリを作る

以下のいずれかを選んで、開発サーバー(localhost:5173)で動作するアプリを作成してください。

プロンプト例 選択肢A: Gemini AI チャット UI
React + TypeScript でシンプルなAIチャットUIを作ってください。

【仕様】
- ユーザーがテキストを入力してEnterキーまたはボタンで送信できる
- ユーザーのメッセージは右側の青いバブルで表示
- AIのメッセージは左側のグレーのバブルで表示
- 送信中はローディングインジケーター(「考え中...」テキスト)を表示
- レスポンシブデザイン(スマホでも見やすい)

【ファイル構成】
- src/App.tsx: レイアウト
- src/components/ChatUI.tsx: チャットのUIコンポーネント
- src/services/geminiService.ts: Gemini API 通信(上記のサービスファイルを使用)
- src/App.css: スタイル

TypeScript の型定義も含めてください。
プロンプト例 選択肢B: 天気・ニュース表示アプリ
React + TypeScript でニュース・情報表示アプリを作ってください。

【仕様】
- 検索欄に「東京の天気」「今日のAIニュース」などを入力して送信
- Gemini API に送信して、返ってきたテキストをカード形式で表示
- カードは画像なし・テキストのみでシンプルに
- 検索履歴を5件まで保持して、クリックで再検索できる
- レスポンシブデザイン

【ファイル構成】
- src/App.tsx: メインレイアウト
- src/components/SearchBar.tsx: 検索フォーム
- src/components/ResultCard.tsx: 結果表示カード
- src/components/SearchHistory.tsx: 検索履歴
- src/services/geminiService.ts: Gemini API 通信
課題の完了条件
☐ 選んだアプリが npm run dev で起動する
☐ 基本的な機能(送信/検索)が動作する
☐ TypeScript のエラーが0件(npx tsc --noEmit でエラーなし)
.env に API キーが設定されていてアプリが API と通信できる
npm run build でビルドエラーなく完了する
⚠️ エラーが出た場合

npx tsc --noEmit でたくさんエラーが出る
→ エラーメッセージをすべてコピーして Cursor のチャットに貼り付け「以下の TypeScript エラーをすべて修正してください」と依頼してください。

Gemini API のレスポンスが遅い
setIsLoading(true) でローディング状態を管理し、「考え中...」などのインジケーターを表示することでUX を改善できます。

✅ Phase 4 修了条件チェックリスト
npm run builddist フォルダが生成できた
npm run preview で本番ビルドの動作確認ができた
☐ 実践課題(チャットUI または 天気・ニュース表示アプリ)を開発サーバーで動かせた

🎓 講座04応用 全体修了条件チェックリスト

← 前の講座:04 Google AI Studio アプリ開発 次の講座:05 GitHubバージョン管理 →