Cuando auditamos una web y vemos que el score de velocidad está entre 45 y 65 sobre 100, las causas son casi siempre las mismas. Antes de tocar una línea de código o cambiar de hosting, comprobamos tres cosas: si las imágenes están en WebP, si hay Cache-Control configurado, y si las imágenes fuera del viewport están con lazy load. En el 70% de los casos, corregir estas tres cosas sube el score entre 8 y 15 puntos.
No son cambios mágicos ni complejos. Son correcciones técnicas básicas que la mayoría de webs no tienen aplicadas porque nadie se ha sentado a hacerlas.
WebP es un formato de imagen desarrollado por Google que ofrece compresión superior a PNG y JPEG manteniendo una calidad visual prácticamente idéntica para el ojo humano. La diferencia de tamaño es significativa:
Ese es el caso real de AC Clima Málaga, donde la imagen hero pasó de 2,3 MB a 192 KB después de la conversión. Para el usuario en móvil con conexión 4G normal, eso supone la diferencia entre una página que carga en 1,2 segundos y una que carga en 4,5 segundos.
La implementación correcta usa el elemento <picture> con un fallback en PNG o JPEG para navegadores que no soporten WebP (aunque actualmente representa menos del 2% del tráfico):
<picture>
<source srcset="imagen.webp" type="image/webp">
<img src="imagen.jpg"
alt="Descripción de la imagen"
width="1200" height="600"
fetchpriority="high"> ← solo en la imagen hero
</picture>Los atributos width y height son obligatorios — sin ellos el navegador no puede reservar el espacio antes de cargar la imagen, lo que causa el Cumulative Layout Shift (CLS), una de las Core Web Vitals que Google penaliza.
Sin Cache-Control, cada vez que un usuario visita una página su navegador descarga todos los recursos desde cero: HTML, CSS, imágenes, fuentes. Con Cache-Control configurado correctamente, en las visitas siguientes el navegador carga los recursos que no han cambiado desde su caché local — lo que puede reducir el tiempo de carga de una segunda visita en un 80%.
Para webs desplegadas en Cloudflare Pages, la configuración se hace con un archivo _headers en la raíz del proyecto:
# Archivo _headers en Cloudflare Pages
/web-cliente
Cache-Control: public, max-age=3600, stale-while-revalidate=86400
/assets/*
Cache-Control: public, max-age=31536000, immutableLa lógica es: para el HTML principal (max-age=3600, 1 hora) el caché es corto porque el contenido puede cambiar. Para los assets estáticos como imágenes, CSS y JS (max-age=31536000, 1 año), el caché es largo porque si cambia el archivo se cambia también el nombre del archivo. El parámetro stale-while-revalidate hace que mientras se actualiza en background el usuario siga viendo la versión cacheada sin esperar.
El lazy load hace que las imágenes que están fuera del viewport (la parte visible de la pantalla) no se carguen hasta que el usuario se aproxima a ellas con el scroll. En una página con 10 imágenes, sin lazy load el navegador intenta descargar las 10 a la vez al cargar la página. Con lazy load, carga solo las 2-3 del viewport inicial y aplaza el resto.
La implementación nativa (sin JavaScript) es un solo atributo:
<!-- Imagen hero: NO lazy load (debe cargar inmediatamente) -->
<img src="hero.webp" fetchpriority="high" alt="...">
<!-- Resto de imágenes: lazy load + decoding async -->
<img src="producto.webp"
loading="lazy"
decoding="async"
width="500" height="500"
alt="Descripción del producto">Error frecuente: Añadir loading="lazy" a la imagen hero. Esto hace que la imagen más importante de la página tarde más en aparecer, empeorando el LCP (Largest Contentful Paint). La imagen hero debe cargarse con la máxima prioridad — fetchpriority="high" — nunca con lazy load.
Aplicadas juntas en una web que partía de 58/100 en PageSpeed Insights móvil, obtuvimos los siguientes resultados tras implementar las tres:
Tiempo de implementación: 45 minutos. No hubo cambios de hosting, ni refactorización de código, ni librerías nuevas. Solo estas tres correcciones.
Analizamos tu web y te decimos exactamente qué optimizaciones tienen mayor impacto en tu caso concreto.
Solicitar análisis técnico →