用 AI 给 Firebase 部署做飞行前检查

上线前 10 分钟用 AI 审一遍 firebase.json:rewrite 顺序、function region、缓存头、预览频道测试。

最痛的 Firebase 部署是那种”安静地成功”。CLI 打出一个绿色 URL,但某条 rewrite 排错了顺序、某个 Cloud Function 悄悄漂回了 us-central1、或者某个 HTML 文件现在被 CDN 缓存了一年、而那个 CDN 你还清不掉缓存。这类 bug 上线时是绿的,几个小时后才浮出水面。AI 能在你推送前抓住它们,因为 firebase.json 体积小、是声明式的,失效模式也都有清晰文档。下面这份清单,用 Claude Opus 4.7 或 GPT-5.5 跑一遍大约 10 分钟。

一句话总结

  • 把完整的 firebase.jsonfunctions/ 入口文件一起粘给 Claude 或 ChatGPT,跑下面那条结构化审计 prompt。上下文含糊,审计结果就含糊。
  • 五个高杠杆检查点:rewrite 顺序(具体路径在 ** 之前)、function region 一致性、public 目录是否正确、缓存头(带指纹的资源用长缓存 + immutable,HTML 用短缓存)、rewrite 与 function 名是否对得上。
  • 先用 firebase hosting:channel:deploy 部到预览频道,冒烟测被标记的路由,再推生产。预览频道免费,默认 7 天后过期。
  • 修复要”能直接粘的 diff”,不要散文。AI 一旦说”你可以考虑……”,它就是在猜。

为什么该审的是 firebase.json

几乎每一次 Hosting 退化都能追到 firebase.json 里五个块之一:rewritesredirectsheaderspublic,以及 function 绑定。这份配置是声明式的,通常就几百行,恰好是 LLM 能稳定推理的体量。firebase deploy --dry-run 只校验 JSON 语法和 function 名能否解析;而 AI 读这份文件能抓出语义错误:规则顺序错、缓存指令贴错路径、region 悄悄回落到了默认值。

适合每周部署 Firebase Hosting 不止一次的人,尤其是用 firebase.json rewrite 把流量路由到 Cloud Functions 或 Cloud Run 的 Astro / Next.js 团队。没有 staging 环境的独立开发者收益最大——AI 审计就是你的 staging 步骤。

真正要紧的五个检查

1. rewrite 顺序

Firebase Hosting 会应用第一条模式匹中请求的 rewrite,然后停下(Hosting 配置文档)。所以一条 catch-all ** 放在某条具体路由之上,就会把那条路由永久吞掉:

"rewrites": [
  { "source": "/api/**", "function": "api" },
  { "source": "**", "destination": "/index.html" }
]

如果这两条顺序反了,每个 /api/* 请求都会落到 index.html,你的 function 永远到不了。另外,只有当路径没有匹中静态文件时 Hosting 才应用 rewrite,所以 public/ 里一个多余文件就可能把整条规则盖掉。让 AI 确认顺序是从最具体到最宽泛、自上而下排列的。

2. function region 一致性

一个没有显式指定 region 的 2 代 Cloud Function 会回落到 us-central1。Firebase 官方文档建议显式设定 region,而不要依赖可能变动的默认值(Cloud Functions 区域)。当你一半 function 钉在 asia-northeast1、一个新 function 又悄悄落到 us-central1,rewrite 链在两者之间来回跳,每次调用就多一趟跨区往返。表现像”function 变慢了”,其实是地理问题。在代码里钉住 region:

const { setGlobalOptions } = require("firebase-functions/v2");
setGlobalOptions({ region: "asia-northeast1" });

注意:截至 2026 年 6 月,setGlobalOptions 不一定对 Firestore 触发的 function 生效,它们仍可能初始化在 us-central1。这类触发器要单独显式指定 region。

3. public 目录

如果你的 build 输出落在 dist/(Astro、Vite),而 firebase.jsonpublic 设成了 out/(Next.js export)或 build/,CLI 会照样上传错的文件夹。部署成功,线上却是你上一份 build。这是”我的改动怎么没生效”最常见的根因。让 AI 把 public 和你 build 工具的真实输出路径对照检查。

4. 缓存头

Firebase Hosting 会一字不差地照搬你的 Cache-Control 头,而且没有全局清缓存按钮。一个错的头只能靠重新部署正确的头、再等所有 CDN 边缘的 TTL 过期来修(缓存管理文档)。截至 2026 年 6 月的经验法则:

资源类型建议的 Cache-Control原因
带指纹的 JS/CSS/字体(app.9f3a1.jspublic, max-age=31536000, immutable内容变 URL 就变,缓存一年也安全
带内容哈希的图片public, max-age=31536000, immutable同样的指纹逻辑
HTML / index.htmlpublic, max-age=300, s-maxage=600no-cache外壳要在几分钟内更新,不是一年
service-worker.jsmanifest.jsonno-cache必须每次重新校验

经典事故:一条本想给资源用的通配 max-age=31536000 规则同时匹中了 index.html,把导航外壳冻结了一年。让 AI 列出每条 header 规则各自匹中哪些路径,并标出任何被长缓存规则误伤的 HTML。

5. rewrite 与 function 的绑定

functions/index.js 导出的是 ogImage,rewrite 却指向 og-image。部署通过语法校验,路由却静默 404。这就是为什么要把 function 入口文件和 firebase.json 一起粘:没有它,AI 无法核实绑定的名字是否真实存在。

具体步骤

  1. firebase.jsonfunctions/ 入口文件一起粘给 AI,附一句项目描述,比如”Astro 静态站 + 两个 Cloud Function:OG 图生成和联系表单,部署在 asia-northeast1”。
  2. 跑结构化审计 prompt:
审计这份 firebase.json 的部署期风险,检查:
- rewrite 顺序(具体路径在 catch-all ** 之前)
- function region 一致性(除非有意,所有 function 同 region)
- public 目录是否匹配我的 build 输出(说明你的 build 工具)
- Headers:带指纹的资源用长缓存 + immutable,HTML 用短缓存 / no-cache
- Redirects:有没有死循环、有没有跟 rewrite 冲突
- rewrite 与 function 绑定:每个 function 名是否对应真实 export

每个发现按这个格式返回:blocker / warning / nit,具体行号,
以及能直接粘的修复 diff。不要散文式修复。
  1. 每个发现只接受能直接粘的代码块,绝不要”你可以考虑……”。
  2. 应用 diff,在修过的文件上再跑一次审计,应当返回 zero blocker。如果冒出新问题,AI 可能在幻觉,推回去:“这为什么是个问题?引用 Firebase 文档哪一节。”
  3. 部到预览频道,不是生产:
firebase hosting:channel:deploy preflight --expires 2d

这会返回一个临时公开 URL,频道会自动过期(默认 7 天;--expires 支持 1h2d 这类值)。专门冒烟测审计标记出来的那几条路由。 6. 用 firebase deploy --only hosting 推生产。盯日志 5 分钟,看审计标记过 region 漂移的 function 有没有冷启动延迟。

怎么把它变成可复用流程

  • 把审计 prompt 存成模板,把项目名、build 工具、region 写死。每个 repo 一份。
  • 每个项目维护一份简短的”以前抓到过”清单。模式会重复,而模型不跨会话记忆。
  • 没改代码也季度跑一次。Firebase 会废弃旧选项,配置会过期。
  • 团队场景:把审计发现贴进 PR 描述,让 reviewer 直接看到改了什么、为什么,再把预览频道 URL 给他们。

整个闭环——配置 + 最近改动总结 + region 声明,审计,diff,应用,预览部署,冒烟,推生产——10 到 15 分钟。而一次坏部署加回滚要一小时,还是当着用户的面发生。

容易踩的坑

  • “小 deploy”不跑审计。小 deploy 才是 rewrite 拼写错溜过去的时机。
  • 只贴 firebase.json、不带 function 入口文件,AI 没法验证绑定。
  • 问”这样行不行”而不是走结构化清单。开放问题得到的是模糊回答。
  • 接受散文式修复而不要 diff。
  • 不走预览频道直接推生产。
  • 一直放着 nit 不修,直到它们累积成下个月的事故。

FAQ

  • AI 知道我的 Firebase 项目设置吗? 不知道,只知道你贴的。region、project ID、最近改动都要明说。
  • 能审 Firestore rules 吗? 能。把 firestore.rules 单独贴,套同样的结构化输出格式。
  • App Check 或账单配置呢? 这些不在 firebase.json 里。要审就把相关控制台页面的截图也带上。
  • firebase deploy --dry-run 有什么区别? dry-run 校验 JSON 语法和 function 名能否解析;AI 抓的是语义错:顺序错、region 错、缓存目标错。
  • 该用哪个模型? 两个旗舰都行。截至 2026 年 6 月,Claude Opus 4.7 和 GPT-5.5 都能轻松处理几百行配置;两者在顶级套餐上都支持 1M token 上下文,所以一棵较大的 functions/ 目录树一次就能粘进去。
  • 能自动化吗? 可以。把 prompt 接进 pre-deploy 脚本,把 firebase.jsongit diff pipe 给模型,遇到任何 blocker 就 exit 非 0。

相关阅读

标签: #AI 编程 #教程