fix(web): Google Fonts 延迟到 window.load 后注入,根治E2E load事件阻塞 #2301
Reference in New Issue
Block a user
Delete Branch "fix/web-fonts-load-after-window-load"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题
#2300 的 preload + media=print 方案不能根治 E2E 超时。运维实锤:
preload和media=print样式表都属于文档子资源load事件会等所有在途子资源请求完成load永不触发 → Playwrightpage.goto(默认等 load)90s 超时方案(选 B)
按运维建议的三条路:A 自托管、B JS 在 load 后动态插 link、C Playwright route.abort。
选 B(对产品无副作用、用户也受益、比自托管快):
</body>前用内联普通<script>(非 module,不受 main.tsx 异步加载影响)注册window.load回调load触发后用requestIdleCallback(fallbacksetTimeout 500ms,timeout 兜底 2s)动态createElement(link)append 到 head<noscript>降级 JS 禁用场景效果
load毫秒级触发page.goto默认waitUntil:load不会再被 Google Fonts 拖死requestIdleCallback确保字体在浏览器空闲时才加载,不抢占首屏交互资源__gfonts_linkid 防重复注入影响范围
仅改
apps/web/index.html单文件。后端/worker 无改动。staging 部署前端即可验证。为什么不选 A/C
cc @运维 合入后麻烦跑一次 Staging E2E 验证回绿。
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🚀 预览环境已部署
Auto merge skipped after multiple 405 errors: PR may have conflicts or unresolved checks. Please review manually. This is not a CI failure.
window.load 会等待所有在途子资源完成,Google Fonts 挂起时请求永不完成→load 永不触发。 改走 B 方案:head 里彻底不出现任何 Google 域的 <link>/<link rel=preconnect>, 内联普通 <script>(非 module,不受 main.tsx 异步加载影响)在 window.load 之后用 requestIdleCallback 动态 createElement('link') 注入字体样式表: - 初始 HTML 不含 Google 子资源,同源 CSS/JS/img 加载完即触发 load(毫秒级) - E2E Playwright page.goto 默认 waitUntil:'load' 不再被拖死 - 真实用户首屏用系统字体兜底(PingFang/Microsoft YaHei/sans-serif),不白屏 - requestIdleCallback 无浏览器支持时 fallback setTimeout 500ms - timeout:2000 兜底,即使浏览器一直 busy 也最多等 2s 就注入 - <noscript> 降级 JS 禁用场景(极少用户) - 字体加载完后浏览器自动应用,已有内容不重排(中文字体度量接近) 仅改 apps/web/index.html 单文件,前端重部署即可,后端/worker 不受影响。cfe567b062to4eb2626d0a🗑️ 预览环境已清理
PR #2301 已关闭或合并,对应的预览环境已被清理。