@@ -2317,21 +2317,6 @@ async function handlePrerender(
2317
2317
matches ,
2318
2318
`Unable to prerender path because it does not match any routes: ${ path } `
2319
2319
) ;
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
-
2335
2320
// When prerendering a resource route, we don't want to pass along the
2336
2321
// `.data` file since we want to prerender the raw Response returned from
2337
2322
// the loader. Presumably this is for routes where a file extension is
@@ -2340,21 +2325,53 @@ async function handlePrerender(
2340
2325
let leafRoute = matches ? matches [ matches . length - 1 ] . route : null ;
2341
2326
let manifestRoute = leafRoute ? build . routes [ leafRoute . id ] ?. module : null ;
2342
2327
let isResourceRoute =
2343
- manifestRoute &&
2344
- ! manifestRoute . default &&
2345
- ! manifestRoute . ErrorBoundary &&
2346
- manifestRoute . loader ;
2328
+ manifestRoute && ! manifestRoute . default && ! manifestRoute . ErrorBoundary ;
2347
2329
2348
2330
if ( isResourceRoute ) {
2349
- await prerenderResourceRoute (
2350
- handler ,
2351
- path ,
2352
- clientBuildDirectory ,
2353
- reactRouterConfig ,
2354
- viteConfig ,
2355
- { headers }
2356
- ) ;
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
2345
+ await prerenderResourceRoute (
2346
+ handler ,
2347
+ path ,
2348
+ clientBuildDirectory ,
2349
+ reactRouterConfig ,
2350
+ viteConfig ,
2351
+ { headers }
2352
+ ) ;
2353
+ } else {
2354
+ viteConfig . logger . warn (
2355
+ `⚠️ Skipping prerendering for resource route without a loader: ${ leafRoute ?. id } `
2356
+ ) ;
2357
+ }
2357
2358
} 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
+
2358
2375
await prerenderRoute (
2359
2376
handler ,
2360
2377
path ,
@@ -2408,6 +2425,7 @@ function getStaticPrerenderPaths(routes: DataRouteObject[]) {
2408
2425
async function prerenderData (
2409
2426
handler : RequestHandler ,
2410
2427
prerenderPath : string ,
2428
+ onlyRoutes : string [ ] | null ,
2411
2429
clientBuildDirectory : string ,
2412
2430
reactRouterConfig : ResolvedReactRouterConfig ,
2413
2431
viteConfig : Vite . ResolvedConfig ,
@@ -2418,7 +2436,11 @@ async function prerenderData(
2418
2436
? "/_root.data"
2419
2437
: `${ prerenderPath . replace ( / \/ $ / , "" ) } .data`
2420
2438
} `. replace ( / \/ \/ + / g, "/" ) ;
2421
- 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 ) ;
2422
2444
let response = await handler ( request ) ;
2423
2445
let data = await response . text ( ) ;
2424
2446
0 commit comments