架构概览
OpenNext 不会创建底层基础设施。你可以使用喜欢的工具为应用创建基础设施——SST、AWS CDK、Terraform、Serverless Framework 等。
这是推荐的设置。

我们将逐一查看 OpenNext 创建的每个组件。
资源文件
OpenNext 将创建一个 .open-next/assets 文件夹,包含哈希化和未哈希化的文件。这些文件可以直接提供服务,无需经过服务器函数。.open-next/assets 中的文件应从网站的根目录提供服务。例如,文件 .open-next/assets/favicon.ico 应从 /favicon.ico 提供服务。
.open-next/assets 文件夹中有两种类型的文件:
哈希化文件
这些是文件名中包含哈希组件的文件。哈希化文件位于 .open-next/assets/_next 文件夹中,例如 .open-next/assets/_next/static/css/0275f6d90e7ad339.css。当文件内容被修改时,文件名中的哈希值保证会更改。因此,哈希化文件应在 CDN 级别和浏览器级别都进行缓存。这些文件推荐的缓存控制设置是
public,max-age=31536000,immutable未哈希化文件
.open-next/assets 文件夹中的其他文件是从应用的 public/ 文件夹复制而来的,例如 .open-next/assets/favicon.ico。当内容被修改时,未哈希化文件的文件名可能保持不变。未哈希化文件应在 CDN 级别缓存,但不在浏览器级别缓存。当未哈希化文件的内容被修改时,部署时应使 CDN 缓存失效。这些文件推荐的缓存控制设置是
public,max-age=0,s-maxage=31536000,must-revalidate缓存文件
OpenNext 将创建一个 .open-next/cache 文件夹,包含增量缓存(即 ISR 和 SSG 路由)使用的缓存数据。这些文件不应公开访问。
.open-next/cache 文件夹中有两种类型的缓存:
- 路由缓存:此缓存包括构建期间预渲染的
html和json或rsc文件。它们被合并到一个.cache文件中。它们用于初始化重新验证缓存。 - Fetch 缓存:此缓存包括 fetch 调用响应,可能包含敏感信息。确保这些文件不可公开访问。
图像优化后端
当使用 Next.js <Image> 组件时,此后端处理图像优化请求。捆绑在函数中的 sharp (opens in a new tab) 库用于转换图像。该库针对所选架构(默认为 arm64)编译,旨在运行于 Node 上。
请注意,图像优化后端会响应 Cache-Control 头,因此图像将在 CDN 级别和浏览器级别都被缓存。
参见 图像优化 了解更多详情。
服务器 Lambda 后端
这些后端处理来自 Next.js 应用的所有其他类型的请求,包括服务器端渲染 (SSR) 请求、增量静态再生 (ISR) 请求、静态站点生成 (SSG) 请求和 API 请求。OpenNext 以 standalone 模式构建 Next.js 应用。standalone 模式生成一个 .next 文件夹,其中包含处理请求的 NextServer 类,以及一个 node_modules 文件夹,其中包含运行 NextServer 所需的所有依赖项。结构如下:
.next/ -> NextServer
node_modules/ -> 依赖项服务器后端适配器围绕 NextServer 包装,并导出一个支持 Lambda 请求和响应的处理函数。server-function 包如下所示:
.next/ -> NextServer
+ .open-next/
node_modules/ -> 依赖项
+ index.mjs -> 服务器函数适配器Monorepo
在 monorepo 的情况下,构建输出看起来略有不同。例如,如果应用位于 packages/web,构建输出如下所示:
packages/
web/
.next/ -> NextServer
node_modules/ -> 来自根 node_modules 的依赖项(可选)
node_modules/ -> 来自包 node_modules 的依赖项在这种情况下,服务器函数适配器需要在 packages/web 内部紧邻 .next/ 创建。这是为了确保适配器可以从两个 node_modules 文件夹导入依赖项。将 Lambda 配置与项目结构耦合不是好的实践,因此我们不将 Lambda 处理程序设置为 packages/web/index.mjs,而是在 server-function 包根目录添加一个包装器 index.mjs 来重新导出适配器。最终结构如下所示:
packages/
web/
.next/ -> NextServer
+ .open-next/
node_modules/ -> 来自根 node_modules 的依赖项(可选)
+ index.mjs -> 服务器函数适配器
node_modules/ -> 来自包 node_modules 的依赖项
+ index.mjs -> 适配器包装器这确保函数处理程序保持在 index.mjs。
重新验证后端
OpenNext 将创建一个 .open-next/revalidation-function 文件夹,包含重新验证后端。
此后端旨在处理来自重新验证队列的重新验证请求。重新验证队列是一个 FIFO 队列,包含用于重新验证路由的消息。重新验证后端轮询队列以获取消息,并向指定路由发送 HEAD 请求以进行重新验证。
预热后端
OpenNext 将创建一个 .open-next/warmer-function 文件夹,包含预热后端。
阅读更多关于 预热如何工作 的内容。
标签提供者后端
这用于用标签填充重新验证表。