Aprovechando las capacidades de React 18, Next.js App Router proporciona una arquitectura de alto rendimiento para construir frontends web modernos.
Sin embargo, configurar incorrectamente los límites servidor-cliente o las reglas de caché puede llevar a tiempos de respuesta lentos. En esta guía, exploramos técnicas prácticas de optimización para construir aplicaciones Next.js ultrarrápidas.
1. Maximiza los React Server Components (RSC)
El beneficio principal del App Router es que todos los componentes son Server Components por defecto. Esto elimina grandes porciones de JavaScript del bundle del lado del cliente.
Regla de optimización: Empuja "use client" a las hojas
Declarar "use client" en la parte superior de un archivo obliga a que todo el árbol de importación debajo sea descargado por el navegador.
Para optimizar, aísla las funciones interactivas (como botones, hooks de estado y efectos secundarios) en pequeños componentes hoja.
// ✕ Anti-patrón: Convertir toda la página en un Client Component
'use client'
export default function Page() {
const [data, setData] = useState(null)
return <div>{/* Contenido estático pesado */}</div>
}
// ◯ Mejor práctica: Anidar Client Components dentro de Server Components
import HeavyStaticContent from './HeavyStaticContent' // RSC
import ClientInteractiveButton from './ClientInteractiveButton' // Client
export default function Page() {
return (
<div>
<HeavyStaticContent />
<ClientInteractiveButton />
</div>
)
}
2. Manejo inteligente de imágenes con next/image
Las imágenes en el viewport influyen fuertemente en tu puntuación de Largest Contentful Paint (LCP).
Precarga activos críticos usando priority
Asegúrate de agregar el atributo priority a la imagen principal o logo para que el navegador precargue el activo antes de analizar scripts secundarios.
import Image from 'next/image'
export default function Hero() {
return (
<div className="hero-banner">
<Image
src="/images/hero-visual.png"
alt="Imagen principal"
width={1200}
height={630}
priority
sizes="(max-width: 768px) 100vw, 1200px"
/>
</div>
)
}
Además, define el atributo sizes con precisión para evitar que el servidor sirva resoluciones de escritorio masivas a pantallas móviles pequeñas.
3. División e importaciones dinámicas
Para optimizar el peso inicial de la página, divide bibliotecas pesadas o componentes opcionales (como ventanas modales) para que se carguen solo cuando se activen.
import dynamic from 'next/dynamic'
// No incluir este modal en el bundle de carga inicial
const HeavyModal = dynamic(() => import('./HeavyModal'), {
ssr: false,
})
4. Resumen: Mide, construye, audita
Siempre ejecuta auditorías usando Lighthouse o Chrome DevTools para perfilar los tamaños de los bundles de JavaScript y los tiempos de respuesta del servidor (TTFB). Aprovecha el poder de los Server Components para ofrecer experiencias de usuario optimizadas y rápidas.

