资源超时本质是dom渲染截断而非加载慢,需在解析阶段介入;fetch加载html片段须用abortcontroller设1500ms超时,检查response.ok与status,并校验html结构。

资源超时不是“加载慢”,而是 DOM 渲染被截断——document.readyState 可能卡在 interactive,DOMContentLoaded 不触发,关键节点缺失。必须在解析阶段就介入,不能等 JS 执行完再补救。
fetch 加载 HTML 片段时如何判断并 fallback
微前端、CMS 内容嵌入等场景下,fetch('/widget.html') 超时会导致插入内容为空或结构残缺,直接 innerHTML = html 会白屏或报错。
- 必须用
AbortController主动设超时(建议1500ms),不能只靠fetch().catch()—— 网络卡住时 promise 永不 reject -
response.ok和response.status都要检查,404或500不会进catch - 对返回的 HTML 做最小结构校验:
html.trim().startsWith('<div> 或是否包含 <code>,避免把错误页当有效内容渲染 - fallback 区域需提前声明,如
id="widget-fallback"的<div>,失败时仅显示它,不操作主容器 DOM <h3>script/link 标签加载超时怎么感知并降级</h3> <p><code>onload/onerror在弱网下不可靠:资源可能卡在 pending 状态,事件永不触发;或响应头已到但 body 拖延数秒,导致降级滞后。- 给
<script></script>和<link>添加onerror回调是基础,但必须配合防重逻辑:onerror="if (!this.dataset.fallback) { this.dataset.fallback = '1'; this.src = '/fallback.js'; }" - CDN 资源失败后切本地,要先确认路径存在且 MIME 类型正确(
text/javascript/text/css),否则仍会静默失败 - 不要用
setTimeout模拟超时——它无法区分“正在加载”和“卡死”,应优先用AbortController封装 fetch 加载脚本 - 内联关键 JS(如降级逻辑)必须放在
最前,确保在任何外部资源阻塞时仍可执行
iframe 加载超时后如何安全 fallback
<iframe></iframe>的onerror在跨域下基本失效,load事件也无法识别 HTTP 200 + 空 body 这类“静默失败”。- 改用定时检测:
iframe.contentDocument?.body?.children.length === 0或iframe.contentWindow?.document?.readyState !== 'complete' - 超时阈值设为
8000ms(比典型弱网首帧耗时高一倍),超过即隐藏 iframe 并显示 fallback 区域 - fallback 区域内必须提供手动重试按钮,点击时执行
iframe.src = iframe.src + '?t=' + Date.now()强制刷新,绕过缓存 - 若 iframe 用于微前端子应用,fallback 应保留核心导航入口,而非空白提示
最易被忽略的是:DOM 结构不完整时,
document.querySelectorAll可能返回空 NodeList,后续逻辑直接跳过——降级不是“换张图”,而是让 JS 脚本能继续基于残缺 DOM 做最小可用判断。 - 给











