Skip to content

Commit 583919e

Browse files
committed
Limit prerendered resource route .data files to only the target route
1 parent 332c205 commit 583919e

File tree

3 files changed

+41
-23
lines changed

3 files changed

+41
-23
lines changed

.changeset/rotten-numbers-bathe.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@react-router/dev": patch
3+
---
4+
5+
Limit prerendered resource route `.data` files to only the target route

integration/vite-prerender-test.ts

-6
Original file line numberDiff line numberDiff line change
@@ -421,9 +421,6 @@ test.describe("Prerendering", () => {
421421

422422
let dataRes = await fixture.requestSingleFetchData("/json.json.data");
423423
expect(dataRes.data).toEqual({
424-
root: {
425-
data: null,
426-
},
427424
"routes/json[.json]": {
428425
data: {
429426
hello: "world",
@@ -436,9 +433,6 @@ test.describe("Prerendering", () => {
436433

437434
dataRes = await fixture.requestSingleFetchData("/text.txt.data");
438435
expect(dataRes.data).toEqual({
439-
root: {
440-
data: null,
441-
},
442436
"routes/text[.txt]": {
443437
data: "Hello, world",
444438
},

packages/react-router-dev/vite/plugin.ts

+36-17
Original file line numberDiff line numberDiff line change
@@ -2317,21 +2317,6 @@ async function handlePrerender(
23172317
matches,
23182318
`Unable to prerender path because it does not match any routes: ${path}`
23192319
);
2320-
let hasLoaders = matches.some(
2321-
(m) => build.assets.routes[m.route.id]?.hasLoader
2322-
);
2323-
let data: string | undefined;
2324-
if (hasLoaders) {
2325-
data = await prerenderData(
2326-
handler,
2327-
path,
2328-
clientBuildDirectory,
2329-
reactRouterConfig,
2330-
viteConfig,
2331-
{ headers }
2332-
);
2333-
}
2334-
23352320
// When prerendering a resource route, we don't want to pass along the
23362321
// `.data` file since we want to prerender the raw Response returned from
23372322
// the loader. Presumably this is for routes where a file extension is
@@ -2343,7 +2328,20 @@ async function handlePrerender(
23432328
manifestRoute && !manifestRoute.default && !manifestRoute.ErrorBoundary;
23442329

23452330
if (isResourceRoute) {
2346-
if (manifestRoute?.loader) {
2331+
invariant(leafRoute);
2332+
invariant(manifestRoute);
2333+
if (manifestRoute.loader) {
2334+
// Prerender a .data file for turbo-stream consumption
2335+
await prerenderData(
2336+
handler,
2337+
path,
2338+
[leafRoute.id],
2339+
clientBuildDirectory,
2340+
reactRouterConfig,
2341+
viteConfig,
2342+
{ headers }
2343+
);
2344+
// Prerender a raw file for external consumption
23472345
await prerenderResourceRoute(
23482346
handler,
23492347
path,
@@ -2358,6 +2356,22 @@ async function handlePrerender(
23582356
);
23592357
}
23602358
} else {
2359+
let hasLoaders = matches.some(
2360+
(m) => build.assets.routes[m.route.id]?.hasLoader
2361+
);
2362+
let data: string | undefined;
2363+
if (!isResourceRoute && hasLoaders) {
2364+
data = await prerenderData(
2365+
handler,
2366+
path,
2367+
null,
2368+
clientBuildDirectory,
2369+
reactRouterConfig,
2370+
viteConfig,
2371+
{ headers }
2372+
);
2373+
}
2374+
23612375
await prerenderRoute(
23622376
handler,
23632377
path,
@@ -2411,6 +2425,7 @@ function getStaticPrerenderPaths(routes: DataRouteObject[]) {
24112425
async function prerenderData(
24122426
handler: RequestHandler,
24132427
prerenderPath: string,
2428+
onlyRoutes: string[] | null,
24142429
clientBuildDirectory: string,
24152430
reactRouterConfig: ResolvedReactRouterConfig,
24162431
viteConfig: Vite.ResolvedConfig,
@@ -2421,7 +2436,11 @@ async function prerenderData(
24212436
? "/_root.data"
24222437
: `${prerenderPath.replace(/\/$/, "")}.data`
24232438
}`.replace(/\/\/+/g, "/");
2424-
let request = new Request(`http://localhost${normalizedPath}`, requestInit);
2439+
let url = new URL(`http://localhost${normalizedPath}`);
2440+
if (onlyRoutes?.length) {
2441+
url.searchParams.set("_routes", onlyRoutes.join(","));
2442+
}
2443+
let request = new Request(url, requestInit);
24252444
let response = await handler(request);
24262445
let data = await response.text();
24272446

0 commit comments

Comments
 (0)