Biblioteca de JavaScript para construir interfaces de usuario mediante componentes declarativos y reutilizables, con un ecosistema que abarca desde SPAs hasta aplicaciones full-stack con Server Components.
React es una biblioteca de JavaScript para construir interfaces de usuario, creada por Meta (entonces Facebook) y publicada como open source en 2013. Su modelo mental central: la UI es una función del estado. Cuando el estado cambia, React calcula la diferencia mínima en el DOM y aplica solo las actualizaciones necesarias.
A diferencia de frameworks como Angular o Vue que ofrecen una solución completa (routing, formularios, HTTP), React se enfoca exclusivamente en la capa de vista. El ecosistema — Next.js, React Router, Zustand — complementa lo que React no incluye.
Todo en React es un componente: una función que recibe props y retorna JSX. Desde React 16.8 (2019), los hooks reemplazaron los class components como el patrón principal:
import { useState } from "react";
function Counter({ initial = 0 }: { initial?: number }) {
const [count, setCount] = useState(initial);
return (
<div>
<p>Conteo: {count}</p>
<button onClick={() => setCount((c) => c + 1)}>
Incrementar
</button>
</div>
);
}Los hooks fundamentales:
| Hook | Propósito | Cuándo usarlo |
|---|---|---|
useState | Estado local | Valores que cambian con interacción del usuario |
useEffect | Efectos secundarios | Suscripciones, fetching, sincronización con APIs externas |
useRef | Referencia mutable | Acceso al DOM, valores que persisten sin causar re-render |
useMemo | Memoización de valores | Cálculos costosos que dependen de pocas dependencias |
useCallback | Memoización de funciones | Callbacks pasados a componentes hijos optimizados |
useContext | Contexto compartido | Estado global ligero sin prop drilling |
React 19 (diciembre 2024) introduce cambios significativos en cómo se manejan datos y formularios:
Actions y formularios. useActionState reemplaza el patrón manual de useState + onSubmit + try/catch para formularios:
import { useActionState } from "react";
function LoginForm() {
const [state, submitAction, isPending] = useActionState(
async (_prev: { error?: string }, formData: FormData) => {
const res = await login(formData.get("email") as string);
if (!res.ok) return { error: "Credenciales inválidas" };
redirect("/dashboard");
return {};
},
{}
);
return (
<form action={submitAction}>
<input name="email" type="email" required />
<button disabled={isPending}>
{isPending ? "Enviando..." : "Entrar"}
</button>
{state.error && <p role="alert">{state.error}</p>}
</form>
);
}use() para promesas y contexto. Permite leer promesas directamente en el render, integrándose con Suspense:
import { use, Suspense } from "react";
function UserProfile({ userPromise }: { userPromise: Promise<User> }) {
const user = use(userPromise);
return <h1>{user.name}</h1>;
}
// Uso con Suspense boundary
<Suspense fallback={<p>Cargando...</p>}>
<UserProfile userPromise={fetchUser(id)} />
</Suspense>Otras novedades de React 19:
| Característica | Descripción |
|---|---|
useOptimistic | Actualización optimista de UI antes de que el servidor confirme |
ref como prop | Ya no se necesita forwardRef — ref es una prop regular |
| Metadatos en componentes | <title>, <meta>, <link> se elevan automáticamente al <head> |
| Hojas de estilo | Soporte nativo para <link rel="stylesheet"> con deduplicación |
| React Compiler | Memoización automática — elimina la necesidad de useMemo/useCallback manuales |
React re-renderiza un componente cada vez que su estado o props cambian. En aplicaciones grandes, esto puede causar problemas de rendimiento:
Reglas prácticas:
React.memo solo cuando el componente recibe las mismas props frecuentementeuseMemo/useCallback solo cuando el costo de recalcular es mayor que el costo de memoizarServer Components cambian fundamentalmente la arquitectura de aplicaciones React. La distinción:
| Aspecto | Server Component | Client Component |
|---|---|---|
| Directiva | Ninguna (default en App Router) | "use client" al inicio del archivo |
| Ejecución | Solo en el servidor | Servidor (SSR) + cliente (hidratación) |
| Acceso a datos | Directo (async/await, DB, filesystem) | Vía API o props del servidor |
| Interactividad | No — sin estado, sin efectos, sin eventos | Sí — useState, useEffect, onClick |
| Bundle JS | No se envía al cliente | Se incluye en el bundle del cliente |
La regla: empezar con Server Components por defecto. Agregar "use client" solo cuando se necesita interactividad, estado o APIs del navegador.
| Categoría | Opciones | Notas |
|---|---|---|
| Framework full-stack | Next.js, Remix, TanStack Start | Next.js domina con ~70% de nuevos proyectos React |
| Estado global | Zustand, Jotai, Redux Toolkit | Zustand es el más adoptado para nuevos proyectos |
| Estilos | Tailwind CSS, CSS Modules, styled-components | Tailwind domina en proyectos nuevos |
| Formularios | React Hook Form, Formik | React 19 Actions reduce la necesidad de librerías |
| Testing | Vitest + Testing Library, Playwright | Testing Library promueve tests centrados en el usuario |
| Micro frontends | Module Federation, single-spa | Para equipos grandes con deploys independientes |
React definió el paradigma de UI basada en componentes que domina el desarrollo web. Con Server Components y React 19, evoluciona de una biblioteca de cliente a un modelo full-stack donde el servidor y el cliente colaboran en el mismo árbol de componentes. Para un ingeniero senior, entender la frontera entre Server y Client Components — y cuándo cruzarla — es la decisión arquitectónica más importante en cualquier proyecto React moderno.
use(), React Compiler y nuevos hooks.Superset tipado de JavaScript que añade tipos estáticos opcionales, mejorando la productividad del desarrollador, la detección de errores y la mantenibilidad del código.
Paradigma de React donde los componentes se ejecutan en el servidor, enviando solo HTML al cliente, reduciendo el bundle de JavaScript y mejorando el rendimiento.
Patrones y bibliotecas para gestionar el estado de aplicaciones frontend de forma predecible, desde estado local de componentes hasta estado global compartido.
Framework de React para aplicaciones web full-stack con Server Components, routing basado en archivos, SSR/SSG y optimizaciones de rendimiento integradas.
Patrón arquitectónico que extiende los microservicios al frontend, permitiendo que equipos independientes desarrollen y desplieguen partes de una aplicación web de forma autónoma.
Estándares web nativos para crear componentes reutilizables y encapsulados que funcionan en cualquier framework o sin framework.
Plantilla reutilizable para crear micro frontends con React, TypeScript, Tailwind CSS y Vite. Incluye sistema de diseno, testing y CI/CD.
Shell de micro frontends con sistema de diseno completo, 24 componentes, 666 tests y cumplimiento WCAG AA. Publicado en npm como @jonmatum/react-mfe-shell.
Aplicación de demostración interactiva para el sistema de diseno React MFE Shell con PWA, métricas automatizadas y showcase de componentes.
Componente de menú headless para React con accesibilidad completa, cero estilos y soporte para teclado. Publicado en npm.
Boilerplate para crear librerías React con TypeScript, Rollup, Jest, Tailwind CSS, Husky y publicación en npm.
Framework CSS utility-first que permite construir diseños directamente en el markup usando clases atómicas, eliminando la necesidad de escribir CSS custom.
Aplicaciones web que usan tecnologías modernas para ofrecer experiencias similares a apps nativas: instalables, offline-capable y con notificaciones push.
Colección de componentes reutilizables, patrones y guías que aseguran consistencia visual y de interacción en productos digitales a escala.
Práctica de diseñar y desarrollar productos digitales que puedan ser usados por todas las personas, incluyendo aquellas con discapacidades visuales, auditivas, motoras o cognitivas.