Mejores prácticas de renderizado en Next.js
Un resumen condensado de las 25 mejores prácticas más importantes extraídas de cada página de esta sección.
Busca en todas las páginas de la documentación
Un resumen condensado de las 25 mejores prácticas más importantes extraídas de cada página de esta sección.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
"use client", así que usa Server Components primero y solo añade la directiva cuando realmente necesites hooks, eventos, o APIs del navegador.async y llamar a await fetch(...) o await db.query(...) en el cuerpo de la función - salta los estados de carga de useEffect, ya que los hooks no están permitidos en el servidor de todas formas.import "server-only" al inicio de módulos que leen AUTH_SECRET, URLs de base de datos, o claves de firma hace que la compilación falle en el momento en que un Client Component los importa, previniendo fugas al paquete del navegador."use client" arrastra cada hijo y cada utilidad importada al paquete del cliente; extrae solo la parte interactiva (como un LikeButton) en el Client Component y mantén sus padres renderizados por el servidor.window, document, localStorage, e IntersectionObserver no existen durante SSR, así que accede a ellos dentro de useEffect (o detrás de una verificación typeof window !== "undefined") e inicializa el estado a un valor seguro para el servidor primero.Date.now(), Math.random(), o leas window durante el render - el HTML del servidor y el re-render del cliente estarán en desacuerdo; mueve valores variables a useEffect, o usa suppressHydrationWarning para casos deliberados.import un Server Component (la importación silenciosamente se vuelve solo de cliente), pero puede recibir uno a través de children o props JSX nombradas - orquesta la composición desde un padre Server Component.app/providers.tsx con "use client" y renderiza <Providers>{children}</Providers> desde el layout del Server Component.LikeButton) a su propio archivo pequeño "use client".cookies(), headers(), searchParams, connection(), cualquier fetch con cache: "no-store", o export const dynamic = "force-dynamic" hacen que toda la ruta sea renderizada dinámicamente - un único uso en cualquier componente es suficiente.generateStaticParams, y deja dynamicParams = true (el valor por defecto) así que las rutas nuevas se renderizarán en la primera solicitud y luego se almacenarán en caché.export const revalidate = 0 es equivalente a force-dynamic, no "revalidar inmediatamente" - usa un entero positivo (por ej., revalidate = 60) para ISR y reserva 0 o "no-store" para datos verdaderamente por solicitud.export const dynamic = "force-static" hace que la compilación falle si la página llama a cookies()/headers()/searchParams; ya sea remueve la llamada dinámica o retrocede a dynamic = "auto".experimental: { ppr: "incremental" } en next.config.ts y opta por rutas una a la vez con export const experimental_ppr = true así puedas enviar PPR de forma progresiva y verificar que cada ruta se comporta.<Suspense> circundante arrastra toda la ruta PPR de vuelta a renderizado completamente dinámico.<Image fill> sin un prop sizes hace que el navegador solicite la variante más grande en cada dispositivo; suministra una string consciente de puntos de quiebre como "(max-width: 640px) 100vw, (max-width: 1024px) 50vw, 33vw" que coincida con el layout.images.remotePatterns en next.config.ts; sin ella, las imágenes remotas lanzan un error de compilación/runtime y next/image se niega a optimizarlas.priority solo a una o dos imágenes LCP encima de la línea de flotación - desactiva la carga perezosa e inyecta un consejo de precarga, así que usarlo en exceso ralentiza la página en lugar de acelerarla.width y height en next/image cierran una relación de aspecto para prevención de CLS; usa CSS (className, tamaño del contenedor) para controlar en qué se renderiza la imagen.next/font/google y next/font/local descargan y sirven fuentes desde tu propio origen con encabezados de caché inmutables, eliminando solicitudes externas, FOUT, y CLS a través de métricas de fallback auto-generadas.inter.className (o inter.variable) a <html>, <body>, o el contenedor relevante; una clase olvidada es el error más común de "mi fuente no está cargando".weight: ["400", "700"] explícito para una fuente que tiene una compilación variable fuerza a Next.js a descargar múltiples archivos estáticos en lugar de un archivo variable; elimina weight cuando la fuente lo soporta para mantener el paquete pequeño.display: "swap" (el valor por defecto recomendado) así se muestre una fuente de fallback inmediatamente y se reemplace cuando la fuente personalizada carga; display: "optional" puede dejar texto invisible si la fuente no llega dentro de ~100ms.Revisado por Chris St. John·Última actualización: 19 jul 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥