DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

Vite 动态页面闪过无样式

页面预加载与动态导入重叠,共享 CSS 还未加载完成,第二次调用却继续显示组件。核对 Vite 8.3.4 的 pending Promise 修复与实际产物。

生产构建后的页面使用动态导入。导航时,CSS 请求还在加载,页面组件却已经显示,短暂闪过没有样式的内容。刷新或放慢网络后更容易看到,开发服务器里却未必出现。

如果同一个页面 chunk 被预加载后又正式导入,或两个动态导入共享一份 CSS,需要检查后一次调用是否等待了仍在进行的样式请求。Vite 8.3.2 曾出现这样的重叠加载问题;正式版 8.3.4 包含相应修正。

旧预加载辅助逻辑插入 stylesheet 的 <link> 后,就把该地址记为已经处理。第一次调用等待这个 link 的 load 事件,第二次调用看见地址在记录中,则跳过等待。

这会产生一种时间顺序:第一次预加载开始请求 CSS;第二次导入发现 CSS 已有记录,继续加载页面模块;CSS 最后才完成。第二次调用虽然避免了重复插入 link,却没有继承第一次仍未结束的加载工作。

因此,检查时不能只问“head 里有没有 stylesheet”。需要把两次动态导入的开始与完成时间、对应 CSS 的请求和加载状态放在一起看。使用已有浏览器开发工具观察即可,不必为了排查改动站点的业务导航。

先排除根本没有拿到样式的情况

这个问题要求对应样式确实已经产出,浏览器请求的也是正确文件。先核对 URL、HTTP 响应、内容类型、CSP 和页面实际使用的样式。404、错误部署路径或策略阻止加载,不能靠等待已有请求解决。

还要确认前后两次调用指向相同的样式资源,并且第二次发生时第一次尚未完成。如果组件在 CSS 已加载后仍无样式,应继续检查选择器、隔离规则或构建结果,而不是把所有闪烁都归到预加载竞态。

多个 HTML 入口的循环依赖若导致构建产物本来就漏掉 CSS,则是另一条构建期路径。这里讨论的是浏览器已请求到正确 CSS,重叠导入却没有共享等待过程。

正式修复保留正在进行的 Promise

Vite 8.3.4 的 preloadOnce 为同一个地址保留尚未完成的 Promise。第二次调用遇到已有地址时,会拿到这个 Promise,继续等待,而不是只看到一个“已经处理”的标记。

加载完成后,这份记录再转成无需继续等待的状态。失败也会进入原有的预加载错误处理路径,不会因为重复调用就把错误当成成功。

这项修正针对该辅助逻辑发起的共享加载。页面上原本由 SSR 放入的 stylesheet、应用自己的资源调度或第三方路由预加载,仍可能有各自的等待规则,不能仅凭升级 Vite 推断所有异步样式路径都获得同一保证。

升级应使用框架和插件支持的兼容版本,再通过项目自己的构建、验收与交付流程生成并上线新资源。只升级本机依赖而继续服务旧构建产物,浏览器仍会使用旧辅助代码。也不需要为了修复这一等待问题直接关闭 CSS 分包、删除所有缓存,或给导航硬加固定延时。

保留重叠条件验收

在受控验收环境中放慢相关样式请求,保留预加载与正式导入重叠的条件,确认后一次调用不会在这份 CSS 完成前显示依赖其样式的页面。同时检查只插入一份对应 stylesheet,正常导航没有新增错误。

最后核对实际部署的 JS 辅助代码和资源版本。若失败日志变成 Unable to preload CSS,应处理那次真实加载失败;进程或页面不再静默越过等待,并不意味着错误资源已被修复。