Todas las respuestas hasta ahora parecen simplificadas, incompletas o parcialmente incorrectas (el tema es complejo, ¡las cosas están confusamente nombradas y no están bien documentadas!), Así que aquí está mi comprensión:
Para poder reutilizar la conexión creada por <link rel=preconnect>
, las cosas dependen de qué tipo de contenido desea obtener, desde dónde, si la solicitud enviará credenciales del navegador (que el navegador puede establecer explícita o implícitamente):
La solicitud es del mismo origen ( example.com
solicitudes de recursos secundarios de example.com
)
No hay necesidad de preconnect
nada en primer lugar; el navegador mantiene la conexión abierta después de cargar la página durante bastante tiempo. Si hay varias conexiones para abrir, el navegador decide por sí mismo si abrirá y cuántas (dependiendo de si el servidor anuncia soporte HTTP / 2 en protocolo de enlace TLS, configuración del navegador, etc.)
a verificar : ¿qué crossorigin
pasa si la solicitud del mismo origen tiene atributo: se usa o se ignora?
La solicitud es de origen cruzado ( example.com
solicitudes de recursos secundarios de another.com
)
- si la solicitud real tiene un
crossorigin
atributo establecido explícitamente en HTML ( crossOrigin
en JS, el caso es importante), la preconexión también debe tenerlo, con el mismo valor (tal vez excepto en los casos en que no tiene sentido y crossorigin
se ignora, no está completamente claro para yo todavía)
- de lo contrario, si la solicitud es para
<script type=module>
: a verificar
- lo demás, si la solicitud es pedido y la "vieja escuela" para
<img>
, <style type=stylesheet>
, <iframe>
, clásico <script>
, etc (iniciada a través de HTML o JS) sin crossorigin
especificar de forma explícita , a continuación, el preconnect no debe tener crossorigin
establecido el atributo.
- de lo contrario, si la solicitud es una solicitud de fuente de origen cruzado, la conexión previa debe tener
crossorigin=anonymous
- de lo contrario, si la solicitud es de origen cruzado
fetch
o XHR
:
- si se realiza en modo con credenciales (es decir, se adjuntan cookies o se usa autenticación básica HTTP; en caso de recuperación, esto significa
credentials !== omit
; en caso de XHR withCredentials === true
:): la conexión previa debe tenercrossorigin=use-credentials
- si no está en modo con credenciales: la conexión previa debe tener
crossorigin=anonymous
Para el último caso (fetch / XHR), vaya al panel de red en Chrome / Firefox devtools, haga clic derecho en una solicitud y elija copy as fetch
de un menú desplegable. Esto creará un fragmento de JS, que le indicará si esa solicitud está habilitada para CORS ( "mode"=="cors"
) y con credenciales ( "credentials"=="include"|"same-origin"
).
Sin embargo, tenga en cuenta que el truco anterior no funciona correctamente para solicitudes que no son XHR / fetch, porque, por ejemplo, fetch
y <img>
use diferentes algoritmos para establecer la conexión, como se explicó anteriormente.
Finalmente, en HTML, <link ...crossorigin>
=== <link ...crossorigin=anonymous>
.
Notas y enlaces adicionales: