Cache runtime data for partially static pages on initial load (resume)#90888
Merged
unstubbable merged 1 commit intocanaryfrom Mar 6, 2026
Merged
Cache runtime data for partially static pages on initial load (resume)#90888unstubbable merged 1 commit intocanaryfrom
unstubbable merged 1 commit intocanaryfrom
Conversation
When a partially static page with `unstable_instant: { prefetch:
'runtime' }` is loaded as initial HTML (PPR resume), the server now
spawns a runtime prerender after the resume render fills the caches,
embedding the result as the `p` field on the `InitialRSCPayload`. The
client extracts this stream during hydration via
`processRuntimePrefetchStream` and writes the data into the segment
cache.
This mirrors the existing navigation path where
`generateStagedDynamicFlightRenderResult` embeds the runtime prefetch
stream in the `NavigationFlightResponse`. Both paths reuse the same
`spawnRuntimePrefetchWithFilledCaches` function (renamed from
`spawnRuntimePrefetchDuringNavigation` since it is no longer specific to
navigations).
84c7d21 to
fc11844
Compare
Collaborator
Stats from current PR🔴 1 regression
📊 All Metrics📖 Metrics GlossaryDev Server Metrics:
Build Metrics:
Change Thresholds:
⚡ Dev Server
📦 Dev Server (Webpack) (Legacy)📦 Dev Server (Webpack)
⚡ Production Builds
📦 Production Builds (Webpack) (Legacy)📦 Production Builds (Webpack)
📦 Bundle SizesBundle Sizes⚡ TurbopackClient Main Bundles: **402 kB** → **402 kB**
|
| Canary | PR | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 766 B | 767 B | ✓ |
| Total | 766 B | 767 B |
Build Details
Build Manifests
| Canary | PR | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 446 B | 450 B | ✓ |
| Total | 446 B | 450 B |
📦 Webpack
Client
Main Bundles
| Canary | PR | Change | |
|---|---|---|---|
| 5528-HASH.js gzip | 5.54 kB | N/A | - |
| 6280-HASH.js gzip | 59.4 kB | N/A | - |
| 6335.HASH.js gzip | 169 B | N/A | - |
| 912-HASH.js gzip | 4.59 kB | N/A | - |
| e8aec2e4-HASH.js gzip | 62.6 kB | N/A | - |
| framework-HASH.js gzip | 59.7 kB | 59.7 kB | ✓ |
| main-app-HASH.js gzip | 256 B | 253 B | 🟢 3 B (-1%) |
| main-HASH.js gzip | 39.1 kB | 39.1 kB | ✓ |
| webpack-HASH.js gzip | 1.68 kB | 1.68 kB | ✓ |
| 262-HASH.js gzip | N/A | 4.59 kB | - |
| 2889.HASH.js gzip | N/A | 169 B | - |
| 5602-HASH.js gzip | N/A | 5.55 kB | - |
| 6948ada0-HASH.js gzip | N/A | 62.6 kB | - |
| 9544-HASH.js gzip | N/A | 60.3 kB | - |
| Total | 233 kB | 234 kB |
Polyfills
| Canary | PR | Change | |
|---|---|---|---|
| polyfills-HASH.js gzip | 39.4 kB | 39.4 kB | ✓ |
| Total | 39.4 kB | 39.4 kB | ✓ |
Pages
| Canary | PR | Change | |
|---|---|---|---|
| _app-HASH.js gzip | 194 B | 194 B | ✓ |
| _error-HASH.js gzip | 183 B | 180 B | 🟢 3 B (-2%) |
| css-HASH.js gzip | 331 B | 330 B | ✓ |
| dynamic-HASH.js gzip | 1.81 kB | 1.81 kB | ✓ |
| edge-ssr-HASH.js gzip | 256 B | 256 B | ✓ |
| head-HASH.js gzip | 351 B | 352 B | ✓ |
| hooks-HASH.js gzip | 384 B | 383 B | ✓ |
| image-HASH.js gzip | 580 B | 581 B | ✓ |
| index-HASH.js gzip | 260 B | 260 B | ✓ |
| link-HASH.js gzip | 2.51 kB | 2.51 kB | ✓ |
| routerDirect..HASH.js gzip | 320 B | 319 B | ✓ |
| script-HASH.js gzip | 386 B | 386 B | ✓ |
| withRouter-HASH.js gzip | 315 B | 315 B | ✓ |
| 1afbb74e6ecf..834.css gzip | 106 B | 106 B | ✓ |
| Total | 7.98 kB | 7.98 kB | ✅ -1 B |
Server
Edge SSR
| Canary | PR | Change | |
|---|---|---|---|
| edge-ssr.js gzip | 125 kB | 125 kB | ✓ |
| page.js gzip | 256 kB | 257 kB | ✓ |
| Total | 380 kB | 382 kB |
Middleware
| Canary | PR | Change | |
|---|---|---|---|
| middleware-b..fest.js gzip | 617 B | 615 B | ✓ |
| middleware-r..fest.js gzip | 156 B | 155 B | ✓ |
| middleware.js gzip | 43.8 kB | 43.7 kB | ✓ |
| edge-runtime..pack.js gzip | 842 B | 842 B | ✓ |
| Total | 45.4 kB | 45.3 kB | ✅ -122 B |
Build Details
Build Manifests
| Canary | PR | Change | |
|---|---|---|---|
| _buildManifest.js gzip | 715 B | 718 B | ✓ |
| Total | 715 B | 718 B |
Build Cache
| Canary | PR | Change | |
|---|---|---|---|
| 0.pack gzip | 4.06 MB | 4.08 MB | 🔴 +16 kB (+0%) |
| index.pack gzip | 104 kB | 103 kB | ✓ |
| index.pack.old gzip | 104 kB | 103 kB | 🟢 1.1 kB (-1%) |
| Total | 4.27 MB | 4.28 MB |
🔄 Shared (bundler-independent)
Runtimes
| Canary | PR | Change | |
|---|---|---|---|
| app-page-exp...dev.js gzip | 322 kB | 322 kB | ✓ |
| app-page-exp..prod.js gzip | 171 kB | 171 kB | ✓ |
| app-page-tur...dev.js gzip | 322 kB | 322 kB | ✓ |
| app-page-tur..prod.js gzip | 171 kB | 171 kB | ✓ |
| app-page-tur...dev.js gzip | 318 kB | 319 kB | ✓ |
| app-page-tur..prod.js gzip | 169 kB | 169 kB | ✓ |
| app-page.run...dev.js gzip | 319 kB | 319 kB | ✓ |
| app-page.run..prod.js gzip | 169 kB | 169 kB | ✓ |
| app-route-ex...dev.js gzip | 70.9 kB | 70.9 kB | ✓ |
| app-route-ex..prod.js gzip | 49.3 kB | 49.3 kB | ✓ |
| app-route-tu...dev.js gzip | 70.9 kB | 70.9 kB | ✓ |
| app-route-tu..prod.js gzip | 49.3 kB | 49.3 kB | ✓ |
| app-route-tu...dev.js gzip | 70.5 kB | 70.5 kB | ✓ |
| app-route-tu..prod.js gzip | 49 kB | 49 kB | ✓ |
| app-route.ru...dev.js gzip | 70.4 kB | 70.4 kB | ✓ |
| app-route.ru..prod.js gzip | 49 kB | 49 kB | ✓ |
| dist_client_...dev.js gzip | 324 B | 324 B | ✓ |
| dist_client_...dev.js gzip | 326 B | 326 B | ✓ |
| dist_client_...dev.js gzip | 318 B | 318 B | ✓ |
| dist_client_...dev.js gzip | 317 B | 317 B | ✓ |
| pages-api-tu...dev.js gzip | 43.2 kB | 43.2 kB | ✓ |
| pages-api-tu..prod.js gzip | 32.9 kB | 32.9 kB | ✓ |
| pages-api.ru...dev.js gzip | 43.2 kB | 43.2 kB | ✓ |
| pages-api.ru..prod.js gzip | 32.9 kB | 32.9 kB | ✓ |
| pages-turbo....dev.js gzip | 52.6 kB | 52.6 kB | ✓ |
| pages-turbo...prod.js gzip | 38.5 kB | 38.5 kB | ✓ |
| pages.runtim...dev.js gzip | 52.6 kB | 52.6 kB | ✓ |
| pages.runtim..prod.js gzip | 38.5 kB | 38.5 kB | ✓ |
| server.runti..prod.js gzip | 62 kB | 62 kB | ✓ |
| Total | 2.84 MB | 2.84 MB |
📝 Changed Files (8 files)
Files with changes:
app-page-exp..ntime.dev.jsapp-page-exp..time.prod.jsapp-page-tur..ntime.dev.jsapp-page-tur..time.prod.jsapp-page-tur..ntime.dev.jsapp-page-tur..time.prod.jsapp-page.runtime.dev.jsapp-page.runtime.prod.js
View diffs
app-page-exp..ntime.dev.js
failed to diffapp-page-exp..time.prod.js
Diff too large to display
app-page-tur..ntime.dev.js
failed to diffapp-page-tur..time.prod.js
Diff too large to display
app-page-tur..ntime.dev.js
failed to diffapp-page-tur..time.prod.js
failed to diffapp-page.runtime.dev.js
failed to diffapp-page.runtime.prod.js
Diff too large to display
📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/fc11844506e24959fbc88df2a5029510ab4a8e0e/next
acdlite
approved these changes
Mar 6, 2026
sokra
pushed a commit
that referenced
this pull request
Mar 6, 2026
#90888) When a partially static page with `unstable_instant: { prefetch: 'runtime' }` is loaded as initial HTML (PPR resume), the server now spawns a runtime prerender after the resume render fills the caches, embedding the result as the `p` field on the `InitialRSCPayload`. The client extracts this stream during hydration via `processRuntimePrefetchStream` and writes the data into the segment cache. This mirrors the existing navigation path where `generateStagedDynamicFlightRenderResult` embeds the runtime prefetch stream in the `NavigationFlightResponse`. Both paths reuse the same `spawnRuntimePrefetchWithFilledCaches` function (renamed from `spawnRuntimePrefetchDuringNavigation` since it is no longer specific to navigations).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
When a partially static page with
unstable_instant: { prefetch: 'runtime' }is loaded as initial HTML (PPR resume), the server now spawns a runtime prerender after the resume render fills the caches, embedding the result as thepfield on theInitialRSCPayload. The client extracts this stream during hydration viaprocessRuntimePrefetchStreamand writes the data into the segment cache.This mirrors the existing navigation path where
generateStagedDynamicFlightRenderResultembeds the runtime prefetch stream in theNavigationFlightResponse. Both paths reuse the samespawnRuntimePrefetchWithFilledCachesfunction (renamed fromspawnRuntimePrefetchDuringNavigationsince it is no longer specific to navigations).