第19章:安全に壊して練習する(Emulator + サーバー側投入)🧪🧯
この章は「本番DBを一切汚さずに、思いっきりCRUDして壊して直す」回です💪✨ さらに、サーバー側(Admin SDK)から seedデータをドバッと投入して、開発スピードを上げます🚀
📖 読む:Emulatorって何が嬉しいの?😆

- Firestore Emulator はローカルPCで動く “擬似Firestore” です🧪 → 追加/更新/削除をミスっても、本番に傷がつかない!🛡️
- Emulator Suite UI(ブラウザ画面)で、 どのリクエストが飛んで、Rulesがどう評価されたか まで見えるのが強いです👀✨ (Firebase)
- Firestore Emulatorは デフォルトで 8080番、UIは 4000番 など、決まったポートで起動します🔌 (Firebase)

⚠️ 重要:Emulatorは便利だけど、本番と完全一致ではありません。 例えば 複合インデックスを追跡せず、通るクエリは実行してしまう ので、インデックス要件は最後に本番でも確認が必要です📌 (Firebase)
🛠️ 手を動かす:Emulatorを動かす(Windows)🪟⚙️
1) 必要なものをサクッと確認✅
Emulator Suiteは基本的にこれが必要です👇
- Node.js 16+
- Java JDK 11+
- Firebase CLI 8.14.0+(firebase-tools) (Firebase)
さらに、Firestore Emulatorは 近い将来 Java 21 が必要になる予定のアナウンスも出ています☕️📈(早めに21へ上げるのが安心) (Firebase)
PowerShellでチェックするならこんな感じ👇
node -v
java -version
firebase --version
2) Emulator設定(firebase init emulators)🧰
プロジェクト直下で👇
firebase init
firebase init emulators
ここで Firestore Emulator と Emulator Suite UI を選ぶ感じです👍
設定は firebase.json に書かれます(ポートもここで変更できます)🔧 (Firebase)
⚠️ Rulesや設定をちゃんと指定しないと、Firestore/RTDB/Storage系エミュレータは open(ガバ開放) で動くことがあります😱 「ローカルだから大丈夫」ではあるけど、習慣としてRulesをセットしようね🛡️ (Firebase)
3) 起動してUIを開く🚀
まずはFirestoreだけでOK👇
firebase emulators:start --only firestore
UIはブラウザで http://localhost:4000(開けたら勝ち🎉) (Firebase)
Firestoreは localhost:8080 で待ってます🧪 (Firebase)
🛠️ 手を動かす:ReactアプリをEmulatorにつなぐ⚛️🔌

ポイントは1つだけ!
Firestoreに触る前に
connectFirestoreEmulator()を呼ぶこと! (後から切り替えようとするとエラーになりがち😵)
例:src/lib/firebase.ts(構成は好きでOK)
import { initializeApp } from "firebase/app";
import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";
const firebaseConfig = {
// いつものやつ
};
export const app = initializeApp(firebaseConfig);
export const db = getFirestore(app);
// 開発時だけエミュレータへ
if (import.meta.env.DEV) {
connectFirestoreEmulator(db, "127.0.0.1", 8080);
}
🧠 ちょい注意:エミュレータは停止するとDBが空になります。 SDKのオフラインキャッシュとズレるのが嫌なら、永続化は切っておくのが安全(Web SDKはデフォルトで永続化OFF)です🧯 (Firebase)
👀 ついでに:Emulator UIの “Requests” が神✨

UIで Firestore > Requests を開くと👇
- どんな read/write が来たか
- Rulesがどの順番で評価されたか が見えます🔍✨ (Firebase)
さらに、Rulesのカバレッジ(どの条件分岐が踏まれたか)レポートも出せます📊
ruleCoverage.html がブラウザで見れるよ〜🧠 (Firebase)
🧯 DBをリセットしたい(超便利)💥

本番Firestoreは「全部消す」みたいなSDK機能が無いけど、エミュレータには DELETEで全消し が用意されています🧨 (Firebase)
PowerShell(curlは標準で入ってることが多い):
curl -v -X DELETE "http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"
※ firestore-emulator-example は自分の projectId に置き換えてね📝 (Firebase)
💾 データを保存してチーム共有したい(import/export)📦
毎回まっさらは辛いので、ベースデータを保存できるのが最高です😆
- エクスポート:
firebase emulators:export ./dir - 起動時インポート:
firebase emulators:start --import=./dir - 終了時に自動エクスポート:
--export-on-exit(Firebase)
例:
firebase emulators:start --only firestore --import=./.emulator-data --export-on-exit
🛠️ ついでに:サーバー側(Admin SDK)で seed 10件流し込む🌱🔥

ここからが「開発が一気に速くなる」やつ!🚀
Admin SDKは FIRESTORE_EMULATOR_HOST を設定すると自動でエミュレータに接続します✨
しかも http:// を付けないのがルールです⚠️ (Firebase)
✅ Node(おすすめ:一番ラク)🟩
1) 依存追加
npm i firebase-admin
2) scripts/seed.mjs を作る
import { initializeApp } from "firebase-admin/app";
import { getFirestore, FieldValue } from "firebase-admin/firestore";
// 重要:Emulator接続は環境変数で行う(http://は付けない)
const projectId = process.env.GCLOUD_PROJECT ?? "demo-firestore";
initializeApp({ projectId });
const db = getFirestore();
const now = FieldValue.serverTimestamp();
const todos = Array.from({ length: 10 }).map((_, i) => ({
title: `seed todo #${i + 1}`,
done: false,
tags: ["seed", i % 2 === 0 ? "easy" : "hard"],
createdAt: now,
updatedAt: now,
}));
async function main() {
const batch = db.batch();
todos.forEach((t) => {
const ref = db.collection("todos").doc();
batch.set(ref, t);
});
await batch.commit();
console.log("✅ Seeded 10 todos into emulator!");
}
main().catch((e) => {
console.error("❌ Seed failed:", e);
process.exit(1);
});
3) PowerShellで実行
$env:FIRESTORE_EMULATOR_HOST="127.0.0.1:8080"
$env:GCLOUD_PROJECT="demo-firestore"
node scripts/seed.mjs
FIRESTORE_EMULATOR_HOSTの形式は127.0.0.1:8080みたいに プロトコル無しね! (Firebase)
🟦 Python / 🟪 .NET でやりたい人へ(バージョン目安)📌
どちらも「基本は同じで、FIRESTORE_EMULATOR_HOST を設定してから実行」でOKです👍 (Firebase)
(この章はまずNodeで成功体験を作るのがいちばん速いです🧠✨)
🤖 AIで“seed作り”と“デバッグ”を爆速にする💨

1) Firebase AI Logicで seed案を作る🧠✨
「ToDoタイトル10件を自然な日本語で」「タグも提案して」みたいなデータ作りをAIに投げると超ラクです📝 Firebase AI LogicはアプリからGemini APIを安全に呼ぶための仕組みとして案内されています🤖🔐 (Google Cloud)
例プロンプト(コピペ用)👇
- 「ToDoタイトルを10件、日本語で。短め。タグ候補も2つずつ。JSON配列で。」
できたJSONをそのまま todos に貼り付ければseed完成🌱✨
2) Gemini CLI / Antigravityで“調査→修正”を短縮🔧🤝
- Gemini CLIはターミナルから調査・修正を回すためのツールとして案内があり、コード支援の入口として使えます🧑💻✨ (Google Cloud Documentation)
- Antigravityはエージェント的に「計画→実装」を進める導線が用意されてるので、Emulator周りのセットアップ手順の整理にも相性いいです🛰️🧭
🧩 ミニ課題:安全に壊して、復活させよう🎮🧪
- Emulatorを起動(Firestoreのみ)
- Reactアプリをエミュレータ接続に切り替え
todosを10件、画面に表示(リアルタイム購読でもOK)⚡- seedスクリプトで 10件投入 → UIに即反映されるのを確認👀
- 全消しDELETEを叩いて、一覧がゼロに戻るのを確認💥 (Firebase)
- import/exportも1回だけ試す📦 (Firebase)
✅ チェック:ここまで来たら勝ち🏆
- 「本番を汚さずにCRUDを試す」手順を説明できる🛡️
- UIのRequestsで「何が飛んでるか」追える👀 (Firebase)
- seed投入→確認→全消し→復元(import)まで回せる🌱➡️🧹➡️📦 (Firebase)
次の章(第20章)で、ここまでの全部を合体させて ミニアプリ完成🎯+AIで“実用っぽさ”を足していきます🤖✨