Optimiza la carga de recursos con la API de Fetch Priority

La API de Fetch Priority indica la prioridad relativa de los recursos en el navegador. Puede habilitar una carga óptima y mejorar las Métricas web esenciales.

Addy Osmani
Addy Osmani
Leena Sohoni
Leena Sohoni
Patrick Meenan
Patrick Meenan

Navegadores compatibles

  • Chrome: 102.
  • Edge: 102.
  • Firefox: No es compatible.
  • Safari: 17.2.

Origen

Cuando un navegador analiza una página web y comienza a descubrir y descargar recursos como imágenes, secuencias de comandos o CSS, les asigna un priority de recuperación para que pueda descargarlos en un orden óptimo. Por lo general, la prioridad de un recurso depende de qué es y en qué parte del documento se encuentra. Por ejemplo, las imágenes en la vista del puerto pueden tener una prioridad High, y la prioridad para el CSS de carga anticipada que bloquea el procesamiento mediante <link> en <head> podría ser Very High. Los navegadores son bastante buenos para asignar prioridades que funcionan bien, pero pueden no ser óptimas en todos los casos.

En esta página, se analizan la API de Fetch Priority y el atributo HTML fetchpriority, que te permite sugerir la prioridad relativa de un recurso (high o low). La prioridad de recuperación puede ayudar a optimizar las Métricas web esenciales.

Resumen

Estas son algunas áreas clave en las que la prioridad de recuperación puede ayudar:

  • Para aumentar la prioridad de la imagen LCP, especifica fetchpriority="high" en el elemento de imagen, lo que hace que el LCP ocurra antes.
  • Se aumentó la prioridad de las secuencias de comandos async y se usó una semántica mejor que la del hackeo más común actual (se inserta una <link rel="preload"> para la secuencia de comandos async).
  • Disminución de la prioridad de las secuencias de comandos de cuerpo tardío para permitir una mejor secuenciación con imágenes
Vista de tira de película que compara dos pruebas de la página principal de Vuelos de Google. En la parte inferior, la prioridad de recuperación se usa para aumentar la prioridad de la imagen hero, lo que da como resultado una disminución de 0.7 segundos en el LCP.
Prioridad de recuperación, que mejora la métrica Largest Contentful Paint de 2.6 s a 1.9 s en una prueba de Google Flights

Históricamente, los desarrolladores han tenido una influencia limitada sobre la prioridad de los recursos mediante la precarga y la preconexión. La precarga te permite informar al navegador sobre los recursos críticos que desees cargar de manera anticipada, antes de que el navegador los descubra. Esto resulta particularmente útil para los recursos más difíciles de descubrir, como las fuentes incluidas en las hojas de estilo, las imágenes de fondo o los recursos cargados desde una secuencia de comandos. La preconexión ayuda a preparar las conexiones a servidores de origen cruzado y a mejorar métricas como Tiempo hasta el primer byte. Resulta útil cuando conoces un origen, pero no necesariamente la URL exacta de un recurso que será necesario.

La prioridad de recuperación complementa estas Sugerencias de recursos. Es un indicador basado en lenguaje de marcado disponible a través del atributo fetchpriority que los desarrolladores pueden usar para indicar la prioridad relativa de un recurso en particular. También puedes usar estas sugerencias a través de JavaScript y la API de Fetch con la propiedad priority para influir en la prioridad de las recuperaciones de recursos hechas para los datos. La prioridad de recuperación también puede complementar la precarga. Toma una imagen de Largest Contentful Paint, que, cuando se precarga, seguirá teniendo una prioridad baja. Si otros recursos iniciales de prioridad baja la retrasan, el uso de la prioridad de recuperación puede ayudar con qué rapidez se carga la imagen.

Prioridad de recursos

La secuencia de descarga de recursos depende de la prioridad asignada al navegador para cada recurso de la página. Los factores que pueden afectar el procesamiento de prioridad incluyen lo siguiente:

  • Es el tipo de recurso, como CSS, fuentes, secuencias de comandos, imágenes y recursos de terceros.
  • Es la ubicación o el orden en que el documento hace referencia a los recursos.
  • Indica si los atributos async o defer se usan en secuencias de comandos.

En la siguiente tabla, se muestra cómo Chrome prioriza y secuencia la mayoría de los recursos:

  Carga en la fase de bloqueo del diseño Carga de a una en la fase de bloqueo de diseño
Prioridad de
Blink
VeryHigh Alta Versión intermedia Bajo VeryLow
DevTools
Priority
Más alta Alta Versión intermedia Bajo Más bajo
Recurso principal
CSS (a principios**) CSS (tardío**) CSS (incongruencia de medios***)
Secuencia de comandos (adelantada** o no proveniente del análisis de carga previa) Secuencia de comandos (tarde**) Secuencia de comandos (asíncrona)
Fuente Fuente (rel=preload)
Importar
Imagen (en viewport) Imagen (primeras 5 imágenes > 10,000 px2) Imagen
Contenido multimedia (video y audio)
Recuperación previa
XSL
XHR (sincronización) XHR/recuperación* (asíncrona)

El navegador descarga los recursos con la misma prioridad calculada en el orden en que se descubren. Puedes verificar la prioridad asignada a diferentes recursos cuando cargues una página en la pestaña Red de las Herramientas para desarrolladores de Chrome. (Para incluir la columna priority, haz clic con el botón derecho en los encabezados de la tabla y márcala).

Pestaña Network de las Herramientas para desarrolladores de Chrome que enumeran varios recursos de fuentes. Todas son de prioridad más alta.
Prioridad del recurso type = "font" en la página de detalles de las noticias de la BBC
.
Pestaña Network de las Herramientas para desarrolladores de Chrome que enumeran varios recursos de fuentes. Son una combinación de prioridad baja y alta.
Prioridad para el recurso type = "script" de la página de detalles de noticias de la BBC.

Cuando las prioridades cambian, puedes ver la prioridad inicial y final en el parámetro de configuración Filas de solicitud grandes o en un cuadro de información.

Pestaña Network de las Herramientas para desarrolladores de Chrome. Las “Grandes filas de solicitud” está marcada y en la columna Prioridad se muestra la primera imagen con una prioridad alta y una prioridad inicial diferente de medio debajo. Lo mismo se muestra en la información sobre la herramienta.
Cambios de prioridad en Herramientas para desarrolladores.

¿Cuándo podrías necesitar la prioridad de recuperación?

Ahora que comprendes la lógica de priorización del navegador, puedes modificar el orden de descarga de la página para optimizar su rendimiento y las Métricas web esenciales. Estos son algunos ejemplos de los aspectos que puedes cambiar para influir en la prioridad de las descargas de recursos:

  • Coloca las etiquetas de recursos, como <script> y <link>, en el orden en que deseas que el navegador las descargue. Por lo general, los recursos con la misma prioridad se cargan en el orden en que se descubren.
  • Usa la sugerencia del recurso preload para descargar los recursos necesarios de forma anticipada, en especial, aquellos que el navegador no puede detectar con facilidad de forma anticipada.
  • Usa async o defer para descargar secuencias de comandos sin bloquear otros recursos.
  • Carga diferida de contenido en la mitad inferior de la página para que el navegador pueda usar el ancho de banda disponible para recursos más importantes en la mitad superior de la página.

Estas técnicas ayudan a controlar el cálculo de prioridad del navegador, lo que mejora el rendimiento y las Métricas web esenciales. Por ejemplo, cuando se precarga una imagen de fondo crítica, se puede descubrir mucho antes, lo que mejora el Largest Contentful Paint (LCP).

A veces, es posible que estos controladores no sean suficientes para priorizar recursos de manera óptima para tu aplicación. Estas son algunas de las situaciones en las que la prioridad de recuperación podría ser útil:

  • Tienes varias imágenes en la mitad superior de la página, pero no todas deberían tener la misma prioridad. Por ejemplo, en un carrusel de imágenes, solo la primera imagen visible necesita una prioridad más alta, y las demás, por lo general, fuera de la pantalla inicialmente se pueden configurar para que tengan una prioridad más baja.
  • Las imágenes dentro del viewport suelen comenzar con una prioridad Low. Una vez que se completa el diseño, Chrome descubre que están en el viewport y mejora su prioridad. Por lo general, esto agrega un retraso significativo en la carga de las imágenes críticas, como las imágenes hero. Proporcionar la prioridad de recuperación en el lenguaje de marcado permite que la imagen comience en una prioridad de High y comience a cargarse mucho antes. En un intento por automatizar esto, Chrome establece las primeras cinco imágenes más grandes con prioridad Medium, lo que ayudará, pero un fetchpriority="high" explícito será aún mejor.

    Aún se requiere la precarga para el descubrimiento anticipado de las imágenes LCP incluidas como fondos de CSS. Para mejorar la visibilidad de tus imágenes de fondo prioridad, incluye fetchpriority='high' en la precarga.
  • La declaración de secuencias de comandos como async o defer le indica al navegador que las cargue de forma asíncrona. Sin embargo, como se muestra en la tabla de prioridad, a estas secuencias de comandos también se les asigna un valor de "Baja" prioridad. Es posible que desees aumentar su prioridad y, al mismo tiempo, garantizar la descarga asíncrona, en especial para las secuencias de comandos que son fundamentales para la experiencia del usuario.
  • Si usas la API fetch() de JavaScript para recuperar recursos o datos de forma asíncrona, el navegador le asigna la prioridad High. Es posible que quieras que algunas de tus recuperaciones se ejecuten con una prioridad más baja, en especial si combinas llamadas a la API en segundo plano con llamadas a la API que responden a las entradas del usuario. Marca las llamadas a la API en segundo plano como prioridad Low y las llamadas a la API interactivas como prioridad High.
  • El navegador asigna a las fuentes y a las CSS una prioridad de High, pero algunos de esos recursos pueden ser más importantes que otros. Puedes usar la prioridad de recuperación para reducir la prioridad de los recursos que no son críticos (ten en cuenta que el CSS en las primeras etapas bloquea la renderización, por lo que suele ser una prioridad de High).

El atributo fetchpriority

Usa el atributo HTML fetchpriority para especificar la prioridad de descarga para los tipos de recursos, como CSS, fuentes, imágenes y secuencias de comandos, cuando se descargan con las etiquetas link, img o script. Puede tener los siguientes valores:

  • high: El recurso tiene una prioridad más alta, y deseas que el navegador lo priorice más de lo habitual, siempre que la heurística propia del navegador no impida que eso ocurra.
  • low: El recurso tiene una prioridad más baja y deseas que el navegador la deje de priorizar, si la heurística lo permite.
  • auto: Es el valor predeterminado, que le permite al navegador elegir la prioridad adecuada.

A continuación, se muestran algunos ejemplos del uso del atributo fetchpriority en el lenguaje de marcado, así como la propiedad priority equivalente a la secuencia de comandos.

<!-- We don't want a high priority for this above-the-fold image -->
<img src="/images/in_viewport_but_not_important.svg" fetchpriority="low" alt="I'm an unimportant image!">

<!-- We want to initiate an early fetch for a resource, but also deprioritize it -->
<link rel="preload" href="/js/script.js" as="script" fetchpriority="low">

<script>
  fetch('https://example.com/', {priority: 'low'})
  .then(data => {
    // Trigger a low priority fetch
  });
</script>

Efectos de la prioridad del navegador y fetchpriority

Puedes aplicar el atributo fetchpriority a diferentes recursos, como se muestra en la siguiente tabla, para aumentar o reducir su prioridad calculada. fetchpriority="auto" (WIDGET) en cada fila marca la prioridad predeterminada para ese tipo de recurso. (también disponible como documento de Google).

  Carga en la fase de bloqueo del diseño Carga de a una en la fase de bloqueo de diseño
Prioridad de
Blink
VeryHigh Alta Versión intermedia Bajo VeryLow
DevTools
Priority
Más alta Alta Versión intermedia Bajo Más bajo
Recurso principal
CSS (a principios**) ⬆◉
CSS (tardío**)
CSS (incongruencia de medios***) ⬆*** ◉⬇
Secuencia de comandos (adelantada** o no proveniente del análisis de carga previa) ⬆◉
Secuencia de comandos (tarde**)
Secuencia de comandos (asíncrona/diferida) ◉⬇
Fuente
Fuente (rel=preload) ⬆◉
Importar
Imagen (en viewport, después del diseño) ⬆◉
Imagen (primeras 5 imágenes > 10,000 px2)
Imagen ◉⬇
Contenido multimedia (video y audio)
XHR (sincronización): obsoleto
XHR/recuperación* (asíncrona) ⬆◉
Recuperación previa
XSL

fetchpriority establece la prioridad relativa, lo que significa que aumenta o disminuye la prioridad predeterminada en una cantidad adecuada, en lugar de establecer la prioridad de forma explícita en High o Low. A menudo, esto da como resultado una prioridad High o Low, pero no siempre. Por ejemplo, el CSS crítico con fetchpriority="high" conserva el valor “Muy alto” o “Más alto”. prioridad, y el uso de fetchpriority="low" en estos elementos mantiene el valor "Alta" prioridad. Ninguno de estos casos implica establecer la prioridad de forma explícita en High o Low.

Casos de uso

Usa el atributo fetchpriority cuando quieras sugerir al navegador una sugerencia adicional sobre la prioridad con la que debe recuperar un recurso.

Aumenta la prioridad de la imagen de LCP

Puedes especificar fetchpriority="high" para aumentar la prioridad del LCP o de otras imágenes críticas.

<img src="lcp-image.jpg" fetchpriority="high">

En la siguiente comparación, se muestra la página Vuelos de Google con una imagen de fondo de LCP cargada con y sin prioridad de recuperación. Con la prioridad establecida en alta, el LCP mejoró de 2.6 s a 1.9 s.

Un experimento realizado con trabajadores de Cloudflare para reescribir la página de Vuelos de Google usando la prioridad de recuperación.

Usa fetchpriority="low" para reducir la prioridad de las imágenes en la mitad superior de la página que no son importantes de inmediato, por ejemplo, las imágenes fuera de pantalla en un carrusel de imágenes.

<ul class="carousel">
  <img src="img/carousel-1.jpg" fetchpriority="high">
  <img src="img/carousel-2.jpg" fetchpriority="low">
  <img src="img/carousel-3.jpg" fetchpriority="low">
  <img src="img/carousel-4.jpg" fetchpriority="low">
</ul>

Si bien las imágenes 2 a 4 estarán fuera del viewport, se las puede considerar "lo suficientemente cerca" para aumentarlas a high y también para cargarlas incluso si se agrega un atributo load=lazy. Por lo tanto, fetchpriority="low" es la solución correcta para esto.

En un experimento anterior con la app de Oodle, usamos esto para reducir la prioridad de las imágenes que no aparecen durante la carga. Redujo el tiempo de carga de la página en 2 segundos.

Una comparación en paralelo de la prioridad de recuperación cuando se usa en el carrusel de imágenes de la app de Oodle. A la izquierda, el navegador establece las prioridades predeterminadas para las imágenes de carrusel, pero descarga y pinta esas imágenes aproximadamente dos segundos más lento que el ejemplo de la derecha, que establece una prioridad más alta solo para la primera imagen del carrusel.
Si usas la prioridad alta solo para la primera imagen del carrusel, la página se cargará más rápido.

Disminuye la prioridad de los recursos precargados

Para evitar que los recursos precargados compitan con otros recursos críticos, puedes reducir su prioridad. Usa esta técnica con imágenes, secuencias de comandos y CSS.

<!-- Lower priority only for non-critical preloaded scripts -->
<link rel="preload" as="script" href="critical-script.js">
<link rel="preload" as="script" href="non-critical-script.js" fetchpriority="low">

<!-- Preload CSS without blocking render, or other resources -->
<link rel="preload" as="style" href="theme.css" fetchpriority="low" onload="this.rel='stylesheet'">

Volver a priorizar secuencias de comandos

Las secuencias de comandos que tu página debe ser interactiva deben cargarse rápidamente, pero no deberían bloquear otros recursos más importantes que bloqueen el procesamiento. Puedes marcarlos como async con prioridad alta.

<script src="async_but_important.js" async fetchpriority="high"></script>

No puedes marcar una secuencia de comandos como async si depende de estados específicos del DOM. Sin embargo, si se ejecutan más adelante en la página, puedes cargarlos con menor prioridad:

<script src="blocking_but_unimportant.js" fetchpriority="low"></script>

Esto bloqueará el analizador cuando alcance esta secuencia de comandos, pero permitirá que se priorice el contenido anterior.

Una alternativa, si se necesita el DOM completado, es usar el atributo defer (que se ejecuta, en orden, después de DOMContentLoaded) o incluso async al final de la página.

Disminuye la prioridad de las recuperaciones de datos no críticos

El navegador ejecuta fetch con una prioridad alta. Si tienes varias recuperaciones que pueden activarse de forma simultánea, puedes usar la prioridad predeterminada alta para las recuperaciones de datos más importantes y reducir la prioridad de los menos críticos.

// Important validation data (high by default)
let authenticate = await fetch('/user');

// Less important content data (suggested low)
let suggestedContent = await fetch('/content/suggested', {priority: 'low'});

Notas sobre la implementación de la prioridad de recuperación

Con la prioridad de recuperación, se puede mejorar el rendimiento en casos de uso específicos, pero hay algunos aspectos que se deben tener en cuenta cuando se utiliza la prioridad de recuperación:

  • El atributo fetchpriority es una sugerencia, no una directiva. El navegador intenta respetar la preferencia del desarrollador, pero también puede aplicar sus preferencias de prioridad de recursos para la prioridad de recursos para resolver conflictos.
  • No confundas la prioridad de recuperación con la precarga:

    • La precarga es una recuperación obligatoria, no una sugerencia.
    • La carga previa permite que el navegador descubra un recurso con anticipación, pero aun así recupera el recurso con la prioridad predeterminada. Por el contrario, la prioridad de recuperación no ayuda con la visibilidad, pero te permite aumentar o disminuir la prioridad de recuperación.
    • A menudo es más fácil observar y medir los efectos de una precarga que los de un cambio de prioridad.

    La prioridad de recuperación puede complementar las precargas, ya que aumenta el nivel de detalle de la priorización. Si ya especificaste una precarga como uno de los primeros elementos en <head> para una imagen de LCP, es posible que una prioridad de recuperación de high no mejore significativamente el LCP. Sin embargo, si la precarga ocurre después de que se cargan otros recursos, una prioridad de recuperación de high puede mejorar más el LCP. Si una imagen crítica es una imagen de fondo de CSS, precárgala con fetchpriority = "high".

  • Las mejoras en el tiempo de carga a partir de la priorización son más relevantes en entornos en los que más recursos compiten por el ancho de banda de red disponible. Esto es común en las conexiones HTTP/1.x en las que no se pueden realizar descargas paralelas, o en conexiones HTTP/2 o HTTP/3 con bajo ancho de banda. En estos casos, la priorización puede ayudar a resolver los cuellos de botella.

  • Las CDN no implementan la priorización HTTP/2 de manera uniforme y de manera similar para HTTP/3. Incluso si el navegador comunica la prioridad de la prioridad de recuperación, es posible que la CDN no cambie la prioridad de los recursos en el orden especificado. Esto dificulta la prueba de la prioridad de recuperación. Las prioridades se aplican tanto de forma interna en el navegador como con protocolos que admiten la priorización (HTTP/2 y HTTP/3). De todos modos, vale la pena usar la prioridad de recuperación solo para la priorización interna del navegador, independientemente de la compatibilidad con el origen o la CDN, ya que las prioridades suelen cambiar cuando el navegador solicita recursos. Por ejemplo, a menudo no se solicitan recursos de baja prioridad, como las imágenes, mientras el navegador procesa los elementos <head> críticos.

  • Es posible que no puedas incluir la prioridad de recuperación como una práctica recomendada en tu diseño inicial. Más adelante en tu ciclo de desarrollo, puedes asignar las prioridades a diferentes recursos de la página y, si no coinciden con tus expectativas, puedes agregar la prioridad de recuperación para lograr una mayor optimización.

Los desarrolladores deben usar la precarga para el propósito previsto: precargar recursos que el analizador no detecta (fuentes, importaciones, imágenes LCP en segundo plano). La posición de la sugerencia preload afectará cuando se precarga el recurso.

La prioridad de recuperación se basa en cómo se debe recuperar el recurso cuando se recupera.

Sugerencias para usar las precargas

Ten en cuenta lo siguiente cuando uses las precargas:

  • Incluir una precarga en los encabezados HTTP la coloca antes que todo lo demás en el orden de carga.
  • Por lo general, las precargas se cargan en el orden en que el analizador llega a ellas para cualquier elemento que tenga prioridad Medium o superior. Ten cuidado si incluyes precargas al comienzo de tu código HTML.
  • Es probable que las precargas de fuentes funcionen mejor hacia el final del encabezado o el comienzo del cuerpo.
  • Las precargas de importación (import() o modulepreload dinámicos) deben ejecutarse después de la etiqueta de secuencia de comandos que necesita la importación. Por lo tanto, asegúrate de que la secuencia de comandos se cargue o analice primero para poder evaluarla mientras se cargan sus dependencias.
  • Las precargas de imágenes tienen una prioridad Low o Medium de forma predeterminada. Ordénalos en relación con secuencias de comandos asíncronas y otras etiquetas de prioridad baja o más baja.

Historial

Primero se experimentó con la prioridad de recuperación en Chrome como prueba de origen en 2018 y, luego, nuevamente en 2021 con el atributo importance. En ese momento, se llamaba Sugerencias de prioridad. Desde entonces, la interfaz cambió a fetchpriority para HTML y priority para la API Fetch de JavaScript como parte del proceso de estándares web. Para reducir la confusión, ahora llamamos a esta API Fetch Priority.

Conclusión

Es probable que los desarrolladores estén interesados en la prioridad de recuperación con las correcciones en el comportamiento de precarga y el enfoque reciente en las Métricas web esenciales y el LCP. Ahora tienen controles adicionales disponibles para lograr su secuencia de carga preferida.