默认情况下,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;
- 在 Vercel 之外,PPR 无法以他们演示的方式工作。原因是缓存系统由
NextServer
处理,它必须每次都到达服务器。目前,在使用next start
或独立输出时,PPR 页面无法从 CDN 提供服务。在某些情况下,没有 Vercel 的 PPR 可能比 SSR 更慢(特别是如果您的缓存未使用默认的文件系统)。