Files
Andrew ClarkandGitHub ff59f108f8 Surface an error for blocking routes under the Navigation Inspector (#95139)
When the Navigation Inspector (Instant Navigation Testing API) is
active, the server renders only a route's static shell. A blocking route
— one that reads a dynamic value such as `await cookies()` at the root
with no Suspense boundary above it, opting into blocking via `export
const instant = false` — produces an empty shell. We served that empty
shell directly, so the browser showed a blank document with no DevTools.
With no DevTools, there's no way to release the inspector lock from the
UI, so every reload stayed blank and the user was stuck.

Detect the empty static shell at serve time and throw to surface a
normal error page instead, and clear the instant-navigation cookie so
the next reload renders the route normally.

In the future we plan to render this error message inline in the
Navigation Inspector panel rather than as a full-page error.
2026-06-24 21:35:52 +00:00

22 lines
830 B
TypeScript

import { cookies } from 'next/headers'
// Opt out of instant validation so the empty static shell is allowed (rather
// than throwing a static-shell bailout). This reproduces the blank-document
// scenario the fix targets.
export const instant = false
// A page that reads a dynamic value at the root with no Suspense boundary above
// it. During Instant Navigation Testing this produces an empty static shell,
// which previously rendered as a blank document with no DevTools. The server
// now clears the instant-nav cookie and surfaces an error page instead.
export default async function RootBlockingPage() {
const cookieStore = await cookies()
const testCookie = cookieStore.get('testCookie')
return (
<div data-testid="root-blocking-content">
testCookie: {testCookie?.value ?? 'not set'}
</div>
)
}