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
中启用它:
module.exports = {
experimental: {
outputStandalone: true,
},
}
这将在.next/standalone
创建一个文件夹,这能够部署而无需安装node_modules
此外,一个最小化的server.js
文件也将会被输出能够被使用来替代next start
,这个最小化的服务器并不会处理提供的static
目录(相反应该通过CDN 代替)
注意
- 当monorepo 配置之后的监听,项目目录默认被用来监听 , 对于
next build packages/web-app
,packages/web-app
能能够被用来跟踪根以及这个目录之外的任何文件将不会被包括 ..
为了包括在这个目录之外的文件你能够设置experimental.outputFileTracingRoot
到next.config.js
// packages/web-app/next.config.js
module.exports = {
experimental: {
// this includes files from the monorepo base two directories up
outputFileTracingRoot: path.join(__dirname, '../../'),
},
}
- 有些情况Next.js 可能无法包括需要的文件,或者可能不正确的包括了有些不需要的文件,在这些情况下,你能分别暴露页面配置属性
unstable_includeFiles
以及unstable_excludeFiles
…
每一个属性接收globs)的数组(glob 是一种普通表达式(类似于正则,但是它的功能性要简单、弱一些)),并且这些glob相对于项目的根(要么从跟踪中包括或者排除)
- 当前来说,Next.js 不会对以
.nft.json
形式的文件做任何事情 …
这些文件必须由部署平台读取,例如Vercel,去创建一个最小化部署,在未来,一个新的命令将计划利用这些.nft.json