Vite×AIエディタでモダンWebアプリを本格的に開発できるようになる
| 比較項目 | 講座04(Path A) | 講座04応用(Path B) |
|---|---|---|
| Node.js | 不要 | 必須 |
| ファイル構成 | 単一 HTML ファイル | 複数コンポーネント (.tsx) |
| 型安全 | なし | TypeScript で型チェックあり |
| ビルド | 不要(ファイルをそのまま使用) | npm run build で最適化 |
| デプロイ連携 | 手動アップロード | GitHub 連携で自動デプロイ |
Phase 1: Vite プロジェクト作成
STEP 1-1: ターミナルで Vite プロジェクトを作成する
Vite + React + TypeScript のプロジェクトをゼロから作成します。npm create vite@latest コマンド1つでプロジェクトの骨格が生成されます。
▲ Viteプロジェクト作成の対話式セットアップ
【Windows版】手順
- Cursor を起動してターミナルを開く(
Ctrl + `) - 作業フォルダに移動する(例: ドキュメントフォルダ)
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 のターミナルまたはターミナルアプリで同じコマンドを実行します。
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
STEP 1-2: プロジェクト構成の確認
作成されたプロジェクトのフォルダ構成を確認しましょう。最初に触るのは src/App.tsx と src/App.css だけです。
▲ Viteプロジェクトのフォルダ構成(Cursorのエクスプローラービュー)
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 の設定
src/App.tsx: メインのUIを書く場所(毎回触る)src/App.css: App のスタイル(よく触る)他のファイルは「存在する」ことを知っておけば十分です。
⚠️ エラーが出た場合
フォルダ構成が違う・一部ファイルが見当たらない
→ Cursorのエクスプローラービューで隠しファイルが表示されていない可能性があります。ファイルツリーで「.」から始まるファイル(.gitignore, .env など)を表示する設定を確認してください。
STEP 1-3: npm install → npm run dev で開発サーバー起動確認
依存パッケージをインストールして、開発サーバーを起動します。
▲ npm install と npm run dev でローカル開発サーバーを起動
# プロジェクトフォルダに移動 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 の開発サーバーは「ホットリロード」機能付きです。コードを保存するたびに自動でブラウザが更新されます。
Ctrl+S で保存するだけで変更が反映されます。
⚠️ エラーが出た場合
localhost:5173 にアクセスしても何も表示されない
→ ターミナルでエラーメッセージが出ていないか確認してください。ブラウザのアドレスバーに http://localhost:5173 と直接入力してください(https ではなく http)。ポート番号が異なる場合(例: 5174)は、ターミナルの出力に表示されているURLを使用してください。
npm install で「WARN deprecated」が大量に表示される
→ WARN deprecated は警告であり、エラーではありません。赤字で ERROR と表示されていなければ問題ありません。
STEP 1-4: 既存ファイルをAIに理解させる(CLAUDE.md 作成)
AIエディタに「このプロジェクトは何か」を事前に伝えておくと、より的確な提案をしてくれます。プロジェクトのルートフォルダに CLAUDE.md(Cursor用)を作成します。
# プロジェクト概要 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 の新しいバージョンでは自動読み込みされます。
☐
npm create vite@latest で React + TypeScript プロジェクトを作成できた☐
npm run dev で開発サーバーが起動してブラウザで確認できた☐ プロジェクト構成(src/ の各ファイルの役割)を説明できる
Phase 2: AI エディタで React コンポーネント開発
STEP 2-1: Google AI Studio で初期コードを生成する
大まかなコンポーネントの骨格を Google AI Studio で生成し、Cursor で細かく修正する流れが効率的です。
▲ Google AI Studio で 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)形式で再生成してください。型定義も含めてください。」と追加で依頼してください。
STEP 2-2: Cursor Agent で @ファイル指定修正
Cursor のチャット(Ctrl+L / Cmd+L)を開き、Agent モードで修正を依頼します。@ファイル名 でファイルを参照させると精度が上がります。
▲ Cursor の Agent モードで @ファイル指定修正
@src/components/ChatUI.tsx のデザインを修正してください。 - チャット入力欄を画面下部に固定する - メッセージバブルに角丸(border-radius: 12px)を追加する - ユーザーのメッセージ背景色を #1565c0、文字色を白にする - AIのメッセージ背景色を #f5f5f5、文字色を #333 にする
@src/components/ChatUI.tsx に以下の機能を追加してください。 - Enter キーでメッセージ送信できるようにする(Shift+Enter は改行) - 送信後に入力欄を空にする - メッセージが追加されたら自動で一番下にスクロールする
@ファイル名 を入力すると、AI がそのファイルの中身を参照して修正案を考えてくれます。「何を変えたいか」を具体的に箇条書きで書くと精度が上がります。
⚠️ エラーが出た場合
Accept後にTypeScriptエラーが残る
→ Cursor のターミナルで npx tsc --noEmit を実行してエラーの詳細を確認してください。エラーメッセージをコピーして「以下のTypeScriptエラーが発生しています。修正してください。[エラーメッセージ]」とチャットに貼り付けてください。
STEP 2-3: Antigravity の Agent Manager で複数ファイル同時修正
複数のコンポーネントファイルを一括して整理したい場合は Antigravity が便利です。
以下の修正を行ってください。 [App.tsx] ChatUI コンポーネントをインポートして表示するよう修正する [ChatUI.tsx] Props の型定義を外部ファイルに切り出す [types.ts] Message と ChatProps の型定義ファイルを src/ 直下に新規作成する
大規模なリファクタリング(型定義の切り出し、コンポーネント分割など)には Antigravity の複数ファイル対応機能が効果的です。
⚠️ エラーが出た場合
複数ファイルを修正したら import パスが壊れた
→ 「修正後にimportパスが全て正しいか確認して、壊れている部分があれば修正してください」と追加で依頼してください。
STEP 2-4: スクショ修正の実践(React 構造を維持する注意点)
React のコンポーネント修正でスクショを使う場合、「React の構造は変えないで」という一言を付けると、AI が機能を壊さずにデザインだけ修正してくれます。
スクショ指示の手順:
- 【Windows】 ブラウザで開発サーバーのページを開く(
http://localhost:5173) Win + Shift + Sでスクショを撮る- Cursor のチャット欄に
Ctrl+Vで貼り付ける - 以下のように指示する
スクショ指示の手順(Mac):
- 【Mac】 ブラウザで開発サーバーのページを開く(
http://localhost:5173) Cmd + Shift + 4でスクショを撮る- Cursor のチャット欄に
Cmd+Vで貼り付ける - 以下のように指示する
このスクショを見てください。@src/components/ChatUI.tsx を修正して、 スクショの通りにデザインを修正してください。 修正内容: - 入力欄が切れているので全幅に修正 - 送信ボタンがテキストと重なっているので右端に配置 ※ React のコンポーネント構造(useState の使い方など)は変えないでください。
⚠️ エラーが出た場合
スクショを貼り付けたが認識されない
→ Cursor のチャットパネルを開いた状態で Ctrl+V(Mac: Cmd+V)を押してください。スクショが表示されない場合は、ファイルとして保存してからドラッグ&ドロップで添付してください。
☐ Cursor Agent で React コンポーネントを修正できた
☐ @ファイル指定でデザイン修正・機能追加ができた
☐ スクショを使ってデザイン修正の指示が出せた
Phase 3: 環境変数・APIキーの設定
STEP 3-1: .env ファイル作成と VITE_ プレフィックスの意味
Vite では、ブラウザで読み込まれる環境変数には必ず VITE_ プレフィックスが必要です。プロジェクトのルートフォルダ(package.json と同じ階層)に .env を作成します。
▲ .env ファイルの作成と VITE_ プレフィックスの設定
VITE_GEMINI_API_KEY=AIzaSy...(ここに取得したAPIキーを貼り付ける)
KEY = value はNG。KEY=value が正しい書き方です。
VITE_API_KEY=...: ブラウザから見える(フロントエンドで使うキー)API_KEY=...: ブラウザから見えない(Viteでは使えない)VITE_ で始まる変数のみがビルド時にブラウザに埋め込まれます。
const apiKey = import.meta.env.VITE_GEMINI_API_KEY;
⚠️ エラーが出た場合
.env を追加したのに変数が undefined になる
→ .env ファイルがプロジェクトルート(package.json と同じ階層)にあるか確認してください。変数名が VITE_ で始まっているか確認してください(大文字・小文字を区別します)。.env を変更したら開発サーバーを再起動する必要があります(Ctrl+C → npm run dev)。
STEP 3-2: .gitignore の確認(.env が含まれているか)
Vite プロジェクトには最初から .gitignore が含まれています。.env が含まれているか確認しましょう。
.env が .gitignore に入っていない状態で git push すると、API キーが公開されます。必ず確認してください。
Cursor のエディタで .gitignore を開き、以下の行があるか確認してください。ない場合は末尾に追記します。
# 依存パッケージ(npm install で再生成できる) node_modules/ # 環境変数(APIキーなど) .env .env.local .env.*.local .env.production # ビルド成果物(git で管理する必要なし) dist/ # エディタの設定ファイル(任意) .vscode/
node_modules/ は数万ファイルになることがあります。.gitignore に入れておかないと GitHub へのアップロードに何時間もかかります。必ず確認してください。
⚠️ エラーが出た場合
すでに .env を git に追加してしまった
→ git rm --cached .env を実行してgitの追跡から除外し、その後 .gitignore に .env を追記してください。GitHubにすでにpushしてしまった場合は、APIキーを無効化して新しいキーを取得してください。
STEP 3-3: Gemini API を React アプリに組み込む
API 通信をコンポーネントから切り出し、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 }; } }
// 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を変更する場合も
geminiService.ts だけを修正すれば済みます。
⚠️ エラーが出た場合
CORS エラーが発生する
→ APIキーが .env に正しく設定されているか確認してください。APIキーが有効かGoogle AI Studioのコンソールで確認してください。URLの ?key= の後ろにAPIキーが含まれているか確認してください。
import.meta.env.VITE_GEMINI_API_KEY が undefined になる
→ 開発サーバーを再起動してください(Ctrl+C → npm run dev)。環境変数の変更はサーバー再起動が必要です。
☐
.env ファイルを作成して VITE_ プレフィックス付きの変数を設定できた☐
.gitignore に .env が含まれていることを確認した☐
src/services/geminiService.ts を作成してAPI通信を切り出せた
Phase 4: 本番ビルドと公開準備
STEP 4-1: npm run build → dist フォルダ確認
開発が完了したら、本番用の最適化ファイルを生成します。
▲ npm run build で本番用ファイルを dist フォルダに生成
# 開発サーバーを停止してから実行
npm run build
完了すると 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エラーが発生しています。修正してください。[エラーメッセージ]」
STEP 4-2: npm run preview で本番ビルドの動作確認
本番ビルドをローカルでテストできます。開発サーバー(5173ポート)ではなく、本番に近い環境(4173ポート)で動作確認します。
npm run preview
▲ npm run preview で本番ビルドを 4173 ポートで確認
ブラウザで http://localhost:4173 を開いて、開発サーバー(5173)と同じように動作するか確認します。
☐ ページが正常に表示されるか
☐ ボタン・フォームが機能するか
☐ API 通信が動作するか
☐ コンソールにエラーが出ていないか(
F12 → Console タブ)
⚠️ エラーが出た場合
preview では動くが本番URLにデプロイしたら動かない
→ 環境変数(APIキー)がVercelの設定にも登録されているか確認してください。Vercelのプロジェクト設定 → Environment Variables で VITE_GEMINI_API_KEY を追加してください。
STEP 4-3: GitHub push の準備(講座05へ)
本番ビルドが確認できたら、コードを GitHub に push します。詳細は講座05で扱いますが、事前に .gitignore の確認だけ行います。
☐
.env が .gitignore に含まれているか☐
node_modules/ が .gitignore に含まれているか☐
dist/ が .gitignore に含まれているか☐ APIキーがソースコード内に直接書かれていないか(
import.meta.env.VITE_... 経由のみ)
⚠️ エラーが出た場合
git push が遅い / node_modules がアップロードされている
→ .gitignore に node_modules/ が含まれているか確認してください。すでにgitの追跡対象になっている場合は git rm -r --cached node_modules を実行してから再度 push してください。
実践課題: チャットUI または 天気・ニュース表示アプリを作る
以下のいずれかを選んで、開発サーバー(localhost:5173)で動作するアプリを作成してください。
React + TypeScript でシンプルなAIチャットUIを作ってください。 【仕様】 - ユーザーがテキストを入力してEnterキーまたはボタンで送信できる - ユーザーのメッセージは右側の青いバブルで表示 - AIのメッセージは左側のグレーのバブルで表示 - 送信中はローディングインジケーター(「考え中...」テキスト)を表示 - レスポンシブデザイン(スマホでも見やすい) 【ファイル構成】 - src/App.tsx: レイアウト - src/components/ChatUI.tsx: チャットのUIコンポーネント - src/services/geminiService.ts: Gemini API 通信(上記のサービスファイルを使用) - src/App.css: スタイル TypeScript の型定義も含めてください。
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 を改善できます。
☐
npm run build で dist フォルダが生成できた☐
npm run preview で本番ビルドの動作確認ができた☐ 実践課題(チャットUI または 天気・ニュース表示アプリ)を開発サーバーで動かせた