Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .changeset/lovely-rooms-taste.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@opennextjs/cloudflare": patch
---

some performance improvements

- `enableCacheInterception` is now enabled by default, it loads ISR/SSG pages from cache without waiting for the js page bundle to load
- `routePreloadingBehavior` is now set to `withWaitUntil`, which means a single route js will be lazy loaded on cold start, but other routes will be preloaded using `waitUntil` for better performance
1 change: 1 addition & 0 deletions examples/e2e/app-pages-router/open-next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ import memoryQueue from "@opennextjs/cloudflare/overrides/queue/memory-queue";
export default defineCloudflareConfig({
incrementalCache: r2IncrementalCache,
queue: memoryQueue,
enableCacheInterception: true,
});
12 changes: 9 additions & 3 deletions examples/e2e/app-router/e2e/isr.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,9 @@ test.describe("dynamicParams set to true", () => {
test("should be HIT on a path that was prebuilt", async ({ page }) => {
const res = await page.goto("/isr/dynamic-params-true/1");
expect(res?.status()).toEqual(200);
expect(res?.headers()["x-nextjs-cache"]).toEqual("HIT");
// TODO: sync this to aws
const cacheHeader = res?.headers()["x-nextjs-cache"] ?? res?.headers()["x-opennext-cache"];
expect(cacheHeader).toEqual("HIT");
const title = await page.getByTestId("title").textContent();
const content = await page.getByTestId("content").textContent();
expect(title).toEqual("Post 1");
Expand All @@ -115,7 +117,9 @@ test.describe("dynamicParams set to true", () => {
// We are gonna skip this one for now, turborepo caching can cause this page to be STALE once deployed
test.skip("should SSR on a path that was not prebuilt", async ({ page }) => {
const res = await page.goto("/isr/dynamic-params-true/11");
expect(res?.headers()["x-nextjs-cache"]).toEqual("MISS");
// TODO: sync this to aws
const cacheHeader = res?.headers()["x-nextjs-cache"] ?? res?.headers()["x-opennext-cache"];
expect(cacheHeader).toEqual("MISS");
const title = await page.getByTestId("title").textContent();
const content = await page.getByTestId("content").textContent();
expect(title).toEqual("Post 11");
Expand All @@ -140,7 +144,9 @@ test.describe("dynamicParams set to false", () => {
test("should be HIT on a path that was prebuilt", async ({ page }) => {
const res = await page.goto("/isr/dynamic-params-false/1");
expect(res?.status()).toEqual(200);
expect(res?.headers()["x-nextjs-cache"]).toEqual("HIT");
// TODO: sync this to aws
const cacheHeader = res?.headers()["x-nextjs-cache"] ?? res?.headers()["x-opennext-cache"];
expect(cacheHeader).toEqual("HIT");
const title = await page.getByTestId("title").textContent();
const content = await page.getByTestId("content").textContent();
expect(title).toEqual("Post 1");
Expand Down
1 change: 1 addition & 0 deletions examples/e2e/app-router/open-next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ export default defineCloudflareConfig({
},
}),
queue: doQueue,
enableCacheInterception: true,
});
1 change: 1 addition & 0 deletions examples/playground14/open-next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cac

export default defineCloudflareConfig({
incrementalCache: kvIncrementalCache,
enableCacheInterception: true,
});
1 change: 1 addition & 0 deletions examples/playground15/open-next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ import kvIncrementalCache from "@opennextjs/cloudflare/overrides/incremental-cac

export default defineCloudflareConfig({
incrementalCache: kvIncrementalCache,
enableCacheInterception: true,
});
13 changes: 12 additions & 1 deletion packages/cloudflare/src/api/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,13 @@ export type CloudflareOverrides = {
* Sets the revalidation queue implementation
*/
queue?: "direct" | Override<Queue>;

/**
* Enable cache interception
* Disable this if you want to use PPR
* @default false
*/
enableCacheInterception?: boolean;
};

/**
Expand All @@ -37,7 +44,7 @@ export type CloudflareOverrides = {
* @returns the OpenNext configuration object
*/
export function defineCloudflareConfig(config: CloudflareOverrides = {}): OpenNextConfig {
const { incrementalCache, tagCache, queue } = config;
const { incrementalCache, tagCache, queue, enableCacheInterception = false } = config;

return {
default: {
Expand All @@ -49,12 +56,16 @@ export function defineCloudflareConfig(config: CloudflareOverrides = {}): OpenNe
tagCache: resolveTagCache(tagCache),
queue: resolveQueue(queue),
},
routePreloadingBehavior: "withWaitUntil",
},
// node:crypto is used to compute cache keys
edgeExternals: ["node:crypto"],
cloudflare: {
useWorkerdCondition: true,
},
dangerous: {
enableCacheInterception,
},
};
}

Expand Down