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
будет автоматически их обслуживать.
Для ручного копирования вы можете использовать инструмент командной строки cp
после выполнения next build
:
cp -r public .next/standalone/ && cp -r .next/static .next/standalone/.next/
Чтобы запустить ваш минимальный файл server.js
локально, выполните следующую команду:
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
.
module.exports = {
// это включает файлы из базового монорепозитория на два уровня выше
outputFileTracingRoot: path.join(__dirname, '../../'),
}
- Бывают случаи, когда Next.js может не включить необходимые файлы или ошибочно включить неиспользуемые файлы. В таких случаях вы можете использовать
outputFileTracingExcludes
иoutputFileTracingIncludes
соответственно вnext.config.js
. Каждая конфигурация принимает объект с minimatch globs для ключа, чтобы соответствовать определенным страницам, и массив с globs относительно корня проекта для включения или исключения в трассировке.
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
:
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
},
},
}