以下是 open-next.config.ts
文件的详细示例。该文件需要与您的 next.config.js
文件位于同一目录下。
此处的 server
可以指代 Lambda 函数、Docker 容器、Node 服务器或任何能运行 Node.js 代码的环境,甚至包括 Cloudflare workers(需使用 @opennextjs/cloudflare
)。
有关此处选项的更多信息,请查看参考章节。
import type { OpenNextConfig } from "@opennextjs/aws/types/open-next";
const config = {
default: {
// 这是默认服务器,类似于 open-next v2 中的 server-function
// 您无需提供以下配置,默认会像 open-next v2 一样生成普通 Lambda 的输出
override: {
// 启用 Lambda 流式传输的必要配置,默认为 aws-lambda
wrapper: "aws-lambda-streaming",
// 转换服务器的输入和输出,默认为 aws-apigw-v2
converter: "aws-apigw-v2",
// 用于 fetch 缓存和 html/rsc/json 缓存,默认为 s3
incrementalCache: "s3",
// 用于外部重写,默认为 node
proxyExternalRequest: "node",
tagCache: "dynamodb", // 用于 revalidatePath 和 revalidateTag,默认为 dynamodb
// 您可以这样覆盖任何 `LazyLoadedOverride` 类型的部分
queue: () =>
Promise.resolve({
send: async (message) => {
// 在此处添加您的自定义代码
},
}),
},
// 这将在默认服务器函数中安装 sharp
// 仅为示例目的,您很可能不需要使用此配置
// 可在每个服务器上使用此配置来安装额外包
install: {
packages: ["sharp@0.33.5"],
arch: "arm64",
},
minify: true, // 这将压缩输出
},
// 下面定义我们希望在另一个服务器中部署的函数
// 仅在需要将服务器拆分为多个服务器时使用
functions: {
ssr: {
routes: [
"app/api/isr/route",
"app/api/sse/route",
"app/api/revalidateTag/route", // app 目录的 API 路由
"app/route1/page",
"app/route2/page", // app 目录的页面
"pages/route3", // pages 目录的页面
], // 对于 app 目录,需要包含 route|page,无需包含 layout 或 loading
// 模式需要符合 CloudFront 兼容格式
// 这将用于生成输出
patterns: ["api/*", "route1", "route2", "route3"],
override: {
wrapper: "aws-lambda-streaming",
},
// 启用捆绑的 Next 服务器,速度更快且减小服务器体积
// 此为实验性功能,可能不适用于所有情况
experimentalBundledNextServer: true, // 已弃用,Next 14.2+ 不再支持
},
pageSsr: {
// 对于 pages 目录,路由应为 `pages/${route}` 形式,不带扩展名
// 应与文件系统匹配
routes: ["pages/pageSsr"],
// BUILD_ID 是特殊情况,将被替换为实际构建 ID
patterns: ["pageSsr", "_next/data/BUILD_ID/pageSsr.json"],
override: {
wrapper: "node",
converter: "node",
// 这是生成 dockerfile 所必需的
// 也让实现知道需要在 docker 上部署
// 也可以在此处提供字符串用于创建 dockerfile
generateDockerfile: true,
},
},
edge: {
runtime: "edge",
routes: ["app/ssr/page"],
patterns: ["ssr"],
override: {},
},
},
// 设置此项将创建中间件的单独构建包
// 中间件将部署在单独的服务器中
// 如未设置,中间件将捆绑在服务器内部
// 可以是 lambda@edge、Cloudflare workers 或其他环境
// 默认使用 lambda@edge
// 参考实现中未实现此功能
// 此为可选配置,但在将应用拆分为多个服务器时可能需要
middleware: {
external: true,
},
// 可选
imageOptimization: {
loader: "s3-lite", // 可使用 LazyLoadedOverride 覆盖
// 这是捆绑正确 sharp 版本所必需的
// 可根据需要自定义
// 默认安装选项如下:
install: {
packages: ["sharp@0.32.6"],
arch: "arm64",
nodeVersion: "18",
libc: "glibc",
},
},
// 初始化函数是在构建时运行的特殊服务器,用于初始化缓存
// 默认仅初始化标签缓存。除常见选项外,还可使用以下选项:
initializationFunction: {
tagCache: "dynamodb-lite", // 可使用 LazyLoadedOverride 覆盖
},
// 覆盖默认的 revalidate 函数
// 默认适用于 lambda 和 SQS 事件
// 仅支持 node 运行时
revalidate: {
override: {
wrapper: "aws-lambda", // 可使用 LazyLoadedOverride 覆盖
converter: "aws-apigw-v2", // 可使用 LazyLoadedOverride 覆盖
},
},
// 覆盖默认的 warmer
// 默认仅适用于 lambda
// 如覆盖此配置,需在 wrapper 中处理 warmer 事件
warmer: {
invokeFunction: "aws-lambda", // 可使用 LazyLoadedOverride 覆盖
override: {
wrapper: "aws-lambda", // 可使用 LazyLoadedOverride 覆盖
converter: "aws-apigw-v2", // 可使用 LazyLoadedOverride 覆盖
},
},
// 如需覆盖默认构建命令,可在此处设置
// 默认使用 `npm run build`
buildCommand: "echo '跳过构建'",
dangerous: {
// 这将禁用标签缓存
// 在 pages 路由中可安全使用,在 app 路由中会破坏 revalidateTag 和 revalidatePath
disableTagCache: true,
// 这将禁用增量缓存
// 通常不推荐,因为 ISR 和 SSG 路由以及 fetch 缓存都需要此功能
disableIncrementalCache: true,
// 启用缓存拦截。每个请求都将通过缓存拦截器,如果在缓存中找到,将直接返回而不经过 NextServer。
// 并非所有功能都被缓存拦截器覆盖,如果未找到缓存应回退到 NextServer。
enableCacheInterception: true,
// 确定哪些标头或 cookie 具有优先级的函数
// 默认情况下,中间件标头和 cookie 会覆盖处理程序的标头和 cookie
// 此函数针对每个请求执行,且在 next 配置标头和中间件执行后运行
// 以下是简单示例:
headersAndCookiesPriority: (event) => {
if (event.rawPath.startsWith("/api")) {
return "middleware";
}
return "handler";
},
},
// `buildCommand` 选项构建输出的目标文件夹路径
// (包含 `.next` 和 `.open-next` 文件夹的路径)
// 此路径相对于当前 process.cwd() - 可选,默认为 "."
buildOutputPath: "build",
// Next.js 应用源代码的根路径
// 此路径相对于当前 process.cwd() - 可选,默认为 "."
appPath: "app",
// Next.js 应用的 package.json 文件路径
// 此路径相对于当前 process.cwd() - 可选
packageJsonPath: "package.json",
// 高级用法
// 如果在某处使用 edge 运行时(通过外部中间件或在 functions 中),我们会编译两个版本的 open-next.config.ts 文件
// 一个用于 node 运行时,一个用于 edge 运行时
// 此选项允许您为 edge 运行时指定 esbuild 的外部依赖,用于编译 open-next.config.ts
// 当您仅在 node 中使用某些自定义覆盖时特别有用
edgeExternals: [],
} satisfies OpenNextConfig;
export default config;