Todas as respostas até agora parecem simplificadas, incompletas ou parcialmente erradas (o tópico é complexo, as coisas são nomeadas de forma confusa e não estão bem documentadas!), Então aqui está o meu entendimento:
Para poder reutilizar a conexão criada <link rel=preconnect>
, as coisas dependem do tipo de conteúdo que você deseja buscar, de onde, se a solicitação enviará credenciais do navegador (que podem ser estabelecidas pelo navegador de forma explícita ou implícita):
A solicitação é da mesma origem ( example.com
solicita sub -fonte de example.com
)
Não há necessidade preconnect
, em primeiro lugar; o navegador mantém a conexão aberta após carregar a página por um bom tempo. Se houver várias conexões a serem abertas, o navegador decide por si próprio se e quantas abrir (dependendo se o servidor anunciar suporte HTTP / 2 no handshake TLS, configurações do navegador etc.)
a ser verificado : e se a solicitação de mesma origem tiver crossorigin
atributo: é usada ou ignorada?
A solicitação é de origem cruzada ( example.com
solicita o sub-recurso de another.com
)
- se a solicitação real tiver um
crossorigin
atributo definido explicitamente em HTML ( crossOrigin
em JS - o caso é importante), a pré-conexão também deve ter, com o mesmo valor (talvez exceto nos casos em que não faz sentido e crossorigin
é ignorado - não está totalmente claro para eu ainda)
- caso contrário, se solicitar, se
<script type=module>
: a ser verificado
- mais, se o pedido é e "old school" pedido de
<img>
, <style type=stylesheet>
, <iframe>
, clássico <script>
etc (iniciada via HTML ou JS) , sem crossorigin
explicitamente especificado , então o preconnect não deve ter crossorigin
conjunto de atributos.
- caso contrário, se request for uma fonte de origem , a pré-conexão deverá ter
crossorigin=anonymous
- caso contrário, se a solicitação for de origem cruzada
fetch
ou XHR
:
- se for feito no modo credenciado (ou seja, os cookies estiverem anexados ou a autenticação básica HTTP for usada; no caso de busca, isso significa
credentials !== omit
; no caso de XHR withCredentials === true
:): a pré-conexão deve tercrossorigin=use-credentials
- se não estiver no modo credenciado: a pré-conexão deve ter
crossorigin=anonymous
Para o último caso (buscar / XHR), acesse o painel de rede no Chrome / Firefox devtools, clique com o botão direito do mouse em uma solicitação e escolha copy as fetch
uma lista suspensa. Isso criará um trecho de JS, que informará se essa solicitação é habilitada para CORS ( "mode"=="cors"
) e credenciada ( "credentials"=="include"|"same-origin"
).
Nota no entanto o truque acima não funcionar corretamente para não-XHR / solicitações de busca, porque, por exemplo, fetch
e <img>
usar diferentes algoritmos para estabelecer a conexão, como explicado anteriormente.
Finalmente, em HTML, <link ...crossorigin>
=== <link ...crossorigin=anonymous>
.
Notas e links adicionais: