output
在构建过程中,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
,这可以在生产环境中使用。
要利用输出到 .next
目录的 .nft.json
文件,你可以读取每个追踪中相对于 .nft.json
文件的文件列表,然后将它们复制到你的部署位置。
自动复制追踪文件
Next.js 可以自动创建一个 standalone
文件夹,只复制生产部署所需的必要文件,包括 node_modules
中的特定文件。
要启用这个自动复制功能,你可以在 next.config.js
中进行配置:
这将在 .next/standalone
创建一个文件夹,该文件夹可以独立部署,无需安装 node_modules
。
此外,还会输出一个最小化的 server.js
文件,可以用来替代 next start
。这个最小化服务器默认不会复制 public
或 .next/static
文件夹,因为这些文件夹最好由 CDN 处理。不过,这些文件夹可以手动复制到 standalone/public
和 standalone/.next/static
文件夹中,之后 server.js
文件将自动服务这些文件。
值得注意的是:
- 如果你的项目需要监听特定端口或主机名,你可以在运行
server.js
之前定义PORT
或HOSTNAME
环境变量。例如,运行PORT=8080 HOSTNAME=0.0.0.0 node server.js
以在http://0.0.0.0:8080
启动服务器。
注意事项
- 在 monorepo 设置中进行追踪时,默认使用项目目录作为追踪根目录。对于
next build packages/web-app
,packages/web-app
将作为追踪根目录,该文件夹外的任何文件都不会被包含。要包含此文件夹外的文件,你可以在next.config.js
中设置outputFileTracingRoot
。
- 在某些情况下,Next.js 可能无法包含必需的文件,或可能错误地包含未使用的文件。在这些情况下,你可以在
next.config.js
中分别使用outputFileTracingExcludes
和outputFileTracingIncludes
。每个配置接受一个对象,其中键为 minimatch globs 用于匹配特定页面,值为一个数组,包含相对于项目根目录的 globs,用于在追踪中包含或排除文件。
注意: outputFileTracingIncludes
/outputFileTracingExcludes
的键是一个 glob,因此需要转义特殊字符。
- 目前,Next.js 不会对生成的
.nft.json
文件做任何处理。这些文件必须由你的部署平台(例如 Vercel)读取,以创建最小化部署。在未来的版本中,计划添加一个新命令来使用这些.nft.json
文件。
实验性的 turbotrace
追踪依赖项可能会很慢,因为它需要非常复杂的计算和分析。我们用 Rust 创建了 turbotrace
,作为 JavaScript 实现的一个更快、更智能的替代方案。
要启用它,你可以在 next.config.js
中添加以下配置: