¿Qué es el Lazy Loading?
Aplaza la carga de recursos no críticos hasta que se necesitan. El navegador obtiene imágenes, iframes y JS al hacer scroll. Mejora LCP y ancho de banda.
¿Qué es el lazy loading?
El lazy loading es un patrón de rendimiento que aplaza la carga de recursos no críticos hasta que realmente se necesitan — típicamente cuando el recurso está a punto de aparecer en el viewport. En lugar de obtener cada imagen, iframe y bundle de JavaScript por adelantado, el navegador carga solo lo inmediatamente visible y trae el resto bajo demanda.
El beneficio para el usuario es directo: las páginas se renderizan más rápido porque el navegador tiene menos que descargar antes del primer paint. El beneficio técnico es más interesante: el lazy loading mueve trabajo fuera del camino crítico, lo que mejora directamente Largest Contentful Paint (LCP), Total Blocking Time (TBT) y costes de ancho de banda. Los usuarios móviles en conexiones lentas sienten esto más.
Los cuatro tipos de lazy loading que realmente usarás
1. Lazy loading nativo de imágenes (la victoria fácil)
Los navegadores modernos (Chrome 76+, Safari 15.4+, Firefox 75+) soportan un atributo nativo que aplaza imágenes fuera de pantalla:
<img src="hero.jpg" loading="lazy" alt="..." width="800" height="600">Esta es la optimización más barata y de mayor palanca en la web. Un atributo, ~70% de los usuarios cubiertos, sin JavaScript requerido. Los atributos width/height son críticos — sin ellos, las imágenes con lazy loading causan layout shifts (Cumulative Layout Shift) cuando finalmente cargan.
Advertencia crítica: no apliques lazy loading a imágenes above-the-fold, especialmente la imagen LCP. Aplicar lazy loading a la imagen hero hace LCP peor, no mejor, porque añade un paso extra de decisión del navegador antes de que se obtenga el elemento LCP.
2. Lazy loading nativo de iframes
El mismo atributo, aplicado a iframes:
<iframe src="https://youtube.com/embed/..." loading="lazy"></iframe>Esto importa más para páginas con vídeos de YouTube embebidos, mapas o widgets de terceros — cada iframe descarga cientos de KB y docenas de subpeticiones. Aplicarles lazy loading puede recortar el peso inicial de página en megabytes.
3. Lazy loading de módulos JavaScript (code splitting basado en rutas)
Las single-page apps usan import() dinámico para cargar código específico de ruta bajo demanda:
const Settings = lazy(() => import('./Settings'));El bundle de la página de configuración no se obtiene hasta que el usuario navega allí. Combinado con splitting basado en rutas en webpack, Vite o Rollup, esto mantiene el bundle JS inicial pequeño. Sin esto, cada ruta SPA va en el bundle inicial, lo que daña TTI en cada página.
4. Lazy loading personalizado basado en IntersectionObserver
Para cosas que el lazy loading nativo no cubre — scripts de terceros, players de vídeo personalizados, componentes complejos — IntersectionObserver te permite disparar trabajo cuando un elemento se acerca al viewport:
const obs = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
loadComponent(entry.target);
obs.unobserve(entry.target);
}
});
}, { rootMargin: '200px' });El truco rootMargin: '200px' pre-obtiene recursos 200px antes de que entren al viewport, así el usuario raramente ve un flash de carga. Así es como las implementaciones de lazy load maduras se sienten ágiles en lugar de janky.
Lo que el lazy loading realmente te aporta (números)
Números reales de sitios de producción que hemos medido:
- Páginas pesadas en imágenes: 40-70% de reducción en bytes iniciales cuando se aplazan imágenes below-fold.
- Mejora de LCP: 200-1500ms en páginas donde el elemento LCP competía con imágenes aplazadas-pero-no-lazy. El preload scanner del navegador deja de pelear por ancho de banda.
- Reducción del bundle inicial SPA: 50-80% con code splitting basado en rutas. Un bundle monolítico de 3MB se vuelve un bundle inicial de 600KB más chunks por ruta.
- Ahorros de datos móviles: Los usuarios que rebotan antes de hacer scroll nunca descargan contenido below-fold. Para sitios de noticias/blog con altas tasas de rebote, esto es significativo tanto para ingresos sostenidos por publicidad como para la buena voluntad del usuario.
Errores comunes de lazy loading
- Aplicar lazy loading a la imagen LCP. El mayor error individual. Usa
fetchpriority="high"en la imagen hero y reservaloading="lazy"para contenido below-fold. Ejecuta un test de velocidad para ver qué imagen es tu elemento LCP. - Olvidar atributos width/height. Las imágenes con lazy loading sin dimensiones explícitas causan layout shifts cuando cargan. Las regresiones de CLS dañan tu puntuación de Core Web Vitals.
- Aplicar lazy loading demasiado agresivamente. Configurar
rootMargin: '0px'o sin margen causa un flash de espacio vacío cuando el contenido entra. Usa un buffer de 200-500px. - Aplicar lazy loading a fuentes críticas. Las fuentes personalizadas en tu camino de renderizado inicial no deberían aplazarse. Usa
font-display: swapy preload la fuente crítica en su lugar. - Confundir lazy loading con rendimiento. El lazy loading aplaza trabajo; no lo elimina. Si tus scripts below-fold son lentos, aplicarles lazy loading solo retrasa la lentitud en lugar de arreglarla.
- Usar librerías JavaScript cuando lo nativo funciona. Si tu audiencia está en navegadores modernos (95%+ ahora), el atributo nativo
loading="lazy"supera cada librería de lazy load JavaScript. Menos código, menos bugs, sin librería que mantener.
Lazy loading y SEO
Los motores de búsqueda renderizan JavaScript, pero no hacen scroll infinito. Si tu contenido está bloqueado detrás de lazy loading que requiere hacer scroll para activarse, Google puede que nunca lo vea. Mejores prácticas:
- Usa
loading="lazy"nativo para imágenes — Googlebot lo maneja correctamente. - Para contenido que debe ser indexado, renderízalo en el servidor. No apliques lazy loading a body copy.
- Para contenido de carousel/tabs, renderiza todos los paneles en HTML y usa CSS para ocultar los no activos. No apliques lazy loading al contenido de tabs vía JavaScript o no será indexado.
- Para infinite scroll, proporciona enlaces de paginación como fallback para que los crawlers puedan seguirlos.
Probando el lazy loading
Tres herramientas para verificar que el lazy loading funciona:
- Pestaña Network de Chrome DevTools. Recarga la página. Deberías ver imágenes NO en la cascada inicial, luego cargando mientras haces scroll.
- Lighthouse / PageSpeed Insights. La auditoría "Defer offscreen images" captura oportunidades perdidas.
- Testing en dispositivo real. Limita tu conexión a Slow 4G en DevTools y confirma que la página es usable antes de que llegue el contenido below-fold.
FAQ: Lazy Loading
¿Debería usar loading="lazy" en cada imagen?
No. Las imágenes above-the-fold, especialmente tu elemento LCP, NO deberían tener lazy loading. Usa fetchpriority="high" en imágenes críticas y reserva el lazy loading para contenido below-fold.
¿El lazy loading daña el SEO?
No cuando se implementa correctamente. loading="lazy" nativo es completamente soportado por Googlebot. El lazy loading personalizado basado en IntersectionObserver también está bien para imágenes. Evita aplicar lazy loading al texto del cuerpo o contenido crítico a menos que tengas un fallback renderizado en servidor.
¿Cuál es el soporte del navegador para lazy loading nativo?
Excelente — Chrome 76+, Edge 79+, Firefox 75+, Safari 15.4+, todos los cuales representan ~95%+ de los usuarios globales en 2026. Los usuarios de Safari más antiguos obtienen todas las imágenes cargadas inmediatamente, lo cual es una degradación elegante en lugar de una experiencia rota.
¿En qué se diferencia el lazy loading del code splitting?
El code splitting es el proceso en tiempo de build de romper tu bundle en chunks. El lazy loading es la decisión en tiempo de ejecución de obtener un chunk solo cuando se necesita. Los bundlers modernos hacen ambos — dividen tu código Y configuran llamadas dinámicas import() para que los chunks carguen bajo demanda.
¿Puede el lazy loading hacer que las páginas se sientan más lentas?
Sí, si está mal implementado. Los flashes de carga, layout shifts y contenido faltante durante el scroll todos dañan el rendimiento percibido. Usa rootMargin para pre-obtener temprano, configura dimensiones explícitas en las imágenes y UI esqueleto/placeholder para componentes que tardan en cargar.
¿Qué hay del lazy loading de imágenes de fondo en CSS?
Las imágenes de fondo CSS no soportan lazy loading nativo. O las inserta como <img> con loading="lazy" (mejor), usa IntersectionObserver para añadir el estilo background-image al hacer scroll, o acepta que todos los fondos cargan por adelantado.
Cómo LoadFocus mide el impacto del lazy loading
Las optimizaciones de lazy loading aparecen en métricas del mundo real. Ejecuta un test de velocidad de sitio web para ver qué imágenes son elegibles para lazy loading y confirma que tu elemento LCP está priorizado correctamente. Usa pruebas de carga para validar que tus páginas siguen rindiendo bien bajo alto tráfico concurrente — a veces el lazy loading mueve trabajo para ser disparado por comportamiento del usuario de formas que cambian tus patrones de tráfico backend.
Herramientas LoadFocus relacionadas
Lleva este concepto a la práctica con LoadFocus — la misma plataforma que potencia todo lo que acabas de leer.