Вывод
Во время сборки Next.js автоматически отслеживает каждую страницу и ее зависимости, чтобы определить все файлы, необходимые для развертывания производственной версии вашего приложения.
Эта функция помогает значительно уменьшить размер развертываний. Раньше, при развертывании с 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, что можно использовать в производстве.
Чтобы использовать файлы .nft.json, выпущенные в выходной каталог .next, вы можете прочитать список файлов в каждом трассировочном файле, относящихся к файлу .nft.json, и затем скопировать их в место развертывания.
Автоматическое копирование отслеженных файлов
Next.js может автоматически создать папку standalone, которая копирует только необходимые файлы для развертывания в производстве, включая выбранные файлы в 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 будет автоматически обслуживать их.
Важно знать:
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.- Если ваш проект использует Оптимизацию изображений с параметрами по умолчанию
loader, вы должны установитьsharpв качестве зависимости:
npm i sharp
yarn add sharp
pnpm add sharp
bun add sharp
Ограничения
- При отслеживании в установках monorepo по умолчанию используется каталог проекта. Для
next build packages/web-app,packages/web-appбудет корнем отслеживания, и любые файлы за пределами этой папки не будут включены. Чтобы включить файлы за пределами этой папки, вы можете установитьexperimental.outputFileTracingRootв своемnext.config.js.
module.exports = {
experimental: {
// this includes files from the monorepo base two directories up
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: {
// control the log level of the turbotrace, default is `error`
logLevel?:
| 'bug'
| 'fatal'
| 'error'
| 'warning'
| 'hint'
| 'note'
| 'suggestions'
| 'info',
// control if the log of turbotrace should contain the details of the analysis, default is `false`
logDetail?: boolean
// show all log messages without limit
// turbotrace only show 1 log message for each categories by default
logAll?: boolean
// control the context directory of the turbotrace
// files outside of the context directory will not be traced
// set the `experimental.outputFileTracingRoot` has the same effect
// if the `experimental.outputFileTracingRoot` and this option are both set, the `experimental.turbotrace.contextDirectory` will be used
contextDirectory?: string
// if there is `process.cwd()` expression in your code, you can set this option to tell `turbotrace` the value of `process.cwd()` while tracing.
// for example the require(process.cwd() + '/package.json') will be traced as require('/path/to/cwd/package.json')
processCwd?: string
// control the maximum memory usage of the `turbotrace`, in `MB`, default is `6000`.
memoryLimit?: number
},
},
}
© 2024 Vercel, Inc.
Licensed under the MIT License.
https://nextjs.org/docs/pages/api-reference/next-config-js/output