这是在 Chrome 和 Safari 中都可以使用并支持 cookie 的预加载 fetch 的有效解决方案。
不幸的是,它仅适用于相同的域请求。
首先,不要为 preload 标签指定 crossorigin 属性,这将确保 Safari 以 no-cors 模式发送请求并包含 cookie
<link rel="preload" as="fetch" href="/data.json">
其次,fetch api 请求也应该在no-cors 模式下完成,并包含凭据(cookies)。
请注意,此请求不能有任何自定义标头(如Accept、Content-Type 等),否则浏览器将无法将此请求与预加载的请求匹配。
fetch('/data.json', {
method: 'GET',
credentials: 'include',
mode: 'no-cors',
})
我尝试了crossorigin 属性值和获取 API 配置的其他组合,但它们在 Safari 中都不适合我(仅在 Chrome 中)。
这是我尝试过的:
<link rel="preload" as="fetch" href="/data.json" crossorigin="anonymous">
<script>
fetch('/data.json', {
method: 'GET',
credentials: 'same-origin',
mode: 'cors',
})
</script>
上述方法在 Chrome 中有效,但在 Safari 中无效,因为 Safari 中的预加载请求不会发送 cookie。
<link rel="preload" as="fetch" href="/data.json" crossorigin="use-credentials">
<script>
fetch('/data.json', {
method: 'GET',
credentials: 'include',
mode: 'cors',
})
</script>
以上内容在 Chrome 中有效,但在 Safari 中无效。虽然 cookie 是通过 preload 请求发送的,但 Safari 无法匹配 fetch 和 preload 请求,可能是因为 cors 模式不同。