工程化的成果不只是多了几个配置文件,而是任何人接手一个修改,都能回答三个问题:它是否正确,线上运行的是哪份产物,出了问题如何恢复。本文讨论适合普通前端项目逐步建立的交付链路,不预设必须使用某个 CI 平台。
可复现从安装开始
锁定运行时与包管理器版本,提交锁文件,CI 用冻结锁文件模式安装依赖。否则同一份源码在不同日期解析到不同依赖,排查时就失去了共同基线。
本地配置、测试配置和生产配置需要分清。会注入浏览器包的环境变量只能包含公开信息;变量名看起来像配置,不代表它不会被打进 JavaScript。
不同检查回答不同问题
| 检查 | 主要发现什么 | 不能证明什么 |
|---|---|---|
| 类型检查 | 类型契约不一致 | 网络响应真实符合类型 |
| Lint | 易错模式和约定偏差 | 业务流程正确 |
| 单元与集成测试 | 指定行为和边界回归 | 所有浏览器布局正确 |
| 生产构建 | 模块与预渲染集成问题 | 已经成功部署 |
| 产物与线上检查 | 路由、资源和真实链路 | 未覆盖的业务都正确 |
测试应围绕可观察结果。例如“不同用户不能读取彼此记录”比“源码存在 ownerId 判断”更能保护业务。纯文案修改通常无需新增镜像实现的测试,但文章路由、链接和订阅输出仍需检查。
构建产物应有明确身份
给产物关联提交 ID、构建时间和配置环境,在日志或发布记录中能够找到。尽量把已经验证的同一份产物发布到目标环境,避免发布阶段重新安装依赖后产生另一份结果。
源码与锁文件
→ 安装依赖
→ 类型、规则与行为检查
→ 生产构建
→ 预览验证
→ 发布版本目录
→ 切换流量并检查
静态站点重点检查导出的 HTML、脚本和公开资源;独立 API 需要另外检查进程、路由与数据行为。首页返回 200 不能证明某个 API 已部署,也不能证明不存在的路径正确返回 404。
回退不能只考虑前端文件
静态资源可以采用版本目录并保留上一版。若同时修改了 API 或数据格式,则需要兼容窗口和迁移策略:旧前端在缓存中仍可能继续运行,新后端不能立刻删掉它依赖的字段。
有数据迁移时,恢复旧程序未必能恢复旧行为。先确认变更是否可逆、备份是否可用,再确定回退步骤。不要把“重新部署上一个提交”当成所有故障的通用解法。
让故障能被定位
错误记录至少能关联页面、版本、请求和发生阶段,同时避免记录令牌、完整表单或私人内容。性能优化先建立基线:首屏资源、长任务、接口耗时各自测量,再决定是拆包、缓存还是减少重复请求。
一个轻量团队可以先完成锁文件安装、关键行为测试、构建预览和版本回退,再加入影响分析与缓存。自动化越多,越需要清楚每一步通过到底证明了什么。
继续阅读:Monorepo、Renderer 信任边界。