Vite 前端发布后白屏怎么处理:JS 404、CDN 旧缓存和回滚路径
前端发布上线后,不少用户刷新页面直接看到空白屏幕,控制台里弹出 GET /assets/index-8f3d2a.js 404 类报错,很多人第一反应会误判成后端接口异常。但对 Vite、React、Vue 这类文件名带哈希后缀产物的项目来说,最常见的诱因都是 index.html、JS/CSS 产物版本和 CDN 缓存不同步:用户手里的是旧版 HTML,浏览器拿着旧 HTML 里的旧资源地址发起请求,对应的旧 chunk 早就在线上被清掉了,自然加载不到有效代码,页面直接白屏。
- 发布后白屏先打开浏览器控制台和 Network 面板排查,重点找
JS 404、ChunkLoadError、Failed to fetch dynamically imported module。 - 如果 HTML 引用的文件在对象存储或静态资源服务里不存在,优先按缓存版本不一致的方向排查。
- 紧急止血的优先顺序是回滚
index.html、清理 CDN 缓存、恢复已删除的旧产物,不要上来就改业务代码重发。 - 长期优化方案是保留最近几次的构建产物,HTML 配置短缓存,带哈希后缀的静态文件配置长缓存。
触发信号:白屏常常从 JS 404 开始
这类故障的第一现场一般在浏览器端,而不是后端的日志系统里。用户反馈页面打不开,客服收到的截图只能看到空白页面;值班同学打开开发者工具后,能在 Console 或 Network 面板里看到某个 JS 文件返回 404,或是动态导入的模块加载失败。

先把几个典型的故障信号对齐清楚:
| 信号 | 说明 | 优先动作 |
|---|---|---|
index-xxxx.js 404 |
HTML 引用了不存在的构建产物 | 检查发布产物是否被误清理 |
ChunkLoadError |
异步 chunk 加载失败 | 确认旧 chunk 文件是否还在服务端留存 |
| 只有部分用户白屏 | CDN、浏览器或灰度版本命中了不同缓存 | 对比响应头和 CDN 命中节点信息 |
| 强刷后页面恢复正常 | 本地缓存或 CDN 缓存被强制刷新 | 继续排查整体缓存策略配置 |
快速判断:先确认 HTML 和产物是不是同一版
不要一上来就重发新版本。先把线上正在生效的 HTML 内容拉下来,看它到底引用了哪些资源,再去静态资源存放位置确认对应文件是否真实存在。
curl -s https://example.com/ | grep -o 'assets/[^"]*\\.js' curl -I https://static.example.com/assets/index-8f3d2a.js
如果第一条命令能看到旧资源的文件名,第二条请求却返回 404,基本可以判定是 HTML、CDN 或构建产物清理策略出了问题。这里先别急着修改业务代码,因为组件逻辑根本没有机会运行,页面已经卡在资源加载阶段。
还要查看资源的响应头。Cache-Control、Age、ETag、CDN 命中标记都能说明用户拿到的是哪个缓存层的内容。如果 index.html 被设置成长时间缓存,白屏出现的概率会明显升高。
处理步骤:先恢复页面,再清缓存
紧急止血的目标很明确:让用户拿到一套互相匹配的 HTML 和静态资源。只要页面能重新渲染,接口、样式这类小问题可以后续慢慢处理。

推荐按这个顺序处理:
- 回滚
index.html到上一个可用版本,让它重新引用对应版本的旧产物。 - 确认旧 JS/CSS 文件仍在对象存储或静态资源服务里正常留存。
- 清理
index.html的 CDN 缓存,必要时清理入口页所在的公开路径。 - 用无缓存的隐私窗口访问首页,确认 Network 面板里的 JS/CSS 请求都是 200 状态。
- 如果旧产物已经被删除,先从构建制品库或发布记录恢复对应文件,再清理 CDN 缓存。
很多团队会把静态文件全部覆盖到同一个路径,再顺手清理旧文件。这个操作看起来节省存储空间,实际上风险很高。带哈希的文件名本来就是为了支持长期缓存,旧版本 HTML 在一段时间内仍可能被用户或 CDN 命中,旧 chunk 文件至少要保留几个发布批次的量。
回滚路径:HTML 和静态产物要分开看
前端发布的回滚不只是“把代码退回去”。真正影响用户访问的是入口 HTML 和静态产物。两者可以分开处理:HTML 应该配置短缓存、支持快速回滚;带哈希的 JS/CSS 可以配置长缓存,但不能发布完就立刻删除旧版本文件。
location = /index.html {
add_header Cache-Control "no-cache";
}
location /assets/ {
add_header Cache-Control "public, max-age=31536000, immutable";
}
如果入口页路径不止一个,比如 /、/admin/、/mobile/,回滚时要逐个确认覆盖。只回滚一个入口,另一个入口还引用失效的 chunk,用户仍然会反馈白屏。
告警确认:别等客服截图才知道白屏
前端白屏应该能被自动监控发现。最基础的做法是把资源加载失败、路由初始化失败、首屏渲染超时这类事件上报到监控平台。发布后 5 到 10 分钟内,如果 JS 404 或 ChunkLoadError 指标突然升高,就应该自动提醒值班人员处理。
- 监听
window.addEventListener('error', ...),捕获 script 和 link 标签的资源加载失败事件。 - 监听
unhandledrejection,记录动态导入模块加载失败的异常。 - 上报信息包含资源 URL、页面 URL、发布版本、用户浏览器信息和 CDN 命中信息。
- 发布后自动访问首页和关键路由,检查 JS/CSS 资源的响应状态码。
window.addEventListener('error', function (event) {
var target = event.target;
if (target && (target.tagName === 'SCRIPT' || target.tagName === 'LINK')) {
reportAssetError({
url: target.src || target.href,
page: location.href,
release: window.__APP_VERSION__ || 'unknown'
});
}
}, true);
这里的上报函数可以直接接入团队已有的前端监控服务,不需要单独搭建一套系统。关键是别只记录“白屏了”这个结果,要把资源 URL 和发布版本信息带上,否则排查时还得从用户截图里猜问题原因。
复盘项:把构建产物保留策略写进发布流程
故障恢复后,最该补全的是发布流程规则,而不是要求值班同学记住“下次操作小心点”。下面几项可以直接加入发布检查环节:
- 最近 5 到 10 次构建产物全部保留,不自动删除仍可能被引用的哈希后缀文件。
index.html设置短缓存或协商缓存,避免用户长期命中旧入口文件。- 发布顺序先上传新静态资源,再切换 HTML 版本,回滚时按反向顺序操作。
- CDN 刷新范围要明确,入口页和静态资源不要合并成一个刷新动作。
- 发布后自动探测首页、登录页、核心业务路由和所有异步 chunk 文件。
如果项目用了灰度发布机制,还要确认灰度环境和全量环境的静态资源前缀是否一致。灰度 HTML 引用全量资源,或者全量 HTML 引用灰度资源,都会产生一批很难复现的白屏问题。
常见问题
Vite 白屏一定是 CDN 缓存问题吗?
不一定。接口鉴权失败、运行时语法报错、环境变量缺失也会导致白屏。但如果控制台明确打印 JS 或 CSS 404 报错,就应该先按资源版本不一致的方向排查。
为什么强刷能恢复,普通刷新不行?
强刷会绕过一部分浏览器缓存,并重新向 CDN 发起资源请求。普通刷新可能仍然命中本地留存的旧 HTML 或旧 chunk,所以表现会不一致。
带 hash 的 JS 文件需要每次都清 CDN 吗?
通常不需要。带 hash 的文件内容变更后文件名也会同步变化,更适合配置长缓存。真正需要谨慎处理的是入口 HTML 和没有 hash 后缀的公共文件。
旧构建产物要保留多久?
可以按团队发布频率定。一天多次发布的项目,至少保留最近 5 到 10 个批次;低频发布项目可以保留更久,重点是覆盖 CDN 和浏览器缓存可能的最长存活时间。
小结
Vite 前端发布后白屏,先别急着重发代码。打开控制台看有没有 JS 404 报错,再确认 index.html 引用的资源是否还在线上正常留存,是最快的排查路径。足够稳定的发布流程,要做到入口 HTML 可快速回滚、CDN 缓存可控刷新、旧 hash 产物按批次留存、发布后有自动探测和资源错误告警。
PHP-FPM 子进程打满导致 502 怎么排查:从 Nginx 错误日志到 pm.max_children 调整
- 上一篇
- PHP-FPM 子进程打满导致 502 怎么排查:从 Nginx 错误日志到 pm.max_children 调整
- 下一篇
- Linux cgroup v2 怎么限制服务内存:MemoryMax 上手和回退检查
-
- 文章 · 前端 | 1天前 | 前端 · 性能优化 · css · Core Web Vitals · 渲染性能 · 前端 渲染性能 CSS性能 CLS content-visibility contain-intrinsic-size Layout
- 前端长页面渲染卡顿怎么排查:用 content-visibility 跳过离屏区块
- 430浏览 收藏
-
- 文章 · 前端 | 1星期前 | 前端 · javascript · AbortController · 表单提交 · AbortController 旧响应覆盖 前端重复提交 loading锁 fetch取消 按钮防抖
- 前端按钮重复提交怎么办:loading 锁和 AbortController 最小配方
- 442浏览 收藏
-
- 文章 · 前端 | 1星期前 | 前端 · 缓存 · Service Worker · 白屏 · 发布故障 · 缓存策略 前端白屏 Service Worker CacheStorage 资源404 发布回滚
- 前端发布后白屏复盘:Service Worker 缓存旧入口导致 JS 资源 404
- 469浏览 收藏
-
- 文章 · 前端 | 1星期前 | 前端开发 · localStorage · 表格配置 · 用户偏好 · 后台系统 · 用户偏好 localStorage 前端表格 列配置 可见列 列宽保存
- 前端表格列设置刷新后丢失怎么办:可见列、列宽和顺序这样保存
- 351浏览 收藏
-
- 文章 · 前端 | 1星期前 | 前端 · 接口排查 · 运维手册 · 性能告警 · 前端 AbortController 接口超时 Network瀑布图 降级回滚 线上告警
- 前端接口超时告警运行手册:从瀑布图到降级回滚
- 287浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 4394次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 4065次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 4047次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 4233次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 4203次使用
-
- Go语言对前端领域的入侵WebAssembly运行原理
- 2022-12-31 130浏览
-
- go+gin 静态资源路由与后端api路由冲突如何解决?
- 2023-02-24 414浏览
-
- 分片上传文件,后端接收怎么生成了一个文件名为blob的文件?
- 2023-01-09 163浏览
-
- 除了cookie之外,还能用什么方法做验证码功能?
- 2023-01-22 137浏览
-
- 使用指南怎么生成
- 2023-01-18 160浏览

