AWS
可选缓存拦截

默认情况下,OpenNext 会覆盖 Next.js 的缓存系统,通过 next.config.js 中的 cacheHandler (opens in a new tab) 将缓存存储在 S3(或配置中定义的其他增量缓存提供程序)中。它还使用队列系统来处理 ISR 重新验证。

这种方式很好,但它仍然需要经过 NextServer,默认情况下即使页面已缓存,也会加载与该页面关联的 JavaScript。这对于冷启动并不理想,并且使得无法在外部中间件中提供 ISR/SSG 页面。

从 OpenNext 3.1 开始,我们添加了一个称为"缓存拦截"的新功能,允许您直接在 OpenNext 路由层拦截缓存系统,直接从缓存提供页面而无需经过 NextServer。如果缓存拦截失败,请求将照常转发到 NextServer

启用此功能并配合外部中间件意味着外部中间件需要具备与 S3、DynamoDB 和 SQS(或您覆盖的其他服务)交互的所有适当权限和环境变量。更多详情可参见此处

这具有以下优势:

  • 更快的冷启动(如果页面已缓存,则无需加载与该页面关联的 JavaScript)
  • ISR/SSG 路由可以直接由外部中间件提供服务
  • 如果外部中间件位于 CDN 前面,则该中间件可用于所有路由,包括 ISR/SSG
  • 这将使 PPR(Partial Prerendering,部分预渲染)能够按预期工作,如 Vercel 所演示的那样¹ 目前尚未实现

要启用缓存拦截,您需要在 open-next.config.ts 文件中添加 enableCacheInterception 选项。

// open-next.config.ts
import type { OpenNextConfig } from "@opennextjs/aws/types/open-next.js";
const config = {
  default: {},
  dangerous: {
    enableCacheInterception: true,
  },
} satisfies OpenNextConfig;
 
export default config;
  1. 在 Vercel 之外,PPR 无法以他们演示的方式工作。原因是缓存系统由 NextServer 处理,它必须每次都到达服务器。目前,在使用 next start 或独立输出时,PPR 页面无法从 CDN 提供服务。在某些情况下,没有 Vercel 的 PPR 可能比 SSR 更慢(特别是如果您的缓存未使用默认的文件系统)。