← 返回题目列表

前端发布如何做灰度、回滚和版本追踪?

中等 第 21 / 31 题 更新于 2026/07/29
前端工程化发布灰度回滚

简化版

前端发布要把静态资源版本化、HTML 入口可切换、监控可观测、灰度可控、回滚可快速执行。核心原则是资源不可变、入口可回退、版本可追踪;不能只把 dist 上传 CDN 就算发布完成。

详细版

成熟发布流程包含:

  • 构建产物带 hash,静态资源长期缓存。
  • HTML 入口短缓存,方便切换版本。
  • 发布记录包含 commit、构建号、环境、时间。
  • 灰度按用户、地区、比例或业务开关控制。
  • 监控错误率、白屏率、接口失败、性能指标。
  • 回滚能恢复上一版 HTML 和资源引用。

注意点:

  • 旧 HTML 可能引用旧资源,旧资源不能立刻删除。
  • 发布后要观察关键指标。
  • 回滚不等于数据回滚,接口协议要兼容。
  • 灰度规则要稳定,避免用户来回跳版本。

完整版教学

一、前端发布的核心是入口和资源分离

现代前端构建会生成带 hash 的 JS/CSS,例如 app.a1b2.js。这些资源可以长期缓存,因为内容变了文件名也变。HTML 入口负责引用当前版本资源,应该短缓存或可快速刷新。回滚时通常切换 HTML 指向上一版资源。

index.html  短缓存,可切换
  ├─ app.a1b2.js  不可变长期缓存
  └─ style.c3d4.css 不可变长期缓存

如果 HTML 和静态资源都强缓存很久,发布后用户可能长时间拿不到新版;如果 hash 资源被覆盖,用户缓存和 CDN 会非常混乱。

二、版本追踪要贯穿构建和运行

每次发布都应该知道对应哪个 git commit、构建号、发布时间、环境和发布人。前端运行时也可以把版本号注入到全局变量或错误上报里。否则线上报错时,你不知道用户到底运行哪一版代码。

数字例子:一天发布 8 次,如果错误日志没有版本字段,只看到 “Cannot read property x”,排查会非常痛苦;有版本字段后,可以立刻定位是第 6 次发布引入的。

window.__APP_VERSION__ = {
  commit: 'abc1234',
  build: '20260729.8'
}

三、灰度发布要有稳定分流

灰度不是随机让用户一会儿进新版本、一会儿进旧版本。应按用户 ID、设备 ID、租户、地区或固定比例做稳定分流。这样同一个用户体验一致,问题也更容易复现。

灰度方式适合风险
按比例通用灰度需稳定 hash
按用户内测用户样本有限
按租户B 端客户配置复杂
按地区地域业务统计偏差

灰度期间要观察错误率、白屏率、关键转化和性能指标,而不是只看“页面能打开”。

四、回滚要快,但也要考虑协议兼容

前端回滚通常比后端快:切回上一版 HTML 或路由配置即可。但如果这次发布同时依赖了后端新接口,前端回滚后旧代码是否还能调用后端?如果数据库结构或接口语义已经变了,单纯回滚前端可能没用。

因此前后端协作要遵守兼容发布:后端先兼容新旧字段,前端再发布,确认稳定后再清理旧逻辑。这个顺序能让前端回滚真正可用。

五、旧资源要保留一段时间

用户可能已经拿到旧 HTML,它引用旧 hash 资源。如果发布时把旧资源从 CDN 删除,用户刷新后 HTML 仍指向旧文件,就会 404 白屏。资源清理要有保留窗口,例如保留最近 7 到 30 天版本。

数字例子:如果日活 100000,哪怕只有 0.5% 用户命中旧 HTML,也有 500 人可能受影响。保留旧资源成本通常远低于白屏事故成本。

六、发布后验证要自动化

发布后应自动跑 smoke test:访问首页、登录页、核心路由,检查资源 200、主接口可用、控制台无明显错误。再结合监控看白屏、JS error、接口错误和性能。手动点两下不够稳定。

发布心法:资源不可变,入口可切换,版本可追踪,协议可兼容,回滚才真的有效。

七、常见误区与追问

  • 误区:前端发布就是上传 dist。 还要处理缓存、版本、灰度、监控和回滚。
  • 误区:回滚只要重新发旧包。 若接口协议不兼容或旧资源被删,回滚可能失败。
  • 误区:hash 资源可以覆盖。 hash 文件应不可变,内容变就生成新文件名。
  • 追问:HTML 为什么不能长缓存? HTML 是版本入口,长缓存会让用户长期引用旧资源。
  • 追问:灰度如何保证用户稳定? 用用户 ID 或设备 ID 做 hash 分桶,避免随机抖动。
  • 追问:发布后看哪些指标? JS 错误、白屏率、接口失败、核心转化和性能指标。

八、加强记忆

前端发布用“三可一不可”记:入口可切换,灰度可控制,版本可追踪,静态资源不可变。再加一个关键条件:接口协议向前兼容。做到这些,发布、观察、回滚才是一套闭环,而不是一次上传动作。