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 будет автоматически их обслуживать.

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

  • Если вашему проекту нужно слушать определенный порт или имя хоста, вы можете определить переменные окружения PORT или HOSTNAME перед запуском server.js. Например, выполните PORT=8080 HOSTNAME=0.0.0.0 node server.js, чтобы запустить сервер на http://0.0.0.0:8080.
  • Если ваш проект использует Оптимизацию изображений с loader по умолчанию, вы должны установить sharp как зависимость:
Terminal
npm i sharp
Terminal
yarn add sharp
Terminal
pnpm add sharp
Terminal
bun add sharp

Ограничения

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

Экспериментальный 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
      // файлы вне контекстной директории не будут трассироваться
      // установка `experimental.outputFileTracingRoot` имеет тот же эффект
      // если установлены и `experimental.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
    },
  },
}