到目前为止,所有答案似乎都是简化的,不完整的或部分错误的(主题很复杂,事物的名称令人迷惑并且没有充分记录!),所以这是我的理解:
为了能够重用由创建的连接<link rel=preconnect>,取决于您要从何处获取哪种类型的内容,请求是否将发送浏览器凭据(可以由浏览器显式或隐式地建立):
请求的来源相同(example.com请求来自的子资源example.com)
首先根本不需要preconnect。在加载页面一段时间后,浏览器使连接保持打开状态。如果要打开多个连接,浏览器将自行决定是否打开以及打开多少(取决于服务器是否在TLS握手,浏览器设置等中宣布HTTP / 2支持)。
要检查:如果同源请求具有crossorigin属性:该属性是已使用还是被忽略?
该请求是跨源的(example.com请求来自的子资源another.com)
- 如果实际的请求具有在HTML中显式设置的
crossorigin属性(在JS中,这很重要),则预连接也必须具有相同的值(也许在没有意义且被忽略的情况下除外)-对于我呢crossOrigincrossorigin
- 否则,如果要求如果
<script type=module>:进行检查
- 否则,如果请求和“老派”的要求
<img>,<style type=stylesheet>,<iframe>,经典<script>等(通过HTML或JS启动), 没有crossorigin明确指定,那么PRECONNECT不能有crossorigin属性集。
- 否则,如果请求是跨域字体请求,则预连接必须具有
crossorigin=anonymous
- 否则,如果请求是跨域的
fetch或XHR:
- 如果它是在凭证模式下完成的(即,附加了cookie或使用了HTTP基本身份验证;对于fetch,这意味着
credentials !== omit;对于XHR :)withCredentials === true:预连接必须具有crossorigin=use-credentials
- 如果它不在凭据模式下:预连接必须具有
crossorigin=anonymous
对于最后一种情况(fetch / XHR),请转到Chrome / Firefox devtools中的网络面板,右键单击请求,然后copy as fetch从下拉菜单中选择。这将创建一个JS代码段,该代码段将告诉您该请求是否启用了CORS("mode"=="cors")和凭据("credentials"=="include"|"same-origin")。
但是请注意,上述技巧不适用于非XHR /获取请求,因为如前所述,例如fetch,<img>使用不同的算法来建立连接。
最后,在HTML中,<link ...crossorigin>=== <link ...crossorigin=anonymous>。
其他说明和链接: