AWS
完整示例

以下是 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;