Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

[Segment Cache] No data on tree prefetch if no PPR #73767

Merged

Conversation

acdlite
Copy link
Contributor

@acdlite acdlite commented Dec 10, 2024

When the client Segment Cache attempts to prefetch a route tree, and it the route does not have PPR enabled, the server falls through to the old implementation, which sends back a FlightRouterState.

This is fine, since the client can use the FlightRouterState to recreate the non-PPR behavior.

However, when loading.tsx is present in the route, the server will not just send back the FlightRouterState, but also render the page up to the first loading boundary. This is not what we want in the Segment Cache implementation — we want the route tree only, so we can determine which parts the client already has before sending a second request for the rest.

So this PR disables the loading.tsx mechanism when prefetching the route tree, by checking the Next-Router-Segment-Prefetch header.

@ijjk
Copy link
Member

ijjk commented Dec 10, 2024

Tests Passed

@ijjk
Copy link
Member

ijjk commented Dec 10, 2024

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary acdlite/next.js segment-cache-no-data-on-tree-prefetch Change
buildDuration 17.8s 16.2s N/A
buildDurationCached 15.3s 13s N/A
nodeModulesSize 409 MB 409 MB ⚠️ +17 kB
nextStartRea..uration (ms) 461ms 485ms N/A
Client Bundles (main, webpack)
vercel/next.js canary acdlite/next.js segment-cache-no-data-on-tree-prefetch Change
1187-HASH.js gzip 50.7 kB 50.7 kB N/A
8276.HASH.js gzip 169 B 168 B N/A
8377-HASH.js gzip 5.36 kB 5.36 kB N/A
bccd1874-HASH.js gzip 53 kB 53 kB N/A
framework-HASH.js gzip 57.5 kB 57.5 kB N/A
main-app-HASH.js gzip 233 B 235 B N/A
main-HASH.js gzip 34 kB 34 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 0 B 0 B
Legacy Client Bundles (polyfills)
vercel/next.js canary acdlite/next.js segment-cache-no-data-on-tree-prefetch Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary acdlite/next.js segment-cache-no-data-on-tree-prefetch Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 193 B 193 B
amp-HASH.js gzip 512 B 510 B N/A
css-HASH.js gzip 343 B 342 B N/A
dynamic-HASH.js gzip 1.84 kB 1.84 kB
edge-ssr-HASH.js gzip 265 B 265 B
head-HASH.js gzip 363 B 362 B N/A
hooks-HASH.js gzip 393 B 392 B N/A
image-HASH.js gzip 4.49 kB 4.49 kB N/A
index-HASH.js gzip 268 B 268 B
link-HASH.js gzip 2.35 kB 2.34 kB N/A
routerDirect..HASH.js gzip 328 B 328 B
script-HASH.js gzip 397 B 397 B
withRouter-HASH.js gzip 323 B 326 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 3.59 kB 3.59 kB
Client Build Manifests
vercel/next.js canary acdlite/next.js segment-cache-no-data-on-tree-prefetch Change
_buildManifest.js gzip 747 B 746 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary acdlite/next.js segment-cache-no-data-on-tree-prefetch Change
index.html gzip 524 B 522 B N/A
link.html gzip 539 B 537 B N/A
withRouter.html gzip 520 B 519 B N/A
Overall change 0 B 0 B
Edge SSR bundle Size
vercel/next.js canary acdlite/next.js segment-cache-no-data-on-tree-prefetch Change
edge-ssr.js gzip 128 kB 128 kB N/A
page.js gzip 203 kB 203 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary acdlite/next.js segment-cache-no-data-on-tree-prefetch Change
middleware-b..fest.js gzip 671 B 667 B N/A
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 31.1 kB 31.2 kB N/A
edge-runtime..pack.js gzip 844 B 844 B
Overall change 844 B 844 B
Next Runtimes
vercel/next.js canary acdlite/next.js segment-cache-no-data-on-tree-prefetch Change
523-experime...dev.js gzip 322 B 322 B
523.runtime.dev.js gzip 314 B 314 B
app-page-exp...dev.js gzip 323 kB 323 kB N/A
app-page-exp..prod.js gzip 127 kB 127 kB N/A
app-page-tur..prod.js gzip 140 kB 140 kB N/A
app-page-tur..prod.js gzip 135 kB 135 kB N/A
app-page.run...dev.js gzip 313 kB 313 kB N/A
app-page.run..prod.js gzip 123 kB 123 kB N/A
app-route-ex...dev.js gzip 37.3 kB 37.3 kB
app-route-ex..prod.js gzip 25.4 kB 25.4 kB
app-route-tu..prod.js gzip 25.4 kB 25.4 kB
app-route-tu..prod.js gzip 25.2 kB 25.2 kB
app-route.ru...dev.js gzip 38.9 kB 38.9 kB
app-route.ru..prod.js gzip 25.2 kB 25.2 kB
pages-api-tu..prod.js gzip 9.67 kB 9.67 kB
pages-api.ru...dev.js gzip 11.6 kB 11.6 kB
pages-api.ru..prod.js gzip 9.66 kB 9.66 kB
pages-turbo...prod.js gzip 21.7 kB 21.7 kB
pages.runtim...dev.js gzip 27.4 kB 27.4 kB
pages.runtim..prod.js gzip 21.7 kB 21.7 kB
server.runti..prod.js gzip 916 kB 916 kB
Overall change 1.2 MB 1.2 MB
build cache Overall increase ⚠️
vercel/next.js canary acdlite/next.js segment-cache-no-data-on-tree-prefetch Change
0.pack gzip 2.05 MB 2.05 MB N/A
index.pack gzip 71.6 kB 72.2 kB ⚠️ +548 B
Overall change 71.6 kB 72.2 kB ⚠️ +548 B
Diff details
Diff for main-HASH.js

Diff too large to display

Diff for app-page-exp..ntime.dev.js

Diff too large to display

Diff for app-page-exp..time.prod.js

Diff too large to display

Diff for app-page-tur..time.prod.js

Diff too large to display

Diff for app-page-tur..time.prod.js

Diff too large to display

Diff for app-page.runtime.dev.js

Diff too large to display

Diff for app-page.runtime.prod.js

Diff too large to display

Commit: 847d503

When the client Segment Cache attempts to prefetch a route tree, and it
the route does not have PPR enabled, the server falls through to the old
implementation, which sends back a FlightRouterState.

This is fine, since the client can use the FlightRouterState to recreate
the non-PPR behavior.

However, when loading.tsx is present in the route, the server will not
just send back the FlightRouterState, but also render the page up to the
first loading boundary. This is not what we want in the Segment Cache
implementation — we want the route tree only, so we can determine which
parts the client already has before sending a second request for
the rest.

So this PR disables the loading.tsx mechanism when prefetching the
route tree, by checking the Next-Router-Segment-Prefetch header.
@acdlite acdlite force-pushed the segment-cache-no-data-on-tree-prefetch branch from 2c20f61 to 847d503 Compare December 12, 2024 15:48
@acdlite acdlite merged commit 48e9b8c into vercel:canary Dec 12, 2024
86 checks passed
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Dec 27, 2024
# for free to subscribe to this conversation on GitHub. Already have an account? #.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants