这是一种适用于Chrome和Safari、同时支持cookie的预加载fetch的解决方案。
不幸的是,它只适用于相同域的请求。
首先,不要为预加载标签指定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
属性值和fetch 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,但Safari无法将fetch与预加载请求匹配,可能是因为不同的cors模式。