跳到主要内容

output

在构建期间,Next.js 将自动跟踪每个页面及其依赖项,以确定部署应用程序生产版本所需的所有文件。

此功能有助于大幅减少部署的大小。以前,使用 Docker 部署时,你需要安装包的 dependencies 中的所有文件才能运行 next start。从 Next.js 12 开始,你可以利用 .next/ 目录中的输出文件跟踪来仅包含必要的文件。

此外,这消除了对已弃用的 serverless 目标的需求,该目标可能导致各种问题并创建不必要的重复。

工作原理

next build 期间,Next.js 将使用 @vercel/nft 静态分析 importrequirefs 使用情况,以确定页面可能加载的所有文件。

Next.js 的生产服务器也会被跟踪其需要的文件,并输出到 .next/next-server.js.nft.json,可以在生产中使用。

要利用输出到 .next 输出目录的 .nft.json 文件,你可以读取每个跟踪中相对于 .nft.json 文件的文件列表,然后将它们复制到你的部署位置。

自动复制跟踪文件

Next.js 可以自动创建一个 standalone 文件夹,该文件夹仅复制生产部署所需的必要文件,包括 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/publicstandalone/.next/static 文件夹,之后 server.js 文件将自动提供这些文件。

要手动复制这些文件,你可以在 next build 后使用 cp 命令行工具:

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

要在本地启动最小的 server.js 文件,请运行以下命令:

Terminal
node .next/standalone/server.js

提示

  • 如果你的项目需要监听特定端口或主机名,可以在运行 server.js 之前定义 PORTHOSTNAME 环境变量。例如,运行 PORT=8080 HOSTNAME=0.0.0.0 node server.jshttp://0.0.0.0:8080 启动服务器。

提示

  • next.config.jsnext build 期间被读取并序列化到 server.js 输出文件中。如果使用传统的 serverRuntimeConfigpublicRuntimeConfig 选项,值将特定于构建时的值。
  • 如果你的项目需要监听特定端口或主机名,可以在运行 server.js 之前定义 PORTHOSTNAME 环境变量。例如,运行 PORT=8080 HOSTNAME=0.0.0.0 node server.jshttp://0.0.0.0:8080 启动服务器。

注意事项

  • 在 monorepo 设置中进行跟踪时,默认使用项目目录进行跟踪。对于 next build packages/web-apppackages/web-app 将是跟踪根目录,该文件夹外的任何文件都不会被包含。要包含此文件夹外的文件,你可以在 next.config.js 中设置 outputFileTracingRoot
packages/web-app/next.config.js
module.exports = {
// 这包括来自 monorepo 基础两个目录的文件
outputFileTracingRoot: path.join(__dirname, '../../'),
}
  • 在某些情况下,Next.js 可能无法包含必需的文件,或者可能错误地包含未使用的文件。在这些情况下,你可以分别在 next.config.js 中利用 outputFileTracingExcludesoutputFileTracingIncludes。每个配置接受一个对象,其中包含用于匹配特定页面的 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,所以特殊字符需要转义。