AWS
完整示例

这是一个 open-next.config.ts 文件的详细示例。此文件需要与你的 next.config.js 文件放在同一位置

这里的 server 可以指 lambda 函数、docker 容器、node 服务器或任何支持运行 nodejs 代码的东西。甚至是 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", // page 目录页面
      ], // 对于 app 目录,你需要包含 route|page,无需包含 layout 或 loading
      // patterns 需要是 cloudfront 兼容的格式
      // 这将用于生成输出
      patterns: ["api/*", "route1", "route2", "route3"],
      override: {
        wrapper: "aws-lambda-streaming",
      },
      // 这启用了捆绑的 next 服务器,速度更快并减小服务器大小
      // 这也是实验性的,可能并非在所有情况下都有效
      experimentalBundledNextServer: true, // 已弃用且在 next 14.2+ 中不支持
    },
    pageSsr: {
      // 对于 page 目录,routes 应该是 `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: {},
    },
  },
  // 通过设置此项,它将为 middleware 创建另一个 bundle,
  // 并且 middleware 将部署在单独的服务器中。
  // 如果未设置,middleware 将捆绑在服务器内部
  // 它可以在 lambda@edge、cloudflare workers 或其他任何地方
  // 默认情况下它使用 lambda@edge
  // 这在参考 construct 实现中尚未实现。
  // 这是可选的,但如果你将应用拆分为多个服务器,则可能是必要的
  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 'skipping build'",
 
  dangerous: {
    // 这将禁用标签缓存
    // 你可以在 page router 上安全使用,在 app router 上它会破坏 revalidateTag 和 revalidatePath
    disableTagCache: true,
    // 这将禁用增量缓存
    // 通常不建议这样做,因为这对于 ISR 和 SSG 路由以及 fetch 缓存是必要的
    disableIncrementalCache: true,
    // 启用缓存拦截。每个请求都将经过缓存拦截器,如果在缓存中找到,
    // 它将直接返回而不经过 NextServer。并非每个功能都被缓存拦截器覆盖,并且
    // 如果未找到缓存,它应该回退到 NextServer。
    enableCacheInterception: true,
    // 用于确定哪个头或 cookie 优先的函数。
    // 默认情况下,middleware 头和 cookie 将覆盖 handler 头和 cookie。
    // 这对每个请求执行,且在 next config 头和 middleware 执行之后。
    // 这是一个非常简单的如何使用它的示例:
    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 运行时(无论是外部 middleware 还是在 functions 中),我们会编译 2 个版本的 open-next.config.ts 文件。
  // 一个用于 node 运行时,一个用于 edge 运行时。
  // 此选项允许你指定用于 esbuild 编译 open-next.config.ts 的 edge 运行时的 externals
  // 如果你仅在 node 中使用一些自定义覆盖,这尤其有用
  edgeExternals: [],
} satisfies OpenNextConfig;
 
export default config;