本文详解为何 `rel=”preload”` 加载 json 时浏览器提示“未在几秒内使用”,核心原因是 “ 的 `crossorigin` 属性与 `fetch()` 的凭据模式不匹配;通过统一设为匿名模式(`crossorigin=”anonymous”` 且 `fetch()` 不传 `credentials`)即可解决。
在现代 Web 性能优化中, 是提前获取关键资源(如字体、脚本、JSON 数据)的有效手段。但当预加载 JSON 文件却始终触发以下控制台警告时:
The resource … was preloaded using link preload but not used within a few seconds from the window’s load event.
或
A preload for ‘…’ is found, but is not used because the request credentials mode does not match.
这通常不是缓存或网络问题,而是 预加载声明与后续 fetch 请求的凭据(credentials)语义不一致 所致。
? 关键原则:凭据模式必须严格匹配
浏览器将 视为一个独立的预请求,它会根据 crossorigin 属性决定是否携带凭据(如 cookies、HTTP 认证头)。而 fetch() 的 credentials 选项同样控制此行为。二者若不一致,浏览器将拒绝复用已预加载的响应,转而发起全新请求——导致预加载失效,并抛出上述警告。