Hace dos meses, buscar algo común en el marketplace, una bicicleta, por ejemplo, era un juego de adivinanzas. La barra lateral mostraba todas las categorías que tenemos, de arriba abajo, en forma de árbol. Elegías una, hacías scroll, llegabas a un callejón sin salida, volvías atrás, probabas la siguiente, y vuelta a empezar. La barra lateral describía nuestro catálogo, no tus resultados.

Eso nos molestaba. Así que desmontamos la barra lateral y la reconstruimos. Por el camino recortamos los bytes de cada foto del sitio, hicimos que la cabecera se aparte de tu vista mientras haces scroll, e incorporamos un puñado de pequeños trucos de navegador que se suman para lograr esa sensación de "aquí algo se siente diferente". Esto es el resumen.

−30%
Tamaño de imagen
A igual calidad visual, en cada foto del sitio.
Un clic
Afina tu búsqueda
Eligiendo una categoría del conjunto que coincide, no del catálogo.
0 px
Salto del modal
Abrir un modal ya no desplaza la página.

Imágenes más rápidas

Todas las imágenes pasan por nosotros. Los usuarios suben un JPEG de 4 MB de la mesa de su cocina; nosotros lo redimensionamos para las tarjetas de producto, las páginas de producto y las miniaturas, y servimos esas copias para siempre. La canalización se montó hace años y funcionaba, pero tenía dos problemas que habíamos estado ignorando.

Problema uno: estábamos conservando cada imagen en el formato en el que se había subido. El JPEG seguía siendo JPEG, el PNG seguía siendo PNG. Redimensionábamos de forma agresiva, pero nunca habíamos recodificado a un formato moderno más pequeño, dejando sin aprovechar aproximadamente un tercio de los bytes de cada foto.

Problema dos: el navegador no tenía ni idea de cuál era la imagen más importante en una página de producto. La gran imagen principal, las cuatro miniaturas a su lado, la fila de productos recomendados de abajo: todas se cargaban con la misma prioridad, compitiendo entre sí por la misma conexión. La imagen principal aparecía cuando le apetecía.

Ambos solucionables.

Un único formato para cada foto

Estandarizamos un único formato de imagen moderno en la entrada. Sea cual sea el formato que subas, JPEG, PNG, GIF animado, lo recodificamos al más pequeño. En el caso de los GIF animados conservamos el primer fotograma; las fotos de producto no son animaciones, y preferimos tener una imagen fija más ligera que un bucle pesado que nadie pidió.

La misma calidad visual. Alrededor de un 30% menos de bytes por imagen. Aplicado a cada nueva subida desde el primer día del sprint.

Decirle al navegador qué importa

Esta fue la mayor victoria. A los navegadores se les puede indicar cuál es la imagen más importante de una página, la "principal", para que la descarguen antes que todo lo demás. Añadimos estas indicaciones en tres lugares:

  • La imagen principal de una página de producto: prioridad máxima. Las miniaturas laterales explícitamente más bajas para que no compitan.
  • La primera fila de tarjetas en los feeds de inicio y de búsqueda: alta. Las filas por debajo del pliegue esperan a que hagas scroll hacia ellas.
  • Las imágenes decorativas (los pequeños iconos de categoría, etc.): baja, y cargadas solo bajo demanda.
High
Low
Low
Low
Low

The hero downloads first; thumbnails wait their turn.

Un error silencioso que detectamos por el camino

La galería de la página de producto elegía el tamaño de una foto según el orden en que el servidor las devolvía por casualidad, y no según el tamaño que realmente necesitaba. A veces la imagen principal era una miniatura de 300 píxeles; a veces una miniatura era la versión a resolución completa. Ahora una vista recién cargada "se siente" más nítida porque el tamaño correcto acaba en el lugar correcto.

Filtrado de búsqueda más inteligente

Volvamos al ejemplo de la bicicleta. Una búsqueda así cruza muchas categorías, bicicletas de adulto, bicicletas de niño, piezas, accesorios, y la antigua barra lateral no tenía ni idea de cuáles de ellas tenían resultados de verdad. Lo descubrías haciendo clic en cada una. La nueva barra lateral simplemente muestra el conjunto que coincide, con sus recuentos.

Filters
Search in title only
Categoría
Bicicletas de adulto
(64)
Bicicletas de niño
(22)
Piezas de bicicleta
(41)
Accesorios
(18)
Marca
Btwin
(31)
Trek
(14)
Specialized
(9)
Cube
(7)
Precio
€120€2 400

La misma idea se despliega para cada atributo que conocemos. Marca, color, talla, tamaño del cuadro, peso: si los resultados que coinciden tienen valores para él, ese atributo aparece en la barra lateral con casillas de verificación y recuentos.

Para los atributos numéricos (precio, peso, capacidad, etc.) reemplazamos los antiguos campos de "introduce un mínimo y un máximo" por un control deslizante cuyos límites coinciden con el rango real presente en los resultados. Si el anuncio más barato que coincide cuesta 120 €, el deslizante empieza en 120 €. Se acabó teclear un mínimo de 10 € cuando, de todas formas, ningún resultado es más barato que 120 €.

Barra lateral antigua

Árbol de categorías estático (cada nodo del catálogo). Campos de mín/máx vacíos para el precio. Sin saber qué categorías tenían resultados de verdad hasta hacer clic en ellas una por una.

Barra lateral nueva

Solo las categorías con resultados que coinciden, ordenadas por recuento. Selección múltiple para ampliar. Deslizante acotado por el mín/máx real de los anuncios que coinciden. La barra lateral es un mapa del conjunto de resultados, no un directorio del catálogo.

Cuando el conjunto de resultados está vacío

Un detalle más: si filtras de más y acabas con cero resultados, toda la barra lateral desaparece. No hay nada que afinar: las etiquetas de filtro y las casillas serían solo ruido visual. La página se reduce a un único botón "Borrar todos los filtros", centrado. Un clic y vuelves a donde la barra lateral puede ayudarte.

Una experiencia de navegación más pulida

Este sprint llegaron cinco pequeñas cosas que, juntas, cambian la sensación del sitio. Ninguna es una funcionalidad estrella; cada una es una o dos declaraciones de CSS. Están enumeradas según la frecuencia con la que un usuario típico se las encontrará.

La cabecera se aparta del camino

La barra de navegación blanca de la parte superior de cada página ahora se desliza hacia arriba y desaparece de la pantalla cuando haces scroll hacia abajo, y vuelve a aparecer cuando haces scroll hacia arriba: el clásico patrón de "la cabecera se aparta de mi camino mientras leo". Los navegadores que no soportan la funcionalidad subyacente simplemente mantienen la barra visible; nada se rompe.

Transiciones más fluidas de tarjeta → producto

Haz clic en una tarjeta de producto en el feed de inicio o de búsqueda y su imagen principal ahora se anima suavemente hasta su sitio en la página de detalle del producto, en lugar del antiguo corte brusco. El título, el precio y el botón de "me gusta" de la tarjeta hacen lo mismo. Es la diferencia entre una página que "se carga" y una que "se transforma".

Los títulos se ajustan mejor

Los títulos de producto, los títulos de tarjeta, los encabezados de sección: ninguno deja ya una palabra huérfana en la última línea. El navegador equilibra los saltos de línea por nosotros. Una declaración de CSS, aplicada en todo el sitio, visible al instante allá donde un título se ajusta.

Se acabó el salto horizontal al abrir los modales

Antes: abrías el modal para compartir, la página daba un tirón de 15 píxeles hacia la derecha al desaparecer la barra de desplazamiento, y todo lo de debajo se movía. Ahora: un margen reservado mantiene el espacio, esté o no la barra de desplazamiento. Los modales se abren sin que la página dé el tirón.

Cambios de idioma más rápidos

El formateo de fechas en tu idioma solía enviarse empaquetado junto con los datos de formateo de todos los demás idiomas soportados, unos 100 KB de datos de localización, aunque solo necesitaras uno. Ahora cargamos únicamente el idioma que estás usando. Paquete más pequeño, primer renderizado más rápido.

Limpieza interna

Un montón de pequeños ajustes que costaría notar individualmente, pero que aparecen como trazas más limpias en nuestros paneles de rendimiento. Ninguno cambió ningún comportamiento que pudieras ver. Las cifras destacadas:

−1 RTT
Handshake de la API
Conexión precalentada antes de que se dispare la primera petición.
en reposo
Init de analítica
Fuera de la ruta crítica; se ejecuta durante el tiempo de inactividad del navegador.
menos
Ruido de telemetría
Recortamos la frecuencia con la que se reportan los datos de diagnóstico.
auditoría
Revisión del paquete
Mapeamos los módulos pesados; los recortes quedan en cola para el próximo sprint.

Lo que no lanzamos (todavía)

Algunos elementos se empezaron pero no llegaron a este sprint:

  • Filtrado de atributos con varios valores. La interfaz acepta varios valores marcados por atributo (puedes marcar tres marcas), pero hoy solo se respeta uno en el lado del servidor. El próximo sprint.
  • Recálculo de facetas más inteligente. Ahora mismo, marcar "ASUS" elimina el resto de opciones de marca de la lista. La versión pulida vuelve a contar cada faceta excluyendo su propio filtro para que las opciones sigan visibles. Es factible; solo que la ruta de consulta es más costosa.
  • Imágenes AVIF. Aún más ligeras que las que servimos hoy. Suponen más trabajo de codificación en el lado del servidor; en pausa hasta que hagamos benchmarks.

Eso es todo por este sprint. La próxima publicación debería tratar sobre el trabajo que empezamos en los anuncios compartidos entre usuarios, discretamente la funcionalidad más solicitada del último trimestre, en cuanto esté lo bastante avanzado como para hablar de ello.