Entornos de ejecución Edge y Node.js

En el contexto de Next.js, el entorno de ejecución (runtime) se refiere al conjunto de bibliotecas, APIs y funcionalidad general disponible para tu código durante la ejecución.

En el servidor, hay dos entornos de ejecución donde partes del código de tu aplicación pueden renderizarse:

  • El Entorno Node.js (predeterminado) tiene acceso a todas las APIs de Node.js y paquetes compatibles del ecosistema.
  • El Entorno Edge está basado en APIs Web.

Diferencias entre entornos de ejecución

Hay muchas consideraciones al elegir un entorno de ejecución. Esta tabla muestra las principales diferencias de un vistazo. Para un análisis más detallado, consulta las secciones siguientes.

Node.jsServerlessEdge
Arranque en frío/NormalBajo
Streaming HTTP
E/STodasTodasfetch
Escalabilidad/AltaMáxima
SeguridadNormalAltaAlta
LatenciaNormalBajaMínima
Paquetes npmTodosTodosUn subconjunto
Renderizado estáticoNo
Renderizado dinámico
Revalidación de datos con fetch

Entorno Edge

En Next.js, el ligero entorno Edge es un subconjunto de las APIs disponibles de Node.js.

El entorno Edge es ideal si necesitas entregar contenido dinámico y personalizado con baja latencia usando funciones pequeñas y simples. La velocidad del entorno Edge proviene de su uso mínimo de recursos, pero esto puede ser limitante en muchos escenarios.

Por ejemplo, el código ejecutado en el entorno Edge en Vercel no puede exceder entre 1 MB y 4 MB, este límite incluye paquetes importados, fuentes y archivos, y variará según tu infraestructura de despliegue. Además, el entorno Edge no soporta todas las APIs de Node.js, lo que significa que algunos paquetes npm pueden no funcionar. Por ejemplo, errores como "Module not found: Can't resolve 'fs'" o similares. Recomendamos usar el entorno Node.js si necesitas usar estas APIs o paquetes.

Entorno Node.js

Usar el entorno Node.js te da acceso a todas las APIs de Node.js y todos los paquetes npm que dependen de ellas. Sin embargo, no arranca tan rápido como las rutas que usan el entorno Edge.

Desplegar tu aplicación Next.js en un servidor Node.js requerirá gestionar, escalar y configurar tu infraestructura. Alternativamente, puedes considerar desplegar tu aplicación Next.js en una plataforma serverless como Vercel, que manejará esto por ti.

Node.js Serverless

Serverless es ideal si necesitas una solución escalable que pueda manejar cargas computacionales más complejas que el entorno Edge. Con Funciones Serverless en Vercel, por ejemplo, el tamaño total de tu código es 50MB incluyendo paquetes importados, fuentes y archivos.

La desventaja comparado con rutas que usan Edge es que las Funciones Serverless pueden tardar cientos de milisegundos en arrancar antes de comenzar a procesar solicitudes. Dependiendo del tráfico que reciba tu sitio, esto podría ocurrir con frecuencia ya que las funciones no siempre están "calientes".

Ejemplos

Opción de entorno por segmento

Puedes especificar un entorno de ejecución para segmentos de ruta individuales en tu aplicación Next.js. Para hacerlo, declara una variable llamada runtime y expórtala. La variable debe ser un string y tener un valor de 'nodejs' o 'edge'.

El siguiente ejemplo muestra un segmento de ruta de página que exporta un runtime con valor 'edge':

export const runtime = 'edge' // 'nodejs' (predeterminado) | 'edge'
export const runtime = 'edge' // 'nodejs' (predeterminado) | 'edge'

También puedes definir runtime a nivel de layout, lo que hará que todas las rutas bajo ese layout se ejecuten en el entorno Edge:

export const runtime = 'edge' // 'nodejs' (predeterminado) | 'edge'
export const runtime = 'edge' // 'nodejs' (predeterminado) | 'edge'

Si el entorno del segmento no está configurado, se usará el entorno predeterminado nodejs. No necesitas usar la opción runtime si no planeas cambiar del entorno Node.js.

Consulta la documentación de Node.js y la documentación Edge para ver la lista completa de APIs disponibles. Ambos entornos también pueden soportar streaming dependiendo de tu infraestructura de despliegue.