output
Durante una compilación, Next.js rastreará automáticamente cada página y sus dependencias para determinar todos los archivos necesarios para desplegar una versión en producción de tu aplicación.
Esta característica ayuda a reducir drásticamente el tamaño de los despliegues. Anteriormente, al desplegar con Docker necesitabas tener todos los archivos de las dependencies
de tu paquete instalados para ejecutar next start
. A partir de Next.js 12, puedes aprovechar el Rastreo de Archivos de Salida (Output File Tracing) en el directorio .next/
para incluir solo los archivos necesarios.
Además, esto elimina la necesidad del objetivo obsoleto serverless
, que puede causar varios problemas y también crea duplicación innecesaria.
Cómo Funciona
Durante next build
, Next.js usará @vercel/nft
para analizar estáticamente el uso de import
, require
y fs
para determinar todos los archivos que una página podría cargar.
El servidor de producción de Next.js también es rastreado para sus archivos necesarios y se genera en .next/next-server.js.nft.json
, que puede ser aprovechado en producción.
Para aprovechar los archivos .nft.json
generados en el directorio de salida .next
, puedes leer la lista de archivos en cada rastreo que son relativos al archivo .nft.json
y luego copiarlos a tu ubicación de despliegue.
Copia Automática de Archivos Rastreados
Next.js puede crear automáticamente una carpeta standalone
que copia solo los archivos necesarios para un despliegue en producción, incluyendo archivos selectos en node_modules
.
Para aprovechar esta copia automática, puedes habilitarla en tu next.config.js
:
Esto creará una carpeta en .next/standalone
que luego puede ser desplegada por sí misma sin instalar node_modules
.
Adicionalmente, también se genera un archivo mínimo server.js
que puede usarse en lugar de next start
. Este servidor mínimo no copia las carpetas public
o .next/static
por defecto, ya que idealmente deberían ser manejadas por un CDN, aunque estas carpetas pueden copiarse manualmente a standalone/public
y standalone/.next/static
, después de lo cual el archivo server.js
las servirá automáticamente.
Para copiarlas manualmente, puedes usar la herramienta de línea de comandos cp
después de ejecutar next build
:
Para iniciar tu archivo mínimo server.js
localmente, ejecuta el siguiente comando:
Es bueno saber:
next.config.js
se lee durantenext build
y se serializa en el archivo de salidaserver.js
. Si se están usando las opciones obsoletasserverRuntimeConfig
opublicRuntimeConfig
, los valores serán específicos a los valores en el momento de la compilación.- Si tu proyecto necesita escuchar en un puerto o nombre de host específico, puedes definir las variables de entorno
PORT
oHOSTNAME
antes de ejecutarserver.js
. Por ejemplo, ejecutaPORT=8080 HOSTNAME=0.0.0.0 node server.js
para iniciar el servidor enhttp://0.0.0.0:8080
.
Advertencias
- En configuraciones de monorepos, el directorio del proyecto se usa para el rastreo por defecto. Para
next build packages/web-app
,packages/web-app
sería la raíz del rastreo y cualquier archivo fuera de esa carpeta no será incluido. Para incluir archivos fuera de esta carpeta, puedes configuraroutputFileTracingRoot
en tunext.config.js
.
- Hay algunos casos en los que Next.js podría fallar al incluir archivos necesarios, o podría incluir incorrectamente archivos no utilizados. En esos casos, puedes usar
outputFileTracingExcludes
youtputFileTracingIncludes
respectivamente ennext.config.js
. Cada configuración acepta un objeto con globs minimatch para la clave que coincide con páginas específicas y un valor de un array con globs relativos a la raíz del proyecto para incluir o excluir en el rastreo.
Nota: La clave de outputFileTracingIncludes
/outputFileTracingExcludes
es un glob, por lo que los caracteres especiales necesitan ser escapados.
Experimental turbotrace
El rastreo de dependencias puede ser lento porque requiere cálculos y análisis muy complejos. Creamos turbotrace
en Rust como una alternativa más rápida e inteligente a la implementación en JavaScript.
Para habilitarlo, puedes añadir la siguiente configuración a tu next.config.js
: