-
Framework: Next.js vs Vite vs Remix vs TanStack Start
- Next.js: elige para SSR/SSG, apps críticas para SEO, o cuando quieras una configuración full-stack completa con App Router y React Server Components.
- Vite: elige para SPAs puras, herramientas internas o dashboards donde el HMR rápido en desarrollo importa más que SSR.
- Remix: elige cuando quieras enrutamiento anidado basado en fundamentos web, loaders/actions y mejora progresiva integrados.
- TanStack Start: elige cuando quieras enrutamiento type-safe con SSR pero más flexibilidad que Next.js.
-
Estrategia de Renderizado: SSR vs SSG vs CSR vs ISR
- SSR: páginas públicas con personalización por solicitud o datos que cambian frecuentemente.
- SSG: sitios de marketing, documentación o blogs donde el contenido rara vez cambia y quieres hosting CDN económico.
- CSR: shells de apps autenticadas detrás de un login donde SEO no importa.
- ISR: sitios híbridos con contenido mayormente estático pero revalidación ocasional en segundo plano (por ejemplo, catálogos de ecommerce).
-
Lenguaje: TypeScript vs JavaScript
- TypeScript: predeterminado para cualquier equipo o app no trivial; detecta bugs en tiempo de compilación y hace las refactorisaciones más seguras.
- JavaScript: solo para prototipos diminutos, demostraciones desechables, o cuando los colaboradores carecen estrictamente de familiaridad con TS.
-
Gestor de Paquetes: pnpm vs npm vs yarn vs bun
- pnpm: monorepos y proyectos sensibles al espacio en disco y velocidad de instalación, gracias a su almacén direccionable por contenido.
- npm: cero configuración, se envía con Node, máxima compatibilidad con tutoriales y ejemplos de CI.
- yarn: configuraciones existentes de yarn berry (PnP) o equipos ya comprometidos con yarn workspaces.
- bun: proyectos greenfield priorizando velocidad bruta de instalación/ejecución y dispuestos a aceptar un ecosistema más joven.
-
Estructura del Repositorio: Monorepo (Turborepo/Nx) vs Polyrepo
- Monorepo: múltiples apps compartiendo componentes UI, tipos o utils (web + mobile + admin dashboard).
- Polyrepo: app individual, equipo pequeño, o límites de propiedad estrictos entre servicios.
-
Enrutamiento: Basado en archivos vs React Router vs TanStack Router
- Basado en archivos (Next/TanStack): convención sobre configuración; las rutas mapean al filesystem, excelente para estandarización.
- React Router: SPAs donde quieres control programático completo y una API madura y familiar.
- TanStack Router: necesitas rutas completamente type-safe con validación de parámetros de búsqueda y fetching de datos basado en loaders.
-
Gestión de Estado del Cliente: Zustand vs Redux Toolkit vs Jotai vs Context API
- Zustand: boilerplate mínimo, buena opción predeterminada para la mayoría de apps que necesitan estado compartido.
- Redux Toolkit: apps grandes con máquinas de estado complejas, depuración de viaje en el tiempo, o experiencia previa con Redux.
- Jotai: estado que es naturalmente atómico y derivado - bueno para formularios complejos o estado similar a grafos.
- Context API: valores verdaderamente globales y raramente cambiantes como tema o usuario auth; evita para cualquier cosa que se actualice frecuentemente.
-
Estado del Servidor / Fetching de Datos: TanStack Query vs SWR vs RTK Query vs Apollo
- TanStack Query: predeterminado para REST - caching, mutaciones, devtools, agnóstico del framework.
- SWR: API más simple, ligero, integración estrecha si estás en el ecosistema de Vercel.
- RTK Query: ya usas Redux Toolkit y quieres fetching de datos en el mismo store.
- Apollo: GraphQL con caching normalizado, actualizaciones optimistas y suscripciones.
-
Enfoque de Styling: Tailwind vs CSS Modules vs styled-components vs vanilla-extract
- Tailwind: iteración rápida, tokens de diseño consistentes, se complementa perfecto con shadcn/ui.
- CSS Modules: quieres CSS plano con alcance, cero runtime y ningún DSL nuevo que aprender.
- styled-components: theming dinámico y CSS-in-JS colocado, aceptando el costo de runtime.
- vanilla-extract: CSS-in-TS type-safe y cero runtime para autores de design systems.
-
Librería de Componentes: shadcn/ui vs MUI vs Chakra vs Radix + custom
- shadcn/ui: quieres componentes copiados y completamente poseídos construidos en Radix + Tailwind.
- MUI: apps empresariales necesitando componentes integrales estilo Material out of the box.
- Chakra: componentes accesibles y temables con una API amigable basada en props.
- Radix + custom: quieres primitivos headless accesibles y una identidad visual completamente personalizada.
-
Formularios: React Hook Form vs TanStack Form vs Formik
- React Hook Form: elección predeterminada - performante, no controlado, se complementa bien con resolvers Zod.
- TanStack Form: profundamente type-safe con validación asincrónica de primera clase y arrays de campos.
- Formik: solo para proyectos legacy ya usándolo; generalmente no recomendado para trabajo nuevo.
-
Validación de Esquema: Zod vs Valibot vs Yup
- Zod: estándar de facto; excelente inferencia de TS, integración amplia del ecosistema (RHF, tRPC, etc.).
- Valibot: apps sensibles al tamaño del bundle - modular y tree-shakable con ergonomía similar a Zod.
- Yup: proyectos existentes con Formik o si prefieres su estilo de validación asincrónica-first.
-
Capa de API: REST vs GraphQL vs tRPC
- REST: APIs públicas, máxima compatibilidad de cliente, o necesidades CRUD simples.
- GraphQL: múltiples clientes con necesidades de datos divergentes y consultas anidadas complejas.
- tRPC: proyecto full-stack TypeScript donde la API solo es consumida por tus propios clientes.
-
Autenticación: Auth.js vs Clerk vs Auth0 vs custom
- Auth.js (NextAuth): open-source, auto-hospedado, muchos proveedores OAuth out of the box para Next.js.
- Clerk: UI plug-and-play, dashboards de gestión de usuarios, y estás feliz pagando por velocidad.
- Auth0: SSO empresarial, SAML y requisitos de cumplimiento normativo.
- Custom: flujos de auth inusuales o requisitos estrictos de residencia de datos que excluyen terceros.
-
Testing Unitario/Integración: Vitest vs Jest
- Vitest: proyectos basados en Vite y cualquiera queriendo un runner más rápido y ESM-nativo con API compatible con Jest.
- Jest: suites de pruebas grandes existentes, Next.js sin Vite, o herramientas que asumen específicamente Jest.
-
Testing E2E: Playwright vs Cypress
- Playwright: cobertura multi-navegador (WebKit/Firefox), paralelismo, y DX moderno - recomendación predeterminada.
- Cypress: depuración pesada de viaje en el tiempo y una interfaz más rica para diagnóstico de pruebas inestables.
-
Linting y Formateo: ESLint + Prettier vs Biome
- ESLint + Prettier: ecosistema maduro con plugins para cada framework y regla imaginable.
- Biome: proyectos greenfield queriendo una única herramienta rápida basada en Rust para linting y formateo.
-
Estructura de Carpetas: Basada en características vs Basada en tipos vs Atomic Design
- Basada en características: coloca todo el código por característica de dominio - escala mejor a medida que las apps crecen.
- Basada en tipos (components/, hooks/, etc.): bien para apps pequeñas pero difícil pasado ~20 características.
- Atomic Design: apps pesadas en design system donde los primitivos de UI reutilizables son la preocupación principal.
-
Estrategia de Code Splitting: Splitting a nivel de ruta vs Lazy loading a nivel de componente
- Splitting a nivel de ruta: predeterminado; divide en límites de página para las mejores ganancias de TTI con esfuerzo mínimo.
- Lazy loading a nivel de componente: widgets específicos pesados (gráficos, editores ricos, mapas) que se renderizan condicionalmente.
-
Monitoreo de Errores: Sentry vs LogRocket vs Datadog
- Sentry: rastreo de errores de mejor-en-clase con source maps, releases y monitoreo de performance.
- LogRocket: necesitas session replay junto con errores para depurar problemas de UX.
- Datadog: ya estás estandarizado en él para observabilidad de backend y quieres un único panel.
-
Analytics: PostHog vs Google Analytics vs Plausible vs Mixpanel
- PostHog: product analytics con feature flags, session replay y opción de auto-hospedaje.
- Google Analytics: gratis, ubicuo, y suficiente para métricas de marketing/tráfico.
- Plausible: ligero, privacy-first, sin cookies - bueno para cumplimiento de UE.
- Mixpanel: análisis de funnel y cohorte para equipos de producto que viven en datos de eventos.
-
CI/CD: GitHub Actions vs GitLab CI vs CircleCI
- GitHub Actions: predeterminado si tu repo está en GitHub - integración profunda y enorme marketplace.
- GitLab CI: tu fuente está en GitLab; integración estrecha con Auto DevOps.
- CircleCI: equipos queriendo primitivos de paralelismo potentes y caching maduro out of the box.
-
Hosting / Despliegue: Vercel vs Netlify vs AWS vs Cloudflare Pages
- Vercel: apps Next.js - soporte first-party, runtime edge, despliegues preview.
- Netlify: sitios Jamstack, funciones serverless, y tier libre generoso.
- AWS: necesitas control completo, VPCs personalizadas, o ya vives en AWS.
- Cloudflare Pages: apps edge-first, precios agresivos, integración estrecha con Workers.
-
Gestión de Variables de Entorno: Archivos .env vs Doppler vs AWS Secrets Manager
- Archivos .env: proyectos simples con pocos secretos y devs de confianza.
- Doppler: equipos necesitando sincronización compartida y auditada de secretos entre envs sin complejidad de AWS.
- AWS Secrets Manager: stacks nativos de AWS con rotación, políticas de IAM y necesidades de cumplimiento.
-
Internacionalización (i18n): next-intl vs react-i18next vs Lingui
- next-intl: Next.js App Router con soporte RSC de primera clase.
- react-i18next: maduro, agnóstico del framework, enorme ecosistema de plugins.
- Lingui: extracción de mensajes en tiempo de compilación y runtime más pequeño, basado en ICU.
-
Animación: Framer Motion vs React Spring vs CSS/Tailwind
- Framer Motion: animaciones declarativas, gestos y layout animations con código mínimo.
- React Spring: animaciones basadas en física y control fino.
- CSS/Tailwind: transiciones simples y efectos hover - costo de runtime JS nulo.
-
Sistema de Iconos: Lucide vs Heroicons vs custom SVG sprites
- Lucide: conjunto de iconos moderno más grande con componentes React tree-shakables.
- Heroicons: limpio, alineado con Tailwind, se complementa bien con shadcn/ui.
- Custom SVG sprites: iconografía específica de marca o presupuestos estrictos de tamaño de bundle.
-
Manejo de Fecha/Hora: date-fns vs Day.js vs Luxon vs Temporal
- date-fns: utilidades funcionales tree-shakables; elección predeterminada para la mayoría de apps.
- Day.js: API similar a Moment en un bundle diminuto - bueno para migraciones rápidas desde Moment.
- Luxon: necesidades pesadas de zona horaria y calendarios, construido en Intl.
- Temporal (polyfill): quieres el estándar futuro hoy y estás bien enviando el polyfill.
-
Documentación de Componentes: Storybook vs Ladle vs ninguno
- Storybook: design system o librería de componentes compartida consumida por múltiples equipos.
- Ladle: basado en Vite, alternativa más rápida para catálogos de componentes más simples.
- Ninguno: productos en etapa temprana donde los componentes cambian diariamente y la documentación se pudre más rápido de lo que ayuda.
-
Optimización de Imágenes: next/image vs Cloudinary vs custom (Sharp + CDN)
- next/image: proyectos Next.js - redimensionamiento automático, lazy loading y negociación de formato.
- Cloudinary: necesitas transformaciones al vuelo, entrega de CDN, y trabajas en frameworks sin Next.
- Custom (Sharp + CDN): control completo, sensible al costo a escala, o pipelines de imagen altamente específicos.