Files
cloudflare__vinext/tests/app-client-reference-preloader.test.ts
T
Nathan Nguyen a66a62da4c perf(app-router): coalesce client reference preloads (#1067)
Cold App Router SSR requests currently share Vite RSC's underlying module import promises, but each request can still iterate the full client-reference manifest and allocate its own Promise.all fan-out before the completed boolean flips. That keeps first-request correctness but wastes work during cold bursts.

The preload state only tracked completion, not in-flight work. Concurrent callers had no shared promise to await, and the preload logic lived inline in the SSR entry where the concurrency contract was hard to test.

Add a typed client-reference preloader that shares the global manifest preload promise, dedupes per-reference work for future scoped manifests, preserves non-fatal reference load reporting, and keeps handleSsr awaiting the preload before React consumes the Flight stream.
2026-05-05 19:39:39 +01:00

113 lines
3.6 KiB
TypeScript

import { describe, expect, it } from "vitest";
import { createClientReferencePreloader } from "../packages/vinext/src/server/app-client-reference-preloader.js";
function createDeferred(): { promise: Promise<void>; resolve: () => void } {
let resolveDeferred: () => void = () => {
throw new Error("deferred promise was not initialized");
};
const promise = new Promise<void>((resolve) => {
resolveDeferred = () => resolve();
});
return { promise, resolve: resolveDeferred };
}
describe("app client reference preloader", () => {
it("shares one in-flight preload across concurrent cold SSR calls", async () => {
const refs = { "comp-a": true, "comp-b": true, "comp-c": true };
const calls: string[] = [];
const preloadGate = createDeferred();
const preloader = createClientReferencePreloader({
getReferences: () => refs,
getClientRequire: () => async (id) => {
calls.push(id);
await preloadGate.promise;
},
});
const first = preloader.preload();
const second = preloader.preload();
const third = preloader.preload();
expect(second).toBe(first);
expect(third).toBe(first);
expect(calls).toEqual(["comp-a", "comp-b", "comp-c"]);
preloadGate.resolve();
await Promise.all([first, second, third]);
await preloader.preload();
expect(calls).toEqual(["comp-a", "comp-b", "comp-c"]);
});
it("does not mark preload complete when references or client require are unavailable", async () => {
const refs = { "comp-a": true };
let currentRefs: Record<string, unknown> | undefined;
let currentRequire: ((id: string) => Promise<unknown>) | undefined;
const calls: string[] = [];
const preloader = createClientReferencePreloader({
getReferences: () => currentRefs,
getClientRequire: () => currentRequire,
});
await preloader.preload();
currentRefs = refs;
await preloader.preload();
currentRequire = async (id) => {
calls.push(id);
};
await preloader.preload();
expect(calls).toEqual(["comp-a"]);
});
it("dedupes overlapping scoped preload requests per reference id", async () => {
const calls: string[] = [];
const preloadGate = createDeferred();
const preloader = createClientReferencePreloader({
getReferences: () => ({ "comp-a": true, "comp-b": true, "comp-c": true }),
getClientRequire: () => async (id) => {
calls.push(id);
await preloadGate.promise;
},
});
const firstRoute = preloader.preload(["comp-a", "comp-b"]);
const secondRoute = preloader.preload(["comp-b", "comp-c"]);
expect(calls).toEqual(["comp-a", "comp-b", "comp-c"]);
preloadGate.resolve();
await Promise.all([firstRoute, secondRoute]);
await preloader.preload(["comp-b"]);
expect(calls).toEqual(["comp-a", "comp-b", "comp-c"]);
});
it("reports individual preload failures and completes the manifest pass", async () => {
const reported: Array<{ id: string; error: unknown }> = [];
const calls: string[] = [];
const preloader = createClientReferencePreloader({
getReferences: () => ({ "comp-a": true, "comp-b": true }),
getClientRequire: () => async (id) => {
calls.push(id);
if (id === "comp-a") {
throw new Error("load failed");
}
},
onPreloadError: (id, error) => reported.push({ id, error }),
});
await preloader.preload();
await preloader.preload();
expect(calls).toEqual(["comp-a", "comp-b"]);
expect(reported).toHaveLength(1);
expect(reported[0]?.id).toBe("comp-a");
expect(reported[0]?.error).toBeInstanceOf(Error);
});
});