introduction

在构建期间,Next.js 将自动的跟踪每一个文件以及它的依赖去决定一个部署一个生产版本的应用所需要的文件 …

这个特性帮助你极大的减少部署的尺寸,之前,当你使用Docker 部署的时候你需要将package中的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文件,你需要在每一个跟踪中读取和.nft.json文件相关的文件列表并复制它们到你的部署位置 ..

自动复制跟踪的文件(实验性)

Next.js 将自动的创建一个standalone文件夹,它会复制对于生产部署所需要的必要的文件(包括在node_modules中 选择的文件) ..

为了利用自动复制,你需要在next.config.js中启用它:

  1. module.exports = {
  2. experimental: {
  3. outputStandalone: true,
  4. },
  5. }

这将在.next/standalone创建一个文件夹,这能够部署而无需安装node_modules

此外,一个最小化的server.js文件也将会被输出能够被使用来替代next start,这个最小化的服务器并不会处理提供的static目录(相反应该通过CDN 代替)

注意

  • 当monorepo 配置之后的监听,项目目录默认被用来监听 , 对于next build packages/web-app,packages/web-app能能够被用来跟踪根以及这个目录之外的任何文件将不会被包括 ..

为了包括在这个目录之外的文件你能够设置experimental.outputFileTracingRootnext.config.js

  1. // packages/web-app/next.config.js
  2. module.exports = {
  3. experimental: {
  4. // this includes files from the monorepo base two directories up
  5. outputFileTracingRoot: path.join(__dirname, '../../'),
  6. },
  7. }
  • 有些情况Next.js 可能无法包括需要的文件,或者可能不正确的包括了有些不需要的文件,在这些情况下,你能分别暴露页面配置属性unstable_includeFiles以及unstable_excludeFiles

每一个属性接收globs)的数组(glob 是一种普通表达式(类似于正则,但是它的功能性要简单、弱一些)),并且这些glob相对于项目的根(要么从跟踪中包括或者排除)

  • 当前来说,Next.js 不会对以.nft.json形式的文件做任何事情 …

这些文件必须由部署平台读取,例如Vercel,去创建一个最小化部署,在未来,一个新的命令将计划利用这些.nft.json