← Field Notes
OVERVIEW · 2026.05.17

Webアプリの地図
— AIで開発する前に持っておきたい全体像

ファイル構造 / 言語の役割 / 5層構造 / 3段階の発展 / スタック選び
起算日 2026.05.17更新日 2026.05.17
この記事について:AIがコードを書いてくれる時代になっても、「どこで何が動いているか」の地図がないとAIへの指示が曖昧になり、トラブル時に何が起きているかわからなくなる。コードは書けなくていい。でも構造は知っておく必要がある。

01Webアプリを構成するもの

Webアプリの正体は「フォルダの中のテキストファイルの集合」。難しそうに見えて、中身は読めるテキストが並んでいるだけ。

典型的なフォルダ構造

ファイル / フォルダ役割
src/ソースコード本体
public/ブラウザに直接配信するファイル
package.json使用ライブラリの一覧(部品リスト)
node_modules/ダウンロード済みのライブラリ本体
.envAPIキーなど秘密の設定値
CLAUDE.mdClaude Codeへの指示ファイル
CHANGELOG.mdバージョン変更の記録

拡張子の役割

拡張子役割
.html画面の骨格(構造)
.css見た目・デザイン
.js動き・ロジック
.json設定・データ構造
.mdMarkdown文書(ドキュメント・メモ)
.env環境変数(APIキー等、Gitに上げない)
コードが書けなくても分かること

ファイル名と拡張子を見れば「これはデザインのファイル」「これは設定ファイル」と判別できる。Claude Codeが「style.css を編集しました」と言ったとき、それがデザインの変更だと分かる。

↑ 目次へ戻る

02言語の役割分担

「プログラミング言語」と一口に言っても、動く場所が違う。ブラウザ側・サーバー側・データベースで使う言語は別物。

言語の動く場所
ブラウザ側(フロントエンド)
HTML / CSS / JS
画面の表示・デザイン・ユーザー操作への反応
サーバー側(バックエンド)
Node.js / Python 等
データの受け取り・保存・認証・計算処理
データベース
SQL
データの検索・保存・更新・削除の命令
データ保存が不要なら

HTMLとCSSとJSだけで動くアプリはフロントエンドだけで完結する。サーバーもデータベースも不要。今回の訪問記録APPのVer1(IndexedDB)はこの形に近かった。

Web通信の基本

ブラウザが「このURLのページをくれ」とリクエストを送り、サーバーが「はい、これ」とレスポンスを返す。このやり取りがHTTPという共通ルールで動いていて、アプリを使っている間ずっと繰り返される。

↑ 目次へ戻る

03サービスは5層構造で見る

世の中のWebサービスは、この5つの層に分けて考えると整理しやすい。新しいサービスが出てきても、瞬時にどの層のものか判別できるようになる。

5層構造
開発アシスタント
コードを書く相棒 — Claude Code、Cursor、Copilot
ソースコード管理
コードの保管・履歴管理 — GitHub(一強)、GitLab
バックエンド / DB
データの保存場所 — Supabase、Firebase、Neon
ホスティング
アプリの実行・配信 — Cloudflare Pages、Vercel、Netlify
MCPサーバー
Claudeに「目と手」を付ける — Supabase MCP、GitHub MCP 等

同じ層は競合、違う層は補完

同じ層 = どれか1〜2個に絞る

Cloudflare ⟷ Vercel ⟷ Netlify は全部④の層。役割が同じなので1個選べばいい。

Supabase ⟷ Firebase ⟷ Neon は全部③の層。同じく1個でいい。

違う層 = 全部いる

GitHub(②)+ Supabase(③)+ Cloudflare(④)は役割が違うので全部必要。「集約」の発想は無意味。

↑ 目次へ戻る

04Webアプリの3つの発展段階

アプリは最初から完成形で作らない。3つの段階を順番に登っていくのが現実的な進め方。

3段階の発展
STAGE 01
ローカル動作
自分のPCの中だけで動く。他の人はアクセスできない。最速で試行錯誤できる段階。
STAGE 02
サーバーデプロイ
URLが発行されて世界からアクセス可能になる。セキュリティと品質の要求が一気に上がる。
STAGE 03
データ永続化
ユーザーの入力をサーバーに保存。複数人・複数端末でのデータ共有が実現する。

Stage 01 — ローカル動作

自分のPCの中だけで動く状態。「試行錯誤の最高の遊び場」。失敗してもすぐやり直せる。ここで動きと感触を確かめてから次に進む。

ブラウザのローカルDBであるIndexedDBを使えば、サーバーなしでもデータを一時保存できる。ただしその端末のそのブラウザにしか存在しないデータになる。

Stage 02 — サーバーデプロイ

「世界から見える状態にする」のがこの段階の課題。Cloudflare PagesやVercelを使えば、GitHubにコードをプッシュするだけで数秒でURLが発行される。

デプロイ後に変わること

ローカルでは「自分が使う」前提だったが、公開後は不特定多数がアクセスしてくる。想定外の使い方・不正な入力・同時アクセス・セキュリティリスクが全部出てくる。ローカルで通用した「雑さ」は通用しなくなる。

注意 .env ファイルやAPIキーをGitHubに上げてしまうのが初心者の定番ミス。.gitignore に必ず追加する。

Stage 03 — データ永続化

「ユーザーが入力したデータを次回も見せたい」「複数人で共有したい」となったらデータベースが必要になる。Supabaseはデータベース+認証機能をセットで提供してくれるため、個人〜小規模チームにちょうどいい。

データ設計は後から変えにくい

稼働中サービスのデータ構造を変えるのは「走るバスのタイヤ交換」に近い。最初にどんなデータを持つか・ユーザーごとのアクセス権限はどうするか・将来の機能拡張を考慮して設計する必要がある。

↑ 目次へ戻る

05ツール選びの実際

ホスティング(④層)の比較

サービス無料デプロイ帯域向く用途
Cloudflare Pages500回/月(毎月リセット)無制限小〜中規模。Workers/D1との連携◎
Vercel十分な無料枠100GB/月Next.jsとの相性が最高
Netlify枠が狭くなってきた100GB/月以前は定番。今は消極的選択肢
現状のおすすめ

迷ったらCloudflare Pagesをデフォルトにする。Next.jsを本格的に使うならVercel。顧客がすでに別サービスを使っているならそれに乗る。Netlifyを新規で選ぶ理由は今は薄い。

バックエンド / DB(③層)の比較

サービス特徴向く用途
SupabasePostgreSQL + 認証 + ストレージ + Edge Functions をセット提供個人〜小規模チーム。認証が必要なアプリ全般
FirebaseGoogleが運営。リアルタイムDB・NoSQLチャット等リアルタイム性が高いアプリ
NeonPostgreSQLのサーバーレス版。軽量DBだけ欲しいシンプルなケース
Cloudflare D1CloudflareのSQLiteベースDB。Workers連携が容易Cloudflare完結スタックを作りたい場合

Claude Code時代の新しい変数

ツール選びの変化

従来:「複数プラットフォームを学ぶのは大変だから集約しよう」

今:プラットフォーム知識はCLAUDE.mdとドキュメントの中に書けばいい。頭で全部覚える必要はない。「集約しなければ」という圧力は半減している。適材適所で選べる。

↑ 目次へ戻る

06実際のスタック例

抽象的な話より、実際に動いているアプリのスタックを見た方が分かりやすい。

4つの役割分担

役割分担の全体像
Claude Code
「作る」
コードを書く。ファイルを編集する。CLIコマンドを実行する。
GitHub
「管理する」
変更履歴を残す。バックアップ。Cloudflare/Vercelへの自動デプロイのトリガー。
Cloudflare
「公開する」
HTMLをURLで世界に配信する。CDNで高速化。
Supabase
「覚える」
ユーザーデータを保存。認証。行レベルのアクセス制御。

訪問記録APPの開発過程

訪問看護の時間記録アプリを実際に作った際の発展過程:

バージョン段階スタック
Ver 1.xローカル動作HTML / CSS / JS + IndexedDB(ブラウザ内DB)
Ver 2.1ネットワーク版Supabase(PostgreSQL + Auth)+ Netlify
Ver 2.3Git導入GitHub連携 → 自動デプロイ
Ver 2.4〜Cloudflare移行Cloudflare Pages + Resend(メール通知)
教訓 最初から完璧なスタックを選ぼうとしなくていい。ローカルで動かしてから、必要になったタイミングでひとつずつ追加していく。そのたびに理解が深まる。

開発のデータフロー

フェーズ流れ
開発時 コードを修正 → git push → GitHubへ保存 → Cloudflareが自動検知 → デプロイ完了(数秒)
利用時 スマホ・PCでURLを開く → CloudflareがHTML/JSを配信 → ブラウザで動作 → 操作のたびSupabaseと通信 → データ保存・取得
コードとデータは独立している

コード(GitHub + Cloudflare)とデータ(Supabase)は別の場所にある。コードをいくら変えてもデータは消えないし、データが増えてもコードは変わらない。これがクラウドネイティブな設計の基本。

↑ 目次へ戻る

07AIへの指示精度を上げるために

地図を持つことの実際の価値はここにある。構造が分かると、AIへの指示が変わる。

指示の精度の違い

曖昧な指示精度の高い指示
「ログイン機能を追加して」 「Supabaseのメール認証を使って、profilesテーブルと連携するログイン機能を追加して」
「データを保存して」 「Supabaseのvisitsテーブルに、user_id・日付・滞在時間を保存して。RLSは本人のみ読み書き可能にして」
「デプロイして」 「GitHubにプッシュして。Cloudflare Pagesが自動でデプロイするか確認して」
地図を持つ人が強い理由

AIはコードが書ける。でも「何を作るか」「どの層に実装するか」「どのサービスを使うか」はこちらが決める必要がある。地図がある人は正確にナビゲートできる。地図がない人はAIが独断で決めた結果を受け取るだけになる。

CLAUDE.mdに書いておくと自動化できること

毎回口頭で説明しなくていいように、プロジェクトのCLAUDE.mdに方針を書いておく:

書いておく内容効果
使用するスタック(Supabase / Cloudflare)毎回「どのサービスを使いますか?」と聞かれなくなる
バージョン管理の方針(CHANGELOG.mdに記録する等)自動でCHANGELOGを更新してくれる
コーディングスタイルの好み一貫したスタイルで書いてくれる
↑ 目次へ戻る