alanbuendia.dev
← Blog

2 min de lectura

De 4.2s a 1.1s: optimizar para el hardware que la gente sí tiene

PerformanceReactNext.js

El rendimiento no es una métrica de vanidad. Cuando construí Kybernet — una plataforma multi-tenant para negocios pequeños mexicanos — la carga promedio era de 4.2 segundos. En mi laptop de desarrollo se sentía bien. En la computadora de una barbería con 4 GB de RAM y Chrome con quince pestañas abiertas, era el momento exacto en que el usuario cerraba la página.

El rendimiento es UX: en hardware modesto, 3 segundos ahorrados deciden si la herramienta se usa.

Primero medir, nunca adivinar

Antes de tocar una línea, abrí el panel de Performance y un throttling de CPU 4x con red 'Fast 3G'. Simular el equipo real cambia todo: el bundle de JavaScript que en fibra tardaba 200 ms bloqueaba el hilo principal casi dos segundos. El cuello de botella no era la red — era el parseo y ejecución de JS.

1. Code splitting por ruta

El error clásico: todo el panel de administración viajaba en el bundle inicial, aunque el 90% de las sesiones nunca lo abría. Moví cada vista pesada detrás de un import dinámico, con un fallback ligero mientras carga.

tsx
// Antes: todo en el bundle inicial
import AdminDashboard from "./AdminDashboard";

// Después: se carga solo cuando se necesita
const AdminDashboard = lazy(() => import("./AdminDashboard"));

<Suspense fallback={<PanelSkeleton />}>
  <AdminDashboard />
</Suspense>

2. Assets: el peso invisible

  • Imágenes servidas en WebP con tamaños responsivos en vez de PNG de 1 MB.
  • Fuentes con display: swap y subsetting — solo los caracteres latinos que uso.
  • Íconos como SVG inline, no una librería de 300 KB por tres glifos.

Anécdota real de este mismo portafolio: encontré un favicon.png de 954 KB. Un favicon. Regenerado desde su SVG quedó en 11 KB. Nadie lo nota hasta que auditas — y esos detalles son exactamente lo que separa un sitio que 'se siente rápido' de uno que lo es.

3. No bloquear el render

Lo último fue orden de carga: datos críticos primero, todo lo demás después del primer pintado. El realtime de Supabase, los gráficos y la analítica se suscriben tras montar, no antes. El usuario ve la interfaz utilizable mientras lo secundario llega en segundo plano.

El resultado

Carga promedio de 4.2s a 1.1s en el mismo hardware de gama baja. Ninguna reescritura mágica — solo medir el equipo real, partir el bundle, adelgazar los assets y ordenar la carga. La lección que me quedó: optimiza para la peor máquina de tu usuario, no para la mejor de tu escritorio.

Proyecto relacionado

Kybernet.MX