Blanche Agency

Blanche Agency

© 2026

El renderizado en el edge no es una bala de plata: un marco práctico en Next.js para SSR, ISR, SSG, caché y Core Web Vitals
Volver al blog
1 de marzo de 2026·13 min de lectura

El renderizado en el edge no es una bala de plata: un marco práctico en Next.js para SSR, ISR, SSG, caché y Core Web Vitals

El renderizado en el edge puede ser una victoria de rendimiento—o una distracción cara. Aquí tienes un marco de decisión sin rodeos para elegir SSR/ISR/SSG (y patrones tipo prerenderizado parcial), diseñar cachés que aguanten tráfico real y medir lo que de verdad mueve los Core Web Vitals.

El renderizado en el edge está de moda—pero la mayoría de los equipos lo adoptan como adoptan una nueva librería de JavaScript: porque suena más rápido.

La verdad incómoda: el renderizado en el edge es un intercambio de latencia. A veces reduce el time-to-first-byte (TTFB). A veces lo aumenta. Y casi siempre incrementa la complejidad del sistema.

Este artículo te da un marco pragmático para elegir el modo de renderizado correcto en Next.js (SSR/ISR/SSG y patrones tipo prerenderizado parcial), diseñar una estrategia de caché que se sostenga con tráfico real, e instrumentar el rendimiento para que puedas demostrar mejoras (y detectar regresiones) antes de que lo hagan los usuarios.


Qué significa “rendimiento” en 2026 (CWV + UX)

Si todavía optimizas el “tiempo de carga de la página” como un único número, estás optimizando para un mundo que ya no existe.

En la práctica, el rendimiento web moderno es:

  • Core Web Vitals (CWV): especialmente LCP (Largest Contentful Paint), INP (Interaction to Next Paint) y CLS (Cumulative Layout Shift)
  • Capacidad de respuesta percibida por el usuario: ¿la UI se siente inmediata, estable y predecible?
  • Consistencia: p95 y p99 importan más que tu mejor ejecución en laboratorio
  • Rendimiento operativo: seguridad en despliegues, corrección de caché, frecuencia de incidentes y coste

La trampa del rendimiento: optimizar TTFB ignorando INP

El renderizado en el edge a menudo mejora el TTFB, lo que puede ayudar al LCP en páginas con mucho contenido. Pero muchas regresiones del mundo real vienen de:

  • enviar demasiado JavaScript (perjudica INP)
  • cascadas de datos en el cliente (perjudica LCP y la velocidad percibida)
  • inestabilidad de layout por contenido que carga tarde (perjudica CLS)

Nota: Si tu elemento LCP es una imagen o un texto hero que puede servirse de forma estática, el renderizado en el edge rara vez es tu palanca principal. Tu palanca principal suele ser cacheabilidad + disciplina de payload.

Conclusión concreta: trata el renderizado en el edge como una herramienta dentro de un sistema más amplio—modo de renderizado + caché + payload + observabilidad.


Modos de renderizado en Next.js: una comparación rápida y honesta

Next.js te da varias formas de producir HTML. La elección correcta depende de la volatilidad de los datos, la personalización y la estrategia de caché.

SSG (Static Site Generation)

Mejor para: páginas de marketing, documentación, precios, contenido que cambia con poca frecuencia.

  • Pros: lo más rápido y barato a escala; cacheable de forma natural en CDN; CWV estable
  • Contras: requiere rebuilds para cambios de contenido salvo que se combine con ISR; la personalización exige trucos en cliente o middleware en el edge

Úsalo cuando: la página puede ser correcta aunque esté desactualizada minutos u horas.

ISR (Incremental Static Regeneration)

Mejor para: sitios de contenido, catálogos de producto, landings con actualizaciones periódicas.

  • Pros: mantiene las ventajas de SSG permitiendo actualizaciones; excelente con comportamiento stale-while-revalidate
  • Contras: la invalidación y la lógica de revalidación pueden volverse sutiles; la “frescura” es probabilística bajo carga

Úsalo cuando: quieres páginas mayoritariamente estáticas con frescura controlada.

SSR (Server-Side Rendering)

Mejor para: dashboards autenticados, páginas muy dinámicas, experiencias personalizadas.

  • Pros: el HTML refleja los datos más recientes y el contexto del usuario; modelo de corrección más simple que hacks de caché complicados
  • Contras: puede ser caro; más difícil de cachear; p95/p99 pueden empeorar bajo carga; puede ocultar cascadas en el cliente en lugar de arreglarlas

Úsalo cuando: la corrección importa más que la cacheabilidad.

Renderizado en el edge (SSR en el edge)

Mejor para: audiencias globales con fallos de caché, enrutamiento en tiempo de petición, personalización ligera, buckets de A/B.

  • Pros: puede reducir la latencia al ejecutar más cerca del usuario; bueno para decisiones rápidas en tiempo de petición
  • Contras: añade restricciones (límites de runtime, librerías, cold starts según la plataforma); puede aumentar la latencia si fuerza saltos de red extra hacia tus datos; depuración y observabilidad pueden ser más difíciles

Úsalo cuando: puedes mantener la lógica en el edge delgada y tu acceso a datos es amigable para el edge.

Patrones tipo prerenderizado parcial (HTML híbrido)

Aunque no uses una funcionalidad concreta con marca, el patrón es claro: servir rápido una carcasa mayoritariamente estática y hacer streaming o hidratar las partes dinámicas.

  • Marco estático: navegación, layout, encabezados, contenido crítico

  • Islas dinámicas: paneles específicos del usuario, recomendaciones, estado del carrito

  • Pros: mejora LCP manteniendo personalización; reduce trabajo del servidor en secciones que no cambian

  • Contras: puede introducir complejidad en los límites de datos; requiere disciplina para no convertir las “islas” en cascadas

Úsalo cuando: necesitas tanto un primer pintado rápido como secciones dinámicas.

Regla general: Si la página se puede cachear, prefiere una estrategia cacheada (SSG/ISR + CDN). Si no se puede, prefiere SSR—pero pelea por un enfoque híbrido que mantenga cacheable el contenido crítico para LCP.


Una matriz de decisión por tipo de página (marketing, dashboard, docs, ecom)

En vez de elegir un modo de renderizado por app, elígelo por tipo de página.

La matriz: qué optimizar

Evalúa cada página según:

  1. Nivel de personalización: ninguna / ligera (locale, experimento) / alta (datos específicos del usuario)
  2. Requisito de frescura: horas / minutos / segundos
  3. Forma del tráfico: campañas con picos vs. uso estable
  4. Distribución global: local vs. mundial
  5. Proximidad de datos: ¿tus datos pueden accederse rápido desde el edge?

Páginas de marketing

Por defecto: SSG o ISR

  • Cachea en la CDN con TTL largos
  • Usa revalidación ISR para actualizaciones desde el CMS
  • Mantén el JS pequeño; no envíes toda la carcasa de tu app

Cuándo ayuda el edge:

  • enrutamiento geo/locale en tiempo de petición
  • asignación de experimentos (pero evita variación de HTML por usuario)

Ejemplo concreto: una landing de campaña construida con SSG + caché en CDN a menudo superará a edge SSR simplemente porque evita trabajo en runtime por completo.

Documentación y hubs de contenido

Por defecto: SSG + ISR

  • Pre-renderiza páginas, cachea agresivamente
  • Usa invalidación basada en tags ligada a IDs de contenido o secciones
  • Prefiere índices de búsqueda estáticos o un proveedor de búsqueda dedicado (Algolia/Meilisearch) en lugar de renderizar resultados de búsqueda en el servidor

Cuándo ayuda el edge:

  • mirrors por región
  • control de acceso para docs privadas (pero mantén el HTML de docs cacheable cuando sea posible)

Dashboards autenticados

Por defecto: SSR (a menudo en el origen) + caché selectiva de datos

Los dashboards suelen ser:

  • altamente personalizados
  • con datos que cambian con frecuencia
  • sensibles a la corrección

Un buen patrón:

  • SSR para la carcasa y los datos críticos above-the-fold
  • cachear datos de referencia compartidos (feature flags, límites de plan, metadatos estáticos)
  • hacer streaming o lazy-load de paneles secundarios

Cuándo ayuda el edge:

  • comprobaciones ligeras de auth/sesión
  • enrutamiento a la región más cercana

Cuándo perjudica el edge:

  • si cada petición dispara múltiples llamadas de vuelta a una región centralizada de base de datos

Prueba de fuego: Si el edge SSR aún necesita hacer round-trip a us-east-1 para consultas a la base de datos, quizá estés añadiendo un salto extra y aumentando la latencia de cola.

E-commerce (categoría, PDP, carrito, checkout)

E-commerce necesita una mente dividida:

  • Páginas de categoría (PLP): ISR + caché en CDN; tolera ligera desactualización
  • Páginas de detalle de producto (PDP): ISR para el contenido base + precio/disponibilidad dinámicos como una isla
  • Carrito/checkout: SSR, JS mínimo, presupuestos de rendimiento implacables

Trampas de caché aquí:

  • la personalización (recomendaciones) puede destruir el hit rate
  • precio/disponibilidad pueden ser específicos por región y sensibles al tiempo

Un enfoque pragmático:

  • cachea el HTML del PDP con un TTL corto o ISR
  • obtiene precio/stock vía una API rápida con caché agresiva en la capa de datos

Referencia del mundo real: los equipos a menudo combinan páginas de producto cacheadas en CDN con lógica en el edge para geo/moneda y SSR en el origen solo para checkout.


Estrategias de caché que sobreviven al tráfico real

La caché es donde se gana o se pierde el rendimiento. El objetivo no es “cachear todo”. El objetivo es:

  • maximizar el hit rate de caché
  • mantener la corrección
  • mantener la invalidación comprensible

1) Caché en CDN: el multiplicador de rendimiento por defecto

Si tu HTML se puede cachear, hazlo.

Guías prácticas:

  • Usa TTL largo para assets realmente estáticos
  • Para HTML, usa comportamiento stale-while-revalidate cuando corresponda
  • Ten cuidado con Vary: cada dimensión de Vary puede disparar tu caché

Idea clave: las claves de caché son decisiones de producto. Si varías por usuario, has renunciado a la escala de la CDN.

2) Stale-while-revalidate (SWR): velocidad con frescura controlada

SWR funciona porque:

  • sirve una respuesta cacheada inmediatamente (LCP rápido)
  • refresca en segundo plano (frescura eventual)

Usa SWR para:

  • páginas de marketing ligadas a un CMS
  • catálogos de producto
  • docs que se actualizan periódicamente

Evita SWR para:

  • flujos sensibles a seguridad o transaccionales
  • páginas donde “obsoleto” es incorrecto (saldos, inventario en checkout)

3) Invalidación basada en tags: la única forma sensata de escalar ISR

La revalidación basada en tiempo es simple pero burda. La invalidación basada en tags te permite invalidar con precisión.

Patrón:

  • Etiqueta páginas y datos por entidad: product:123, category:boots, doc:getting-started
  • Cuando cambia el contenido, invalida por tag

Esto mantiene:

  • rebuild/revalidación focalizados
  • alta frescura sin matar el hit rate

4) Trampas de personalización: muerte por fragmentación de caché

La personalización es la forma más rápida de convertir un 90% de hit rate en 0%.

Errores comunes:

  • renderizar contenido específico del usuario en el HTML principal
  • variar el HTML por demasiadas dimensiones (usuario, plan, locale, experimento, dispositivo)
  • incrustar contenido derivado de sesión en server components, forzando renderizado dinámico en todas partes

Mejores patrones:

  • mantener la carcasa de la página cacheable
  • cargar secciones personalizadas como islas en el cliente o fragmentos en streaming
  • usar middleware en el edge para decisiones gruesas (locale, país, bucket de experimento) pero mantener pequeño el número de variantes

Nota: Si no puedes explicar tu clave de caché en una sola frase, estás construyendo un incidente.


Anti-patrones comunes: lo que de verdad hace lentas las apps de Next.js

1) Cascadas de datos (servidor o cliente)

Una cascada ocurre cuando la petición B espera a la petición A innecesariamente.

Arreglos:

  • hacer fetch en paralelo cuando sea posible
  • colapsar múltiples llamadas al backend en un endpoint BFF diseñado a propósito
  • empujar la agregación hacia la base de datos cuando sea seguro

Referencias de tooling:

  • usa Server-Timing para exponer fases del backend
  • usa tracing (OpenTelemetry) para ver cadenas de dependencias

2) JavaScript sobredimensionado y “app shell en todas partes”

Puedes renderizar en el edge todo el mundo y aun así fallar CWV si envías un bundle de cliente pesado.

Arreglos:

  • imponer presupuestos de bundle a nivel de ruta
  • preferir server components cuando reduzcan JS en el cliente (sin forzar renderizado dinámico innecesariamente)
  • auditar scripts de terceros sin piedad (tag managers, widgets de chat, tooling de A/B)

3) Páginas “dinámicas por defecto”

Un modo de fallo sorprendentemente común en frameworks modernos es hacer páginas dinámicas sin querer:

  • leer cookies de una forma que fuerza renderizado dinámico
  • mezclar datos personalizados en páginas compartidas
  • desactivar la caché globalmente “por si acaso”

Arreglo:

  • decidir por ruta: estática, revalidada o dinámica
  • aislar la personalización en componentes específicos
  • documentar el contrato de caché para cada tipo de página

Observabilidad: medir mejoras y regresiones

Si no puedes medirlo, no puedes desplegarlo con seguridad.

Qué instrumentar

  1. RUM (Real User Monitoring)

    • Rastrea CWV por plantilla de ruta, clase de dispositivo y geografía
    • Herramientas: Google web-vitals + tu pipeline de analítica, o proveedores como SpeedCurve, Datadog RUM, New Relic
  2. Monitorización sintética

    • Detecta regresiones antes de que lo hagan los usuarios
    • Herramientas: Lighthouse CI, WebPageTest, tests de rendimiento basados en Playwright
  3. Server timing y tracing

    • Añade cabeceras Server-Timing para:
      • estado de caché (HIT/MISS)
      • tiempo de render
      • tiempo de API upstream
      • tiempo de base de datos
    • Usa tracing distribuido (OpenTelemetry) para ver latencia end-to-end

Cómo interpretar resultados (la parte en la que los equipos se equivocan)

  • Mira p75 para cumplimiento de CWV, pero también sigue p95 para consistencia de UX
  • Segmenta por cache hit vs miss: muchos sitios “rápidos” solo son rápidos en hits
  • Compara antes/después por plantilla de ruta, no por promedios de todo el sitio

Conclusión concreta: un cambio que mejora el LCP mediano pero empeora el TTFB p95 puede ser netamente negativo para usuarios reales.


Arquitectura de referencia: un stack pragmático de rendimiento en Next.js

Un patrón que funciona para la mayoría de equipos:

1) Clasificación de rutas

  • Estáticas (SSG): marketing, índice de docs, páginas evergreen
  • Revalidadas (ISR + tags): páginas de contenido, páginas de producto, páginas de categoría
  • Dinámicas (SSR): cuenta, carrito, checkout, admin

2) Capas de caché

  • Caché CDN para HTML cuando sea posible
  • Caché de datos para fetches compartidos (datos de referencia, catálogos)
  • Caché de cliente para datos específicos del usuario (React Query/SWR) con hidratación cuidadosa

3) Uso del edge: delgado e intencional

Usa el edge para:

  • enrutamiento (geo/locale)
  • detección de bots y modelado básico de peticiones
  • asignación ligera de experimentos

Evita el edge para:

  • renderizado pesado que depende de bases de datos centralizadas
  • grafos de dependencias complejos que son difíciles de depurar bajo restricciones del edge

Checklist de despliegue: entrega mejoras de rendimiento sin drama

  1. Elige un tipo de página (p. ej., PDP o landings de marketing)
  2. Define la métrica objetivo (p. ej., p75 LCP -300ms; mantener INP)
  3. Mapea la clave de caché y documéntala
  4. Implementa modo de renderizado + caché de forma deliberada (no “dinámico por defecto”)
  5. Añade instrumentación:
    • segmentación de rutas en RUM
    • Server-Timing para caché/render/upstream
    • tests sintéticos para flujos clave
  6. Ejecuta un A/B o un rollout gradual
  7. Vigila p95 y tasas de error (no solo promedios)
  8. Fija presupuestos:
    • límites de bundle JS por ruta
    • aprobaciones de scripts de terceros
    • puertas de rendimiento en CI (umbrales de Lighthouse CI)

Conclusión: la app de Next.js más rápida es la que se puede cachear

El renderizado en el edge es potente—pero no es un atajo hacia un gran rendimiento. Los equipos que de forma consistente logran buenos Core Web Vitals hacen tres cosas bien:

  • eligen modos de renderizado por tipo de página, no por ideología
  • diseñan cachés con claves e invalidación explícitas, no con esperanza
  • miden resultados con RUM + server timing + sintéticos, no con sensaciones

Si quieres un siguiente paso práctico: audita tus 10 rutas principales por tráfico e ingresos, clasifícalas (estática/revalidada/dinámica) y luego rediseña los límites de caché y personalización para maximizar hits de caché sin romper la corrección. Ahí es donde viven las mayores mejoras, las más repetibles.