Saltar al artículo
ProductoRendimiento

sifg.net · Detrás de la web

Cómo hicimos más rápida sifg.net

Medimos antes de tocar nada, encontramos trabajo oculto en cada clic y lo arreglamos paso a paso. Te contamos cada mejora, cómo la descubrimos y cómo comprobamos que funcionaba.

Un velocímetro blanco con la aguja casi al máximo sobre un degradado rosa y violeta
Medir primero, arreglar después.sifg.net
Por el equipo de SifG22 10 min de lectura

Los resultados, de un vistazo

La misma web.
Menos espera.

Nuestra web es estática. Las páginas se generan ya terminadas antes de publicarlas, está desplegada en Cloudflare y está disponible en 8 idiomas: las traducciones se generan al compilar (es decir, al preparar la web para publicarla) a partir de las páginas en español.

Para hacerla más rápida partimos de tres ideas: medir antes de tocar nada; buscar «navegaciones ocultas», el trabajo que no ves pero que te cuesta tiempo; y adelantarse a lo que vas a abrir.

Lo hicimos en una sola sesión de trabajo. Cada mejora va contada igual: el problema, cómo lo descubrimos, el arreglo y cómo lo comprobamos. Al final están las cifras.

01 / Antes de empezar

Una red de seguridad y una lupa

Primero, poder volver atrás

Antes de cambiar nada creamos una copia de seguridad de la web, para poder volver atrás en cualquier momento, y guardamos una compilación de la versión anterior para compararla después con la nueva en las mismas condiciones.

Qué miramos

Revisamos la web publicada y su compilación con herramientas sencillas y tres preguntas:

  • ¿Qué dicen las cabeceras HTTP? Son los datos que el servidor envía con cada archivo: por ejemplo, si el navegador puede guardarlo o debe ir a otra dirección.
  • ¿Cuánto pesa cada página y qué lleva dentro?
  • ¿Con qué dominios se conecta el navegador para cargar una página?

Salieron cinco problemas. Ninguno era grave, pero todos se repetían en cada visita.

02 / Navegación oculta n.º 1

El rodeo invisible de cada clic

El problema

Una redirección es un desvío: pides una dirección y el servidor responde «ve a esta otra», lo que obliga a una segunda petición. Nuestros enlaces internos apuntaban a /productos/lumen, pero el servidor tenía la página en /productos/lumen/, con una barra al final.

Cómo lo descubrimos

Al revisar las cabeceras de la web real vimos que cada clic interno pasaba primero por una redirección de entre 90 y 140 milisegundos. Nadie lo notaba, pero se pagaba en todas las navegaciones: una navegación oculta de manual.

El arreglo

Cambiamos cómo se generan las páginas. Ahora cada una es un archivo (lumen.html) en vez de una carpeta con un index.html dentro, y el servidor la entrega en la misma dirección a la que enlazamos. Las direcciones antiguas con barra final siguen funcionando, así que no se rompen marcadores ni resultados de buscadores.

03 / Navegación oculta n.º 2

La página que llegaba dos veces

El problema

Si tu navegador estaba en otro idioma, la web cargaba primero la página en español y después saltaba a la traducida: dos cargas para ver una sola página. Además, el script que decidía el salto esperaba a que se descargaran estilos y fuentes.

Cómo lo descubrimos

En el mismo repaso: cada entrada empezaba descargando una página que el visitante no iba a leer.

El arreglo

Ahora decide el servidor. Una pequeña función en Cloudflare mira tu elección guardada o el idioma de tu navegador y te envía a la versión correcta antes de mandar un solo byte de la página en español. Solo se ejecuta en las páginas que lo necesitan, no con cada imagen. Siempre respeta una dirección que ya lleva idioma y no redirige a los buscadores.

El script del navegador queda como red de seguridad, ahora al principio del documento, para decidir antes de pedir estilos, fuentes o imágenes.

04 / Trabajo repetido n.º 1

Archivos que nunca cambian, pedidos una y otra vez

El problema

La caché es la memoria del navegador: guarda archivos ya descargados para no volver a pedirlos. Nosotros le decíamos «no guardes nada» para todo.

Incluso los archivos CSS (estilos) y JavaScript (código) cuyo nombre lleva un hash, una huella calculada a partir del contenido: si el contenido cambia, cambia el nombre, así que esos archivos nunca cambian. Aun así, el navegador volvía a pedirlos en cada página.

Cómo lo descubrimos

Estaba escrito en las cabeceras HTTP de todos los archivos.

El arreglo

Cada tipo de archivo tiene ahora la memoria que le corresponde:

  • Archivos con hash y fuentes: un año, marcados como inmutables.
  • Imágenes: un día. Después se muestran al momento mientras se comprueba en segundo plano si cambiaron (stale-while-revalidate).
  • HTML: se sigue revisando en cada visita, así que cualquier cambio de contenido se ve al instante.

05 / Trabajo repetido n.º 2

25 KB de código copiados en cada página

El problema

Unos 25 KB de JavaScript (el menú, el buscador y el cambio de tema claro/oscuro) iban dentro del HTML de cada página, en los 8 idiomas. Viajaba de nuevo con cada página en vez de vivir en un archivo que el navegador reutiliza.

Cómo lo descubrimos

Aquí medir nos corrigió a nosotros. Nuestra primera sospecha sobre el peso del HTML fue el índice del buscador. Al medirlo, vimos que solo ocupaba 4 KB: el resto era código.

El arreglo

Movimos ese JavaScript a un archivo aparte que el navegador guarda en caché entre páginas. Los textos que se traducen, como «Sugerencias» o «1 resultado», siguen dentro de la página para que el sistema de traducción los encuentre. Y salió un extra: un texto que nunca se traducía ahora sí se traduce.

06 / Trabajo repetido n.º 3

Una tipografía que venía de fuera

El problema

La tipografía Inter venía de Google Fonts: dos dominios externos y una hoja de estilos que retrasaba el primer pintado, el momento en que aparece algo en pantalla.

Cómo lo descubrimos

Lo vimos al listar los dominios a los que se conectaba cada página.

El arreglo

Ahora servimos Inter desde nuestro propio dominio, en su versión variable: un solo archivo que contiene todos los pesos, de la fina a la negrita. Y precargamos (pedimos cuanto antes) la parte que usan nuestros idiomas.

07 / Adelantarse

Preparar la página antes del clic

La idea

Quedaba la tercera idea: adelantarse. Prerenderizar es preparar una página entera (descargarla y dibujarla) en segundo plano, antes de que la abras. Si aciertas, al hacer clic ya está lista.

El arreglo

Usamos Speculation Rules, un estándar web: un bloque de reglas en JSON dentro de la página, sin librerías. Simplificado, es esto:

<script type="speculationrules">
{
  "prerender": [{
    "where": { "href_matches": "/*" },
    "eagerness": "moderate"
  }]
}
</script>

Con "eagerness": "moderate", la página de destino se prepara cuando el ratón se queda un momento sobre un enlace interno, o cuando empiezas a tocarlo en el móvil. Excluimos los enlaces a archivos, como descargas o imágenes, y los que abren una pestaña nueva.

Antes comprobamos que la web no carga analítica, que podría contar visitas falsas por páginas preparadas que nadie abre.

Funciona en los navegadores basados en Chromium, el motor en el que se apoyan Chrome, Edge y otros. Safari y Firefox ignoran las reglas sin que se rompa nada.

08 / Medir para no arreglar

Lo que decidimos dejar como estaba

Pensábamos añadir medidas a las imágenes para que el contenido no se moviera al cargar. Ese movimiento se mide con el CLS (Cumulative Layout Shift, o desplazamiento acumulado del diseño): cuanto más cerca de 0, más quieta está la página.

Las mediciones dieron entre 0,003 y 0,01. Las imágenes ya van en contenedores de proporción fija que les reservan su hueco, así que lo dejamos como estaba. Medir también sirve para saber qué no hay que tocar.

09 / Bonus

Publicar también es más rápido

El problema

Cada despliegue (cada publicación de una versión nueva) tardaba unos 4 minutos.

Cómo lo descubrimos

Reprodujimos el problema clonando el proyecto desde cero: en cada despliegue se volvían a convertir 79 imágenes a AVIF y WebP, dos formatos modernos que ocupan menos.

Al clonar un proyecto, Git (la herramienta con la que guardamos el historial del código) pone a cada archivo como fecha de modificación el momento en que lo escribe. El script, al comparar fechas, creía que todas las imágenes estaban desactualizadas.

El arreglo

En el servidor de compilación solo se generan las imágenes que faltan.

10 / Método

Cómo comprobamos que funcionaba

Una mejora sin comprobar es solo una suposición. Nuestro método:

  • Servimos en local la versión anterior y la nueva con Wrangler, la herramienta de Cloudflare que imita su entorno de producción, cabeceras de caché y función de servidor incluidas.
  • Pasamos Lighthouse, la herramienta de Google que analiza la velocidad de una página, en móvil con 4G simulado: 3 pasadas por página y la mediana (el valor del medio, que ignora una pasada extraña).
  • Medimos el paso de una página a otra con la caché llena y 4G simulado: 5 pasadas y, de nuevo, la mediana.
  • Hicimos pruebas funcionales en Chrome y de la redirección de idioma.

También descartamos lo que no era fiable. El «tiempo de bloqueo» de Lighthouse variaba de 0 a más de 1.000 ms entre pasadas idénticas, tanto en la versión antigua como en la nueva. Con ese ruido no lo usamos, ni damos una puntuación global.

11 / Las cifras

Los resultados

Dos términos antes de la tabla. El primer contenido visible es el momento en que aparece el primer texto o imagen. El elemento principal, o LCP (Largest Contentful Paint), es cuándo se pinta el elemento más grande de la pantalla, normalmente la imagen o el titular. Medidas de laboratorio, en móvil con 4G simulado.

Antes y después de los cambios. Móvil con 4G simulado; mediana de 3 pasadas (5 en el cambio de página).
MedidaAntesDespués
Primer contenido visible, portada3,2 s2,0 s−38 %
Primer contenido visible, página de producto (Lumen)3,0 s2,1 s−30 %
Primer contenido visible, página de descarga3,1 s2,2 s−28 %
Elemento principal (LCP), página de producto3,0 s2,3 s−24 %
Elemento principal (LCP), página de descarga3,1 s2,4 s−22 %
Pasar de una página a otra (caché llena)770 ms518 ms−33 %
Peticiones al servidor en ese cambio de página73
Dominios contactados para cargar una página31
Tamaño del HTML de la portada92 KB68 KB
Paso de imágenes en cada despliegue1 min 25 s0,6 s

Además, con el prerender activo, el cambio de página debería ser prácticamente instantáneo en Chrome y Edge, aunque no pudimos medirlo con una cifra.

12 / Siendo honestos

Lo que aún nos queda

  1. La imagen principal de la portada sigue tardando en móviles con conexión lenta. El siguiente paso es servir imágenes más pequeñas en el móvil.

  2. Entrar sin «www». Queremos que quien escribe el dominio sin «www» llegue sin pasar por redirecciones intermedias.

  3. Medir con usuarios reales. Todas nuestras cifras son de laboratorio. Queremos medir también con visitas reales, con una herramienta que no use cookies.

La lección

Medir primero.
Arreglar lo que dicen los datos.

Lo que nos llevamos es un orden: medir primero, arreglar lo que los datos señalan (y no lo que creíamos), comprobar que la mejora es real y contar también lo que no ha funcionado o queda pendiente.

Una barra al final de una dirección costaba tiempo en cada clic, el peso no estaba en el buscador y las imágenes no necesitaban arreglo. Seguiremos midiendo.

Visitar sifg.net ← Volver a las noticias