Prácticas recomendadas sobre la carga diferida

Mientras que la carga diferida de imágenes y videos tiene un rendimiento positivo y medible beneficios, no es una tarea para tomar a la ligera. Si te equivocas, podría pueden ser consecuencias no deseadas. Por lo tanto, es importante que tengas en cuenta lo siguiente importantes.

Presta atención a la línea de plegado

Puede ser tentador hacer una carga diferida en cada recurso multimedia de la página con JavaScript, pero debes resistir esta tentación. Todo lo que se encuentre sobre el no se debe cargar de forma diferida. Esos recursos deben considerarse críticos y, por lo tanto, debe cargarse de forma normal.

La carga diferida retrasa la carga de recursos hasta que el DOM es interactivo cuando las secuencias de comandos terminan de cargarse y comienzan a ejecutarse. Para las imágenes debajo del de la línea de plegado, esto está bien, pero los recursos críticos en la parte superior deben cargarse con el elemento <img> estándar para que se muestren lo antes posible.

Por supuesto, hoy en día, la ubicación de la línea de plegado no es tan clara cuando los sitios web en tantas pantallas de distintos tamaños. El contenido que se encuentra en la parte superior de una laptop puede estar debajo en dispositivos móviles. No hay un consejo infalible para abordar este problema de forma óptima en todas las situaciones. Deberás realizar una de los recursos esenciales de tu página y cargar esas imágenes de forma a la moda.

Además, no recomendamos que seas tan estricto con la línea de plegado como el para activar la carga diferida. Puede ser más ideal para tus propósitos y establecer una zona de búfer un poco más abajo de la mitad superior de la página se cargan mucho antes de que el usuario las desplace al viewport. Por ejemplo, el La API de Intersection Observer te permite especificar una propiedad rootMargin en una el objeto de opciones cuando creas una nueva instancia de IntersectionObserver. Esta otorga de manera eficaz un búfer a los elementos, lo que activa un comportamiento de carga diferida antes de el elemento está en el viewport:

let lazyImageObserver = new IntersectionObserver(function(entries, observer) {
  // lazy-loading image code goes here
}, {
  rootMargin: "0px 0px 256px 0px"
});

Si el valor de rootMargin es similar a los valores que especificaste para un CSS propiedad margin, eso es porque lo es. En este caso, el el margen inferior del elemento observado (el viewport del navegador de forma predeterminada, pero esto se puede cambiar a un elemento específico con la propiedad root) se amplía a 256 píxeles. Esto significa que la función de devolución de llamada se ejecutará cuando un elemento de imagen sea dentro de los 256 píxeles de la vista del puerto, y la imagen comenzará a cargarse antes de que el usuario los vea.

Para lograr el mismo efecto en navegadores que no admiten Intersection Observe, usa código de control de eventos de desplazamiento y ajusta tu getBoundingClientRect para incluir un búfer.

Cambio de diseño y marcadores de posición

La carga diferida de contenido multimedia puede generar cambios en el diseño si no se usan marcadores de posición. Estos cambios pueden desorientar a los usuarios y activar el costoso diseño de DOM que consumen recursos del sistema y contribuyen a los bloqueos. Como mínimo, considera usar un marcador de posición de color sólido que ocupe las mismas dimensiones que la imagen de destino o técnicas como LQIP o SQIP que sugieren el contenido de un medio antes de que se cargue.

Para las etiquetas <img>, src debería apuntar inicialmente a un marcador de posición hasta ese momento. se actualiza con la URL de la imagen final. Usa el atributo poster en un <video> para que apunte a una imagen de marcador de posición. Además, usa width y Los atributos height en las etiquetas <img> y <video> Esto garantiza que la transición de los marcadores de posición a las imágenes finales no cambiará el tamaño renderizado del elemento mientras se carga el contenido multimedia.

Demoras en la decodificación de imágenes

Cargar imágenes grandes en JavaScript y soltarlas en el DOM puede vincular principal, lo que provoca que la interfaz de usuario no responda durante un período breve de tiempo mientras se produce la decodificación. Decodificación asíncrona de imágenes con decode método antes de insertarlos en el DOM puede reducir este tipo de bloqueos, pero ten cuidado: Todavía no está disponible en todas partes y agrega complejidad a la lógica de carga diferida. Si quieres usarlo, debes revisarlo. Abajo de los programas Podrías usar Image.decode() con un resguardo:

var newImage = new Image();
newImage.src = "my-awesome-image.jpg";

if ("decode" in newImage) {
  // Fancy decoding logic
  newImage.decode().then(function() {
    imageContainer.appendChild(newImage);
  });
} else {
  // Regular image load
  imageContainer.appendChild(newImage);
}

Consulta este vínculo de CodePen para ver código similar al de este ejemplo en acción. Si la mayoría de las imágenes son bastante pequeñas, Esto puede no hacer mucho por ti, pero sin dudas puede ayudarte a reducir los bloqueos la carga diferida de imágenes grandes y su inserción en el DOM.

Cuando no se cargan los elementos

A veces, los recursos multimedia no se cargan por uno u otro motivo y se producen errores. de que ocurran cambios. ¿Cuándo podría suceder esto? Depende, pero hay una situación hipotética Tienes una política de almacenamiento en caché HTML durante un período breve (p.ej., cinco minutos) y el usuario visita el sitio o deja abierta una pestaña inactiva durante durante un período prolongado (p.ej., varias horas) y vuelve a leer el contenido. En algún punto de este proceso, se produce una reimplementación. Durante esta implementación, se nombre de recurso de imagen cambia debido al control de versiones basado en hash o se quitó por completo. Cuando el usuario carga lentamente la imagen, el recurso disponible y, por lo tanto, falla.

Si bien estos son casos relativamente inusuales, puede ser conveniente tener una copia de seguridad en caso de que la carga diferida falle. Para las imágenes, una solución de este tipo podría ser similar a esto:

var newImage = new Image();
newImage.src = "my-awesome-image.jpg";

newImage.onerror = function(){
  // Decide what to do on error
};
newImage.onload = function(){
  // Load the image
};

Lo que decidas hacer en caso de que se produzca un error dependerá de tu aplicación. Para ejemplo, podrías reemplazar el área del marcador de posición de la imagen con un botón que permita que el usuario intente cargar la imagen de nuevo o que simplemente muestre un mensaje de error en el área de marcador de posición de imagen.

También podrían surgir otras situaciones. Hagas lo que hagas, nunca es una mala idea una señal al usuario cuando se produce un error y, posiblemente, proporcionarle una acción realizar si algo sale mal.

Disponibilidad de JavaScript

No se debe suponer que JavaScript está siempre disponible. Si vas a imágenes de carga diferida, considera ofrecer lenguaje de marcado de <noscript> para que muestre imágenes en JavaScript no está disponible. El ejemplo de resguardo más simple posible implica Usar elementos <noscript> para publicar imágenes si JavaScript está desactivado:

Soy una imagen.

Si JavaScript está desactivado, los usuarios verán ambas imágenes: la imagen de marcador de posición y la imagen contenida con los elementos <noscript>. Para sortear esto, coloca Una clase de no-js en la etiqueta <html> de la siguiente manera:

<html class="no-js">

A continuación, coloca una línea de la secuencia de comandos intercalada en la <head> antes de las hojas de estilo. se solicitan a través de etiquetas <link> que quitan la clase no-js de <html>. si JavaScript está activado:

<script>document.documentElement.classList.remove("no-js");</script>

Por último, usa CSS para ocultar elementos con una clase diferida cuando JavaScript no está disponible:

.no-js .lazy {
  display: none;
}

Esto no impide que se carguen las imágenes de marcador de posición, pero el resultado es más lo ideal. Las personas que tienen JavaScript desactivado obtienen algo más que un marcador de posición imágenes, lo que es mejor que los marcadores de posición y no tiene contenido significativo de imágenes en todos.