前几天 Halo 博客一直运行正常,今天登录后台时突然发现:
控制台无法进入,页面空白并报错
文章编辑页无法上传背景图,附件功能失效
浏览器控制台显示类似如下错误:
text
TypeError: Failed to fetch dynamically imported module: https://blog.tzy.cool/ui-assets/AttachmentInput-Be3U8un0.js所有操作均无法正常进行,初步怀疑是服务端组件缺失或配置错误。
首先登录服务器,确认 Halo 容器/进程内 /app/ui-assets/ 目录下文件存在且完整,未发现任何文件缺失。重启 Halo 服务后问题依旧。
检查 Nginx 反向代理配置,确认 /ui-assets/ 路径正确转发到 Halo 后端,未配置错误的单独 location 规则。Nginx 日志无异常,重载配置无效。
因为错误与模块加载有关,一度怀疑是 MySQL 的 max_allowed_packet 过小导致资源传输不完整。登录数据库查看参数并调大至 128M,重启 MySQL 后仍无效。
在近乎放弃时,用浏览器的无痕模式访问管理后台,一切恢复正常!控制台、附件上传、背景图全部正常。此时才意识到问题出在浏览器本地缓存。
返回普通模式,按 F12 打开开发者工具,进入 Application > Storage,点击 Clear site data,刷新页面后问题完全消失。确认是浏览器缓存了损坏的旧版 JavaScript 模块文件。
Halo 升级(或任何前端资源更新)后,生成的文件名 Hash 会变化(例如 AttachmentInput-Be3U8un0.js)。旧版缓存的文件可能因网络波动、磁盘错误等原因在本地受损,浏览器却继续使用该损坏缓存,导致模块加载失败。而服务端早已不存在同名文件(或文件内容已变化),因此报错。
无需修改服务端任何配置,只需强制清除浏览器缓存:
方法一(推荐):打开开发者工具 → Application(或 Storage)→ Clear site data → 刷新页面。
方法二:使用浏览器的无痕/隐私模式登录,确认功能正常后,回原浏览器清除缓存。
方法三:按 Ctrl + Shift + Delete(Windows)/ Cmd + Shift + Delete(Mac),选择清除“缓存的图片和文件”,时间范围选“全部”。
遇到 Failed to fetch dynamically imported module 这类错误,先不要急着改服务端配置,用无痕模式快速验证是否为本地缓存问题。
如果无痕模式正常,则 99% 是浏览器缓存损坏,清掉即可,避免浪费大量时间排查服务端。
日常使用中,可定期清理缓存,或在网站更新后告知用户强制刷新(Ctrl + F5)。
这次踩坑耗时近两小时,最终还是最简单的一步解决了问题。记录下来,希望其他人能少走弯路。
以后遇到类似情况,记得先祭出“无痕模式”这个大杀器。