output

Во время сборки Next.js автоматически отслеживает каждую страницу и её зависимости, чтобы определить все файлы, необходимые для развертывания production-версии вашего приложения.

Эта функция значительно уменьшает размер развертываний. Ранее при развертывании с Docker требовалось установить все файлы из dependencies вашего пакета для запуска next start. Начиная с Next.js 12, вы можете использовать трассировку выходных файлов в директории .next/, чтобы включить только необходимые файлы.

Кроме того, это устраняет необходимость в устаревшей цели serverless, которая может вызывать различные проблемы и создавать избыточное дублирование.

Как это работает

Во время next build Next.js использует @vercel/nft для статического анализа использования import, require и fs, чтобы определить все файлы, которые может загрузить страница.

Продуктовый сервер Next.js также трассируется на предмет необходимых файлов, и результат сохраняется в .next/next-server.js.nft.json, который можно использовать в production.

Чтобы использовать файлы .nft.json, созданные в выходной директории .next, вы можете прочитать список файлов в каждой трассировке, которые относятся к файлу .nft.json, а затем скопировать их в место развертывания.

Автоматическое копирование трассированных файлов

Next.js может автоматически создать папку standalone, которая копирует только необходимые файлы для production-развертывания, включая выбранные файлы в node_modules.

Чтобы использовать это автоматическое копирование, вы можете включить его в вашем next.config.js:

next.config.js
module.exports = {
  output: 'standalone',
}

Это создаст папку .next/standalone, которую затем можно развернуть самостоятельно без установки node_modules.

Дополнительно также создается минимальный файл server.js, который можно использовать вместо next start. Этот минимальный сервер по умолчанию не копирует папки public или .next/static, так как в идеале они должны обрабатываться CDN, хотя эти папки можно вручную скопировать в standalone/public и standalone/.next/static, после чего файл server.js будет автоматически их обслуживать.

Для ручного копирования вы можете использовать инструмент командной строки cp после выполнения next build:

Terminal
cp -r public .next/standalone/ && cp -r .next/static .next/standalone/.next/

Чтобы запустить ваш минимальный файл server.js локально, выполните следующую команду:

Terminal
node .next/standalone/server.js

Полезно знать:

  • next.config.js читается во время next build и сериализуется в выходной файл server.js. Если используются устаревшие опции serverRuntimeConfig или publicRuntimeConfig, значения будут соответствовать значениям на момент сборки.
  • Если вашему проекту нужно прослушивать определенный порт или имя хоста, вы можете определить переменные окружения PORT или HOSTNAME перед запуском server.js. Например, выполните PORT=8080 HOSTNAME=0.0.0.0 node server.js, чтобы запустить сервер на http://0.0.0.0:8080.

Ограничения

  • При трассировке в настройках монорепозитория по умолчанию используется директория проекта. Для next build packages/web-app корнем трассировки будет packages/web-app, и файлы за пределами этой папки не будут включены. Чтобы включить файлы вне этой папки, вы можете установить outputFileTracingRoot в вашем next.config.js.
packages/web-app/next.config.js
module.exports = {
  // это включает файлы из базового монорепозитория на два уровня выше
  outputFileTracingRoot: path.join(__dirname, '../../'),
}
  • Бывают случаи, когда Next.js может не включить необходимые файлы или ошибочно включить неиспользуемые файлы. В таких случаях вы можете использовать outputFileTracingExcludes и outputFileTracingIncludes соответственно в next.config.js. Каждая конфигурация принимает объект с minimatch globs для ключа, чтобы соответствовать определенным страницам, и массив с globs относительно корня проекта для включения или исключения в трассировке.
next.config.js
module.exports = {
  outputFileTracingExcludes: {
    '/api/hello': ['./un-necessary-folder/**/*'],
  },
  outputFileTracingIncludes: {
    '/api/another': ['./necessary-folder/**/*'],
    '/api/login/\\[\\[\\.\\.\\.slug\\]\\]': [
      './node_modules/aws-crt/dist/bin/**/*',
    ],
  },
}

Примечание: Ключ outputFileTracingIncludes/outputFileTracingExcludes — это glob, поэтому специальные символы должны быть экранированы.

Экспериментальный turbotrace

Трассировка зависимостей может быть медленной, поскольку требует очень сложных вычислений и анализа. Мы создали turbotrace на Rust как более быструю и интеллектуальную альтернативу реализации на JavaScript.

Чтобы включить его, вы можете добавить следующую конфигурацию в ваш next.config.js:

next.config.js
module.exports = {
  experimental: {
    turbotrace: {
      // управление уровнем логирования turbotrace, по умолчанию `error`
      logLevel?:
      | 'bug'
      | 'fatal'
      | 'error'
      | 'warning'
      | 'hint'
      | 'note'
      | 'suggestions'
      | 'info',
      // управление, должны ли логи turbotrace содержать детали анализа, по умолчанию `false`
      logDetail?: boolean
      // показывать все сообщения логов без ограничений
      // turbotrace по умолчанию показывает только 1 сообщение для каждой категории
      logAll?: boolean
      // управление контекстной директорией turbotrace
      // файлы вне контекстной директории не будут трассироваться
      // установка `outputFileTracingRoot` имеет тот же эффект
      // если установлены и `outputFileTracingRoot`, и эта опция, будет использоваться `experimental.turbotrace.contextDirectory`
      contextDirectory?: string
      // если в вашем коде есть выражение `process.cwd()`, вы можете установить эту опцию, чтобы указать `turbotrace` значение `process.cwd()` во время трассировки.
      // например, require(process.cwd() + '/package.json') будет трассироваться как require('/path/to/cwd/package.json')
      processCwd?: string
      // управление максимальным использованием памяти `turbotrace`, в `MB`, по умолчанию `6000`.
      memoryLimit?: number
    },
  },
}