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
:
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
как зависимость:
npm i sharp
yarn add sharp
pnpm add sharp
bun add sharp
Ограничения
- При трассировке в настройках монорепозитория по умолчанию используется директория проекта. Для
next build packages/web-app
корнем трассировки будетpackages/web-app
, и файлы вне этой папки не будут включены. Чтобы включить файлы вне этой папки, вы можете установитьexperimental.outputFileTracingRoot
в вашемnext.config.js
.
module.exports = {
experimental: {
// это включает файлы из базового монорепозитория на два уровня выше
outputFileTracingRoot: path.join(__dirname, '../../'),
},
}
- В некоторых случаях Next.js может не включить необходимые файлы или ошибочно включить неиспользуемые файлы. В таких случаях вы можете использовать
experimental.outputFileTracingExcludes
иexperimental.outputFileTracingIncludes
соответственно вnext.config.js
. Каждая конфигурация принимает объект с minimatch globs для ключа, чтобы соответствовать определенным страницам, и массив с globs относительно корня проекта для включения или исключения из трассировки.
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
:
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
},
},
}