Escalar con tecnología:
Arquitectura Frontend: RTK Query, Zustand, Hooks
En el ciclo de vida del desarrollo de software, escribir el código es solo el comienzo. El verdadero desafío, especialmente en sistemas empresariales complejos, reside en el mantenimiento y la evolución constante. Cuando una aplicación crece, lo que funcionaba para un MVP (Producto Mínimo Viable) deja de ser sostenible: los componentes se vuelven gigantescos, la gestión del estado se enreda y cada nueva funcionalidad introduce el riesgo de romper algo existente.

Desde nuestra área de I+D, hemos analizado este escenario para redefinir nuestra arquitectura frontend. No buscamos simplemente adoptar nuevas tendencias, sino resolver un problema estructural:
¿Cómo construimos sistemas que puedan escalar indefinidamente sin volverse inmanejables?
La respuesta no está en una sola librería, sino en la aplicación rigurosa de principios de diseño como SOLID, específicamente el Principio de Responsabilidad Única (SRP), y una clara separación entre los diferentes tipos de estado que maneja una aplicación.
El problema de la arquitectura monolítica en el frontend
Tradicionalmente, muchas aplicaciones React han adoptado un enfoque monolítico implícito. Vemos componentes que acumulan responsabilidades: renderizan la UI, llaman a la API, transforman datos y gestionan el estado de los formularios, todo en el mismo archivo.
A esto se suma el uso de herramientas como Redux para absolutamente todo. Si bien Redux es extremadamente robusto, usarlo para estados triviales de UI (como abrir un modal) o para cachear respuestas de API genera una cantidad innecesaria de boilerplate y complejidad.
Las consecuencias de este enfoque en sistemas vivos son claras:
Un nuevo paradigma: modularidad y especialización
Para superar estas barreras, nuestra propuesta arquitectónica desacopla estrictamente las capas de la aplicación. Entendemos que la Interfaz de Usuario (UI) debe ser un mero reflejo de los datos, sin responsabilidad sobre cómo se obtienen o procesan esos datos.
Especialización del estado: Server State vs. Client State
Un pilar fundamental de esta arquitectura es distinguir entre los tipos de datos que operan en la aplicación:
- Server State (datos del servidor): Son datos persistentes y remotos. Para su gestión, implementamos RTK Query. Esta herramienta automatiza la gestión de caché, reintentos y sincronización, eliminando el código manual y propenso a errores asociado a las peticiones asíncronas.
- Client State (estado de UI): Son estados volátiles, propios de la sesión del usuario (filtros, menús, formularios). Para esto, adoptamos Zustand. Su API minimalista permite gestionar estos cambios de forma rápida y ligera, sin el «boilerplate» excesivo de soluciones anteriores.
El patrón de ingeniería: Custom Hooks y Contextos
A nivel de código, aplicamos el SRP extrayendo sistemáticamente la lógica de negocio hacia Custom Hooks.
¿Cómo se estructura esto en un módulo complejo? Tomemos como ejemplo un gestor de operaciones críticas:
- La Lógica (useModuleList): Un custom hook actúa como el controlador. Encapsula las llamadas a la API, la gestión de errores, la paginación y las reglas de negocio. Retorna datos puros y funciones de acción.
- La Presentación (Componente UI): Recibe los datos procesados y se limita a renderizarlos. Es un componente funcional puro que ignora la complejidad subyacente.
La Distribución (Context API): Para evitar la complejidad de pasar datos manualmente por múltiples niveles (prop drilling), utilizamos contextos que inyectan la lógica del hook y la disponibilizan en todo el árbol de componentes del módulo.