Arquitectura SPA con React 19 & IA Generativa
El Desafío
Desarrollar una Single Page Application (SPA) de portfolio profesional que integrara capacidades de inteligencia artificial generativa sin comprometer la performance inicial del sitio. Los requisitos técnicos incluían:
- Tiempo de carga inicial < 2 segundos (First Contentful Paint)
- Integración de Gemini AI para asistencia contextual
- Navegación fluida sin recargas de página
- Zero-config deployment en Vercel
- Optimización automática de assets (código splitting)
Arquitectura de la Solución
Stack Técnico
El proyecto se construyó sobre React 19.0.0 utilizando Vite 7.2.7 como bundler, aprovechando las siguientes características:
{
"react": "^19.0.0",
"react-router-dom": "^6.20.0",
"@google/generative-ai": "^0.24.1",
"@vitejs/plugin-react-swc": "^4.2.2"
}
Decisiones de Arquitectura Clave
1. SWC sobre Babel Se migró de @vitejs/plugin-react (Babel) a @vitejs/plugin-react-swc para reducir el tiempo de compilación en ~40%. SWC, escrito en Rust, procesa JSX de forma nativa sin necesidad de macros o transformaciones complejas.
2. React 19 Concurrent Features Si bien React 19 introduce nuevas APIs de concurrencia, este proyecto utiliza principalmente:
- Suspense para lazy loading de rutas pesadas
- Automatic Batching para optimizar re-renders
- useEffect con dependencias estrictas para evitar memory leaks
3. Virtual Routing Strategy En lugar de crear páginas separadas para cada sección (/about, /services, etc.), implementamos rutas virtuales que redirigen a la HomePage con scroll automático:
// Rutas Virtuales en App.jsx
<Route path="/about" element={<HomePage />} />
<Route path="/services" element={<HomePage />} />
// Lógica de Scroll Programático
useEffect(() => {
const targetId = location.state?.scrollTo || currentPath;
const element = document.getElementById(targetId);
if (element) {
element.scrollIntoView({ behavior: "smooth" });
}
}, [location.pathname, location.state]);
Ventajas técnicas:
- Reduce el bundle size (1 página vs N páginas)
- Mejora el cache-hit ratio
- Mantiene el estado global sin necesidad de Context API
- Permite URLs compartibles para secciones específicas
Ingeniería de Componentes
ChatWidget con Gemini AI
La integración de IA generativa presentó dos desafíos críticos:
- Payload pesado: El SDK de Google Generative AI (~250KB)
- Latencia de red: Llamadas a la API de Gemini (500ms - 3s)
Solución: Client-Side Rate Limiting
En lugar de implementar un backend serverless, se optó por rate limiting en el cliente para controlar el consumo de API:
// Estado de control de peticiones
const [requestTimestamps, setRequestTimestamps] = useState([]);
const handleSend = async (e) => {
const now = Date.now();
const recentRequests = requestTimestamps.filter(
(timestamp) => now - timestamp < 60000 // Últimos 60 segundos
);
if (recentRequests.length >= 4) {
// Bloquear y mostrar mensaje de throttling
return;
}
// Proceder con la petición
setRequestTimestamps([...recentRequests, now]);
};
Ventajas:
- Protege la cuota de API sin servidor intermedio
- Reduce carga en Vercel Serverless Functions
- Experiencia de usuario transparente con feedback visual
Optimización del Contexto Conversacional
Se implementó un sliding window de 4 mensajes para mantener contexto sin saturar el modelo:
const historyContext = newMessages
.slice(-4) // Solo últimos 4 mensajes
.map((m) => ({
role: m.role === "user" ? "user" : "model",
text: m.text,
}));
Esto reduce el payload de la petición en ~70% comparado con enviar el historial completo.
Estrategia de Lazy Loading
Las rutas secundarias (/blog, /all-projects, /all-experience) utilizan React.lazy() con Suspense:
const BlogPage = lazy(() => import("./pages/BlogPage.jsx"));
const ProjectsPage = lazy(() => import("./pages/ProjectsPage.jsx"));
// Routing con fallback
<Route
path="/blog"
element={
<Suspense fallback={<PageFallback />}>
<BlogPage />
</Suspense>
}
/>;
Impacto medido:
- Bundle inicial: 89KB (gzipped)
- Lazy chunks: 15-30KB cada uno
- LCP (Largest Contentful Paint): 1.2s en conexiones 4G
Virtual Routing (Deep Dive)
La navegación fluida se logró mediante una combinación de:
- React Router v6 para gestión de rutas
- Scroll programático con
scrollIntoView() - State navigation para mantener contexto
Ejemplo Técnico
Cuando un usuario navega a /services:
// 1. React Router captura la ruta
<Route path="/services" element={<HomePage />} />;
// 2. useEffect detecta el cambio
useEffect(() => {
const currentPath = location.pathname.replace("/", "");
if (homeSections.includes(currentPath)) {
setTimeout(() => {
document.getElementById(currentPath)?.scrollIntoView({ behavior: "smooth" });
}, 100);
}
}, [location.pathname]);
Resultado: Transiciones instantáneas sin Full Page Reloads, preservando el estado del ChatWidget y otros componentes montados.
Observabilidad y Monitoreo
Se integró Vercel Speed Insights para métricas RUM (Real User Monitoring):
import { SpeedInsights } from "@vercel/speed-insights/react";
// En el componente principal
<SpeedInsights />;
Métricas actuales en producción:
- FCP (First Contentful Paint): 0.9s
- LCP (Largest Contentful Paint): 1.2s
- TTI (Time to Interactive): 1.8s
- CLS (Cumulative Layout Shift): 0.02
Conclusión
La implementación de React 19 con SWC, combinada con estrategias avanzadas de code-splitting y rate limiting client-side, permitió construir una SPA de alta performance con capacidades de IA generativa. El enfoque de Virtual Routing demostró ser superior a páginas tradicionales, reduciendo el tiempo de navegación en ~80% y manteniendo un bundle inicial < 90KB.
Los principales logros técnicos:
- Performance: LCP bajo 1.5s en percentil 75
- Escalabilidad: Rate limiting protege contra sobrecostos de API
- Mantenibilidad: Single Source of Truth en
siteData.js - SEO: react-helmet-async para meta tags dinámicos
La arquitectura permite iterar rápidamente sin sacrificar experiencia de usuario, posicionando el proyecto como referencia para SPAs modernas con IA integrada.
Stack Completo: React 19 • Vite 7 • SWC • React Router v6 • Gemini AI • Tailwind CSS • Vercel
Repositorio Showcase: github.com/LeoMartinK/portfolio-architecture-showcase