Mnemo

React Server Components — Entrevista

Fuente: Generado con prompts/generar-mazo.md

34 tarjetas34 vencidas ahora0 ya repasadas

reactrscnextjsfrontend

Tarjetas

¿Qué es un Server Component?

Componente que ejecuta SOLO en el servidor: su código nunca se envía al browser. Accede a la BD/apis directamente y renderiza HTML.

¿Data fetching: await en RSC vs useEffect en client?

En RSC el componente es async y awaited: los datos llegan antes del render, sin estados de carga en cascada. En client, el efecto corre DESPUÉS de pintar (loader → fetch → repaint).

¿Server vs Client Component — dónde va la frontera?

Server por defecto (datos, await, secrets). Client (`"use client"`) solo lo que necesita interactividad: useState, efectos, event handlers, APIs del browser.

¿Qué puede cruzar la frontera server→client como props?

Datos serializables: strings, números, booleanos, arrays, objetos planos, Dates, y elementos React/componentes como children. NO funciones, clases ni instancias.

¿Qué es la hidratación y qué la rompe?

El client component llega como HTML y React "adjunta" los handlers en el browser (hidrata). Se rompe si el HTML del servidor difiere del primer render del cliente.

¿Cómo pasa un Server Component adentro de un Client Component?

Por `children`: el server renderiza el contenido y lo pasa como prop — el client component lo recibe como elemento ya renderizado.

¿Qué significa force-dynamic y cuándo se usa?

Marca la ruta para renderizarse en cada request (SSR), sin caché estático ni build-time.

¿revalidatePath — cuándo invalidar y cuándo NO?

Invalida la caché de una ruta tras un mutation para que la próxima navegación vea datos frescos.

¿Qué son las Server Actions?

Funciones con `"use server"` que el cliente puede llamar como funciones: la llamada viaja al servidor, ejecuta, y devuelve el resultado.

¿Qué gana un RSC vs una SPA para SEO y carga inicial?

HTML completo con datos en el primer response: indexable sin ejecutar JS y first paint sin waterfall de fetches.

¿Streaming con Suspense — qué resuelve?

Partir la respuesta en chunks: mandás el shell ya y cada sección lenta (suspense boundary) llega cuando su dato está listo.

¿Cuándo RSC NO es la mejor herramienta?

Apps 100% interactivas tras la carga (editores, juegos, dashboards con drag&drop y realtime): casi todo termina siendo client components y pagás el server de más.

¿Qué marca exactamente la directiva "use client"?

El punto de entrada del bundle client: ese módulo y TODOS sus imports se envían al browser. No convierte en client lo que está encima.

¿Por qué un Server Component no puede tener useState?

Porque no hay instancia viva en el cliente donde guardar el estado: el componente corre una vez en el servidor y viaja como resultado.

¿Cuándo se muestra not-found.tsx y cómo la dispara tu código?

Next la renderiza ante una URL sin match y cuando una page llama `notFound()`: es la UI de las rutas inexistentes.

¿Layout o page — qué pasa con el estado al navegar entre páginas hermanas?

No se desmonta el layout: conserva estado y scroll mientras la page se reemplaza. Para forzar re-mount existe `template.tsx` (o sacarlo del layout).

¿Qué envuelve exactamente loading.tsx?

Un límite de Suspense automático alrededor del segmento: mientras el servidor fetchea, viaja el shell con el fallback visible.

¿Cómo ejecutás dos queries independientes en paralelo en un server component?

Sin await intermedio: `const [a, b] = await Promise.all([getA(), getB()])`. El total es la más lenta, no la suma.

¿Qué dos cosas exige error.tsx y por qué?

Debe ser client component y recibe `{ error, reset }`: es una error boundary de React, y esas solo existen del lado del cliente.

¿Qué es el waterfall entre componentes y cuándo es aceptable?

El hijo espera su dato y recién entonces renderiza al nieto que pide el suyo: latencias sumadas en cadena. Aceptable solo si un dato depende del anterior.

¿Qué tiene de especial leer cookies() o headers() en un server component?

Son dynamic APIs: solo tienen valor con un request concreto, así que leerlas saca la ruta del prerender estático.

¿Por qué leer searchParams puede tirar abajo tu página estática?

Es parte del request (la URL): leerla o awaitearla la vuelve dinámica. Declararla como prop sin leerla no rompe el prerender.

¿Cuáles son las tres capas de caché del servidor en Next?

Request memoization (deduplica el mismo fetch dentro de UNA pasada de render), Data Cache (persiste respuestas fetch ENTRE requests), Full Route Cache (guarda el HTML+RSC ya renderizado por ruta).

¿Qué problema resuelve useActionState en un form con action?

Te da el estado del resultado dentro del componente: `pending`, el retorno y los errores — sin flags manuales ni onSubmit custom.

¿Cómo mostrás una mutation como hecha antes de que el servidor responda?

Aplicando el estado "esperado" con useOptimistic: la UI refleja el click al instante y React revierte si falla o confirma con el dato real.

¿useFormStatus o useActionState — cuándo alcanza con la primera?

Con useFormStatus un componente HIJO del form (el botón) lee `pending` del form ancestro — sin props, sin conocer la action, sin re-render del padre.

¿Qué protege una server action de llamadas cross-site?

El chequeo de Origin: el POST con origen ajeno al Host de la app se rechaza antes de ejecutar la action — CSRF cortado por defecto.

¿Qué limitación de streaming tiene generateMetadata?

Que no puede streamear: Next espera que resuelva antes de mandar el head; un fetch lento ahí frena todo el documento.

¿Qué es el Router Cache y cómo lo aprovecha el prefetch de Link?

La caché en memoria del browser con los payloads RSC por ruta: Link los precarga y navegar o volver atrás no pide al servidor.

¿Cómo componés server page + client list + action + optimistic?

Fetchea en la page (server) y baja los datos a la lista client; la action muta y devuelve estado; la lista aplica useActionState + useOptimistic y confirma al revalidar.

¿Qué garantiza el paquete server-only en un módulo?

Rompe el build si ese módulo (secrets, queries directas) termina importado por un client component — en vez de terminar silencioso en el bundle.

¿Route handler (route.ts) o server action — cuándo cada uno?

Handler para consumidores externos: webhooks, APIs públicas, descargas con verbos HTTP reales. Action para mutations disparados desde tu propia UI.

¿revalidateTag o revalidatePath — cómo decidís?

Tag para invalidación por DATO: los fetches etiquetados (`next: { tags: [...] }`) quedan frescos en todas las vistas. Path para refrescar una RUTA completa por URL.

¿Por qué next/image y no un <img> directo?

Resize por viewport (srcset/densidades), conversión a WebP/AVIF, lazy por defecto y width/height que reservan el espacio — sin layout shift.