Apex-Barber-Studio

Publicado hace 13 días
•
36 vistas
Angular 21 TypeScript Tailwind CSS v4 Express.js RxJS Node.js Google GenAI Motion PostCSS
Portada completa de Apex-Barber-Studio

Problema Inicial: Latencia de Renderizado SSR y Sobrecarga por Detección de Cambios en Interacciones 3D

Cuando asumí el liderazgo técnico del proyecto para Apex Barber Studio en Barcelona, me enfrenté a un desafío complejo: la cliente requería una plataforma web interactiva de ultra lujo capaz de reflejar la sofisticación de su barbería de autor en Passeig de Gràcia. La visión de producto exigía experiencias inmersivas con tarjetas de servicios en perspectiva 3D, halos luminosos siguiendo el cursor del usuario, animaciones holográficas y un motor de reservas en tiempo real con integración directa a WhatsApp y Google Calendar. Sin embargo, los primeros prototipos presentaban severos problemas de rendimiento que comprometían drásticamente la experiencia del usuario final.

El problema principal residía en la sobrecarga del hilo principal del navegador. La ejecución recurrente de eventos de alta frecuencia como mousemove y touchmove sobre múltiples elementos del DOM provocaba que el motor tradicional de detección de cambios de Angular reevaluara continuamente la totalidad del árbol de componentes. Esto se traducía en caídas drásticas de la tasa de cuadros por segundo (cayendo por debajo de los 24 FPS en dispositivos móviles) y un efecto de parpadeo perceptible durante el desplazamiento. Asimismo, el renderizado desde el servidor (SSR) experimentaba latencias elevadas al procesar peticiones simultáneas de verificación de disponibilidad de turnos, lo que elevaba el tiempo de respuesta del servidor (TTFB) por encima de los 850 milisegundos. Sabía que para ofrecer una experiencia digna de un establecimiento de alta gama debía reestructurar por completo la arquitectura de software.

Arquitectura de Solución: Un Ecosistema Zoneless en Angular 21, Server-Side Rendering con Express 5 y Tailwind CSS 4

Para resolver la fricción de rendimiento y garantizar una escalabilidad sin concesiones, diseñé e implementé una arquitectura moderna desvinculada de la detección de cambios global. Decidí adoptar la última versión de Angular 21 operando en modo completamente Zoneless, sustituyendo el monitoreo por zona por un flujo reactivo fino fundamentado exclusivamente en Signals de Angular y operadores de RxJS. Esta decisión me permitió aislar las actualizaciones del estado de la aplicación, garantizando que el motor de renderizado solo reaccione exactamente ante la mutación explícita de datos aislados.

En el backend, configuré un servidor Express 5 sobre Node.js 20 adaptado para ejecutar Server-Side Rendering (SSR) híbrido con hidratación progresiva. Este servidor se encarga de servir el HTML presincronizado con metadatos SEO optimizados y gestionar la comunicación asíncrona con la API de Google GenAI mediante el paquete @google/genai para futuras recomendaciones personalizadas. Para la capa de diseño y estilos, integré la nueva generación de Tailwind CSS v4 con PostCSS, utilizando propiedades CSS nativas y variables dinámicas para trasladar los cálculos matemáticos de las transformaciones 3D directamente a la GPU del dispositivo cliente, liberando por completo el hilo de ejecución de JavaScript.

Retos de Implementación: El Obstáculo más Difícil (Matemática de Inclinación 3D en Tiempo Real sin Bloquear el Hilo Principal)

El desafío técnico más exigente que resolví durante el desarrollo fue la implementación del efecto de inclinación 3D (3D Tilt Perspective) y el halo luminoso (Mouse & Touch Spotlight) en las tarjetas de la galería y lista de barberos. El requisito dictaba que las tarjetas debían rotar suavemente en los ejes X e Y calculando el punto exacto de contacto del cursor o del dedo del usuario en pantallas táctiles, generando un reflejo metálico holográfico en tiempo real. Si asociaba esta lógica a bindings estándar de Angular, el rendimiento colapsaba instantáneamente.

Para superar este obstáculo de ingeniería, implementé una directiva personalizada que interactúa directamente con el DOM utilizando la API requestAnimationFrame de forma completamente desvinculada de la detección de cambios. Capturé las coordenadas del evento PointerEvent, calculé los ángulos de inclinación basados en las dimensiones del elemento y actualicé variables CSS personalizadas (--tilt-x, --tilt-y, --spotlight-x, --spotlight-y) aplicadas directamente al estilo del nodo HTML. De este modo, la animación se procesa de forma nativa a 60 FPS mediante aceleración por hardware en la GPU sin activar un solo ciclo de renderizado en Angular.

A continuación, presento la estructura del manipulador conceptual en TypeScript/JavaScript que diseñé para resolver este reto de rendimiento interactivo:

// Controller de alta optimización para cálculo de matriz 3D y halo luminoso
import { Injectable, ElementRef, Renderer2 } from '@angular/core';
import { fromEvent, Subject } from 'rxjs';
import { takeUntil, throttleTime } from 'rxjs/operators';

@Injectable({ providedIn: 'root' })
export class TiltPerspectiveController {
  private destroy$ = new Subject

Resultados de Rendimiento: Rendimiento Fluido a 60 FPS y Tiempos de Carga Sub-100ms

Gracias a la reingeniería completa de la arquitectura web y la adopción del modelo Zoneless en Angular 21, logré transformar una experiencia pesada en un producto digital de ultra rendimiento. La eliminación de Zone.js redujo el tamaño final del bundle de JavaScript en un 18%, mientras que el tiempo hasta la primera interacción (TTI) disminuyó drásticamente en dispositivos móviles.

Los resultados cuantitativos alcanzados tras la optimización fueron altamente satisfactorios:


Este proyecto demuestra cómo la elección adecuada de patrones reactivos y la delegación de responsabilidades a la GPU pueden elevar la calidad técnica de un producto web comercial a estándares de nivel internacional.

Ver Código Fuente
Volver a Proyectos