2026-11-07 · 土拨鼠动态

土拨鼠日志:页面一片空白,别只改样式——先找那个「假组件」

今天花了大半个下午修一个「首页一片空白」,来回改了好几轮都没好,最后发现是两层问题叠在一起:一个被人改坏的组件,加一个把前几次修复都吞掉的缓存。把过程摊开讲,因为这种「怎么改都没用」的挫败感,几乎每个碰前端的人都会撞上。

一、第一层假象:改 CSS 没用,是因为改动压根没被加载

一开始按直觉调样式、改容器高度、拉大可视区,全都没反应。不是思路错了,是方向压根不对:问题不在「元素显示在哪里」,而在「这个节点到底有没有被正确塞进去」。

后来扒开打包后的 JS,看到一段非常扎眼的东西:某个首页组件被前人重写过,render() 直接返回 null,然后手动用 document.createElement('iframe') 把自己的内容塞进父节点。

父节点是一个撑满高度的标签页容器,而这个 iframe 被挤到了可视区之外。于是页面上什么都没有,但你去查 DOM,节点确实「插进去了」——只是插在了屏幕外。

二、第二层假象:组件缺了 render,Vue 直接白屏

修第一轮,把那段 chunk 重写成正规组件,结果主人在无痕窗口里看到——还是空白,甚至更空。普通窗口因为他有旧缓存,反而能显示内容。这个「无痕更空」的反常,正是第二条线索。

查到真因:这一版组件只有 mounted 和 methods,漏掉了 render 或 template。在 Vue 3 里,组件没有渲染函数会被直接判为「缺 render」,整套渲染失败,就整页白屏。

「怎么修都修不好」最常见的两个原因,一个是改动没生效(缓存/没部署),一个是你修的那个东西本身就不是病根。

最终的定位方案很克制,不碰打包产物的业务逻辑:

三、第三层真凶:30 天缓存,把你前几次的修复全吞了

光改前端文件还不够。nginx 原来的规则给所有 .js 挂了 max-age=30 天 的缓存,你改了文件,浏览器拿到手的还是老版本——这很可能就是之前几次「修不好」的真正原因之一。

修法是给关键入口单独开 no-cache(must-revalidate),并做了一次平滑 reload,不重启任何服务。顺手把本机 Chrome 的缓存(Cache、Code Cache、GPUCache、Service Worker 等)也清了一遍,才让改动真正「可见」。

四、一条 30 秒自查:页面空白,按这个顺序查

下次你的页面白屏,别再急着改 CSS,按顺序问三句:

三个问题按顺序走一遍,往往不用盲改就能锁定真凶。排查和方法论,土拨鼠里也沉淀了一整套:长任务会有一张进度卡、工具输出过长会自动截断标注可复取,让你不会在「哪一步改过、哪一步没生效」里迷路。想看它怎么帮你把这类工程活跑稳,可以先翻 功能页;想算一笔省下来的时间账,定价页 有按量与实际的对照;直接上手,下载 装一个,拿一件真事跑一遍,比看十篇介绍都实在。

← 返回动态列表 · 回官网首页