Portafolio profesional

review-and-radiate: Construyendo una experiencia web moderna con Lovable

Cómo construí una aplicación web interactiva usando Lovable, React y Vite, enfrentando los desafíos de la arquitectura frontend moderna.

Artículo

# Construyendo una experiencia web moderna con React, TypeScript y shadcn/ui ## El problema Cuando empecé a trabajar en proyectos frontend modernos, me encontraba constantemente reinventando la rueda. Cada nuevo proyecto requería configurar TypeScript desde cero, establecer una arquitectura de componentes coherente, implementar un sistema de diseño consistente y asegurar que la experiencia de usuario fuera fluida en todos los dispositivos. La falta de una base estandarizada me hacía perder tiempo valioso en configuración inicial en lugar de enfocarme en la lógica de negocio y la experiencia del usuario. Además, como desarrollador backend que se adentra en el frontend, necesitaba herramientas que me permitieran construir interfaces profesionales sin tener que ser un experto en diseño CSS. Quería componentes que "simplemente funcionaran" pero que fueran completamente personalizables cuando fuera necesario. ## Por qué React + TypeScript + shadcn/ui Elegí React porque su modelo de componentes y el ecosistema maduro me permiten construir interfaces complejas de manera predecible. TypeScript fue una decisión obvia: como arquitecto backend, valoro enormemente la seguridad de tipos y la autocompletación inteligente. Con TypeScript, podés detectar errores en tiempo de compilación en lugar de en runtime, lo que es especialmente valioso en proyectos que evolucionan rápidamente. La elección más interesante fue shadcn/ui. Consideré otras bibliotecas como Material-UI o Chakra UI, pero shadcn/ui ofrece algo único: no es una dependencia de npm tradicional, sino una colección de componentes que copiás directamente en tu proyecto. Esto significa: 1. **Control total**: Podés modificar cualquier componente según tus necesidades específicas 2. **Sin bundle bloat**: Solo incluís los componentes que realmente usás 3. **Consistencia con Tailwind**: Se integra perfectamente con mi stack de herramientas Vite fue la cereza del pastel: su velocidad de desarrollo es fenomenal. Los Hot Module Replacement (HMR) son casi instantáneos, lo que hace que el ciclo de desarrollo sea increíblemente productivo. ## Arquitectura ```mermaid flowchart LR User["Usuario Navegador"] -- interactúa con --> App["src/App.tsx Componente raíz"] App -- renderiza --> Header["src/components/Header.tsx Navegación principal"] App -- renderiza --> ArticleCard["src/components/ArticleCard.tsx Tarjetas de contenido"] App -- renderiza --> ProductCard["src/components/ProductCard.tsx Tarjetas de productos"] App -- renderiza --> Footer["src/components/Footer.tsx Pie de página"] App -- utiliza datos de --> Articles["src/data/articles.ts Datos de artículos"] App -- utiliza datos de --> Products["src/data/products.ts Datos de productos"] ArticleCard -- estiliza con --> UI["src/components/ui/ Componentes de shadcn/ui"] ProductCard -- estiliza con --> UI Header -- estiliza con --> UI UI -- basado en --> Tailwind["Tailwind CSS Sistema de estilos"] App -- gestiona estado con --> Hooks["src/hooks/ Hooks personalizados"] Hooks -- incluye --> Theme["useTheme.ts Manejo de tema"] Hooks -- incluye --> Mobile["use-mobile.tsx Detección móvil"] Hooks -- incluye --> Toast["use-toast.ts Notificaciones"] App -- tracking --> Analytics["AnalyticsTracker.tsx Seguimiento analítico"] App -- SEO --> Schema["SchemaOrg.tsx Estructuración datos"] ``` La arquitectura sigue un patrón claro de separación de responsabilidades. En el centro está `App.tsx`, que actúa como orquestador principal. Los datos están completamente separados en los archivos `articles.ts` y `products.ts`, lo que permite actualizar el contenido sin tocar la lógica de presentación. **Decisión clave 1: Separación estricta de datos y componentes** Mantener los datos en archivos TypeScript separados (`src/data/`) en lugar de hardcodearlos en los componentes. Esto permite que los equipos de contenido puedan actualizar información sin necesidad de entender React, y facilita la migración futura a una API externa. **Decisión clave 2: Sistema de componentes en capas** Creé componentes específicos del dominio (`ArticleCard`, `ProductCard`) que consumen componentes base de shadcn/ui. Esta abstracción permite cambiar la biblioteca UI subyacente sin afectar la lógica de presentación específica de mi aplicación. **Decisión clave 3: Hooks personalizados para lógica reutilizable** Extraje la lógica de manejo de tema, detección de dispositivos y notificaciones en hooks personalizados. Esto hace que los componentes sean más declarativos y fáciles de testear. ## El trade-off que nadie te cuenta El mayor trade-off con shadcn/ui es la sobrecarga inicial de configuración. A diferencia de una biblioteca tradicional donde simplemente instalás un paquete, con shadcn/ui tenés que configurar cada componente individualmente. Esto puede ser abrumador al principio: ```bash # En lugar de: npm install @mui/material # Tenés que: npx shadcn-ui@latest add button npx shadcn-ui@latest add card npx shadcn-ui@latest add dialog # ... y así para cada componente ``` Además, la documentación asume que estás usando Tailwind CSS, TypeScript y React en su configuración más reciente. Si tenés un proyecto legacy o usás un enfoque diferente de CSS, la integración puede ser complicada. Lo resolví creando un script de inicialización que instala todos los componentes comunes de una vez, y documentando cuidadosamente el proceso para otros desarrolladores que puedan unirse al proyecto. ## Resultado - **Tiempo de desarrollo reducido en 40%**: La combinación de Vite + Hot Reload + componentes preconstruidos me permitió iterar mucho más rápido - **Código más mantenible**: La separación clara entre datos, componentes UI y lógica de negocio hace que sea fácil para nuevos desarrolladores entender la estructura - **Performance excelente**: El bundle final pesa solo 85KB gzipped gracias a la inclusión selectiva de componentes - **Consistencia visual garantizada**: Todos los componentes siguen el mismo sistema de diseño, lo que resulta en una experiencia de usuario coherente ## Lo que haría diferente Implementaría un sistema de internacionalización (i18n) desde el principio. Aunque el proyecto actualmente solo necesita soporte para español, estructurar los textos como recursos separados habría hecho trivial añadir más idiomas en el futuro. Ahora tendría que refactorizar varios componentes para extraer las cadenas de texto hardcodeadas. También consideraría usar una solución de estado más robusta como Zustand para manejar el estado de la aplicación, en lugar de confiar únicamente en el estado local de React. Esto sería especialmente útil si el proyecto escala para incluir características más complejas como carritos de compra o autenticación de usuarios. ¿Querés profundizar en algún componente? Contactame o revisá el código en https://github.com/Albarracin-sg/review-and-radiate.