最快速识别第三方CDN资源缺失Timing-Allow-Origin的方式是检查performance.getEntriesByType("resource")中domainLookupStart、connectStart、secureConnectionStart等网络阶段字段是否全为0或NaN,而startTime、responseEnd、duration正常;若满足跨域且已加载前提,且排除缓存与采集时机干扰,则可确认因缺失Timing-Allow-Origin导致浏览器清零时序数据。

直接看 performance.getEntriesByType("resource") 中关键网络阶段字段是否全为 0 或 NaN,是识别第三方 CDN 资源缺失 Timing-Allow-Origin 的最快速方式。
检查 PerformanceResourceTiming 中的网络阶段字段
调用 performance.getEntriesByType("resource") 后,遍历返回数组,重点关注以下字段:
-
domainLookupStart/domainLookupEnd -
connectStart/connectEnd -
secureConnectionStart(SSL/TLS 时间) -
requestStart/responseStart
若这些字段全部为 0 或 NaN,而 startTime、responseEnd、duration 有正常值,基本可断定是跨域资源未声明 Timing-Allow-Origin: * —— 浏览器主动清零了敏感网络时序数据。
确认资源是否为跨域且已完成加载
仅当满足两个前提,上述字段才可能被填充:
- 资源已完全加载(如
script执行完毕、img触发load事件),未完成的资源不会出现在列表中 - 资源地址与当前页面协议+域名+端口不一致(例如页面在
https://a.com,资源来自https://cdn.b.com)
可用如下代码快速过滤并标记可疑项:
performance.getEntriesByType("resource").filter(e =>
e.initiatorType === "script" || e.initiatorType === "img" || e.initiatorType === "link" &&
new URL(e.name).origin !== location.origin &&
(e.domainLookupStart === 0 || isNaN(e.domainLookupStart))
)
排除缓存与执行时机干扰
字段为 0 不一定全是服务端头的问题,需先排除常见误判场景:
- 资源走强缓存(
from cache或memory cache):此时 DNS/TCP/SSL 阶段被跳过,字段自然为 0 —— 查看e.transferSize === 0 && e.encodedBodySize === 0可辅助判断 - 调用过早:在
load事件前执行,部分资源尚未结束加载 —— 应确保在window.addEventListener("load", ...)或PerformanceObserver回调中采集
验证服务端响应头是否存在 Timing-Allow-Origin
对目标 CDN 资源发起一次手动请求(如用 curl 或浏览器开发者工具 Network 面板),检查响应头:
- 打开 DevTools → Network → 点击对应资源 → Headers → Response Headers
- 查找
Timing-Allow-Origin字段,值应为*或明确包含你的页面源(如https://your-site.com) - 若完全缺失该头,或值为其他不匹配的域名,即为根本原因


















