-
Notifications
You must be signed in to change notification settings - Fork 27.8k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
dev error overlay: async boundary for original stack frame call #75718
Conversation
Tests Passed |
db7dd40
to
ff1a05b
Compare
12fd134
to
504d06b
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm seeing a few weird things when paginating:
- the feedback menu is occasionally covering the frame
- we shouldn't have to show an empty state on subsequent pages, since they would already been loaded
CleanShot.2025-02-05.at.18.50.45.mp4
...client/components/react-dev-overlay/_experimental/internal/container/runtime-error/index.tsx
Outdated
Show resolved
Hide resolved
packages/next/src/client/components/react-dev-overlay/internal/helpers/get-error-by-type.ts
Outdated
Show resolved
Hide resolved
504d06b
to
b7b2851
Compare
...t/src/client/components/react-dev-overlay/_experimental/internal/components/dialog/styles.ts
Outdated
Show resolved
Hide resolved
b7b2851
to
3629e1b
Compare
Fixed |
872fe64
to
c7f4564
Compare
So we are blocking the full codeframe and callstack? As a follow-up, we should render a codeframe skeleton first and the generated frames before we switch to the sourcemapped frames. That should be achievable with |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How does this look on Pages router with React 18? use
doesn't exist in React 18 so I suspect this just throws? Or do we use the old overlay in 18?
packages/next/src/client/components/react-dev-overlay/internal/helpers/get-error-by-type.ts
Outdated
Show resolved
Hide resolved
startTransition(() => { | ||
if (activeIdx > 0) { | ||
onActiveIndexChange(Math.max(0, activeIdx - 1)) | ||
} | ||
}), |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we have any visual indicator right now that the transition is pending?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do we have any visual indicator right now that the transition is pending?
Let's follow up on this if needed. My two cents is that this should be ready by the time the user clicks the tabs.
c7f4564
to
6d31274
Compare
Lifts the style fix from #75718 into a separate PR. Fixes the feedback bar clipping the content:  Co-authored-by: Jude Gao <jude.gao@vercel.com>
6d31274
to
be4408d
Compare
Stats from current PRDefault Build (Increase detected
|
vercel/next.js canary | vercel/next.js 02-05-dev_error_overlay_add_loading_state | Change | |
---|---|---|---|
buildDuration | 23.3s | 20.7s | N/A |
buildDurationCached | 18.8s | 16.4s | N/A |
nodeModulesSize | 393 MB | 393 MB | |
nextStartRea..uration (ms) | 537ms | 492ms | N/A |
Client Bundles (main, webpack)
vercel/next.js canary | vercel/next.js 02-05-dev_error_overlay_add_loading_state | Change | |
---|---|---|---|
5306-HASH.js gzip | 54.2 kB | 54.2 kB | N/A |
8276.HASH.js gzip | 169 B | 168 B | N/A |
8377-HASH.js gzip | 5.46 kB | 5.46 kB | N/A |
bccd1874-HASH.js gzip | 53 kB | 53 kB | ✓ |
framework-HASH.js gzip | 57.5 kB | 57.5 kB | N/A |
main-app-HASH.js gzip | 240 B | 242 B | N/A |
main-HASH.js gzip | 34.5 kB | 34.5 kB | N/A |
webpack-HASH.js gzip | 1.71 kB | 1.71 kB | N/A |
Overall change | 53 kB | 53 kB | ✓ |
Legacy Client Bundles (polyfills)
vercel/next.js canary | vercel/next.js 02-05-dev_error_overlay_add_loading_state | 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 | vercel/next.js 02-05-dev_error_overlay_add_loading_state | 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.59 kB | 4.58 kB | N/A |
index-HASH.js gzip | 268 B | 268 B | ✓ |
link-HASH.js gzip | 2.35 kB | 2.35 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 | vercel/next.js 02-05-dev_error_overlay_add_loading_state | Change | |
---|---|---|---|
_buildManifest.js gzip | 748 B | 747 B | N/A |
Overall change | 0 B | 0 B | ✓ |
Rendered Page Sizes
vercel/next.js canary | vercel/next.js 02-05-dev_error_overlay_add_loading_state | Change | |
---|---|---|---|
index.html gzip | 523 B | 524 B | N/A |
link.html gzip | 538 B | 539 B | N/A |
withRouter.html gzip | 519 B | 520 B | N/A |
Overall change | 0 B | 0 B | ✓ |
Edge SSR bundle Size
vercel/next.js canary | vercel/next.js 02-05-dev_error_overlay_add_loading_state | Change | |
---|---|---|---|
edge-ssr.js gzip | 130 kB | 130 kB | N/A |
page.js gzip | 211 kB | 211 kB | N/A |
Overall change | 0 B | 0 B | ✓ |
Middleware size
vercel/next.js canary | vercel/next.js 02-05-dev_error_overlay_add_loading_state | Change | |
---|---|---|---|
middleware-b..fest.js gzip | 673 B | 672 B | N/A |
middleware-r..fest.js gzip | 155 B | 156 B | N/A |
middleware.js gzip | 31.3 kB | 31.3 kB | N/A |
edge-runtime..pack.js gzip | 844 B | 844 B | ✓ |
Overall change | 844 B | 844 B | ✓ |
Next Runtimes Overall increase ⚠️
vercel/next.js canary | vercel/next.js 02-05-dev_error_overlay_add_loading_state | Change | |
---|---|---|---|
app-page-exp...dev.js gzip | 394 kB | 394 kB | |
app-page-exp..prod.js gzip | 132 kB | 132 kB | ✓ |
app-page-tur..prod.js gzip | 145 kB | 145 kB | ✓ |
app-page-tur..prod.js gzip | 141 kB | 141 kB | ✓ |
app-page.run...dev.js gzip | 381 kB | 382 kB | |
app-page.run..prod.js gzip | 128 kB | 128 kB | ✓ |
app-route-ex...dev.js gzip | 39.3 kB | 39.3 kB | ✓ |
app-route-ex..prod.js gzip | 25.6 kB | 25.6 kB | ✓ |
app-route-tu..prod.js gzip | 25.6 kB | 25.6 kB | ✓ |
app-route-tu..prod.js gzip | 25.4 kB | 25.4 kB | ✓ |
app-route.ru...dev.js gzip | 40.9 kB | 40.9 kB | ✓ |
app-route.ru..prod.js gzip | 25.4 kB | 25.4 kB | ✓ |
dist_client_...dev.js gzip | 356 B | 356 B | ✓ |
dist_client_...dev.js gzip | 349 B | 349 B | ✓ |
pages-api-tu..prod.js gzip | 9.69 kB | 9.69 kB | ✓ |
pages-api.ru...dev.js gzip | 11.8 kB | 11.8 kB | ✓ |
pages-api.ru..prod.js gzip | 9.68 kB | 9.68 kB | ✓ |
pages-turbo...prod.js gzip | 21.9 kB | 21.9 kB | ✓ |
pages.runtim...dev.js gzip | 31.5 kB | 31.5 kB | ✓ |
pages.runtim..prod.js gzip | 21.9 kB | 21.9 kB | ✓ |
server.runti..prod.js gzip | 60.5 kB | 60.5 kB | ✓ |
Overall change | 1.67 MB | 1.67 MB |
build cache Overall increase ⚠️
vercel/next.js canary | vercel/next.js 02-05-dev_error_overlay_add_loading_state | Change | |
---|---|---|---|
0.pack gzip | 2.11 MB | 2.1 MB | N/A |
index.pack gzip | 74 kB | 75.5 kB | |
Overall change | 74 kB | 75.5 kB |
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.runtime.dev.js
Diff too large to display
be4408d
to
ec2df4b
Compare
ec2df4b
to
07ab9f0
Compare
What?
When a page with an error loads, it initially displays a no-error state before switching to the error state a few seconds later, resulting in a bad user experience.
Particularly, if you have multiple errors, you will see intermediate stages while the source mapping is being resolved.
https://github.com/user-attachments/assets/90e66d7f-9cf2-4449-ad31-eec28f65d729
Why?
Stack frame request blocks the modal.
How?
Leverage
use
and Suspense boundary to only defer the rendering of the code frame that requires async data while keeping the sync rendering of other part of the UI.Note that there is currently no loading UI design but I think this is good enough considering the loading state is usually pretty fast.
Comparison (with 3s throttle)
Before:
CleanShot 2025-02-05 at 19.41.14.mp4 (uploaded via Graphite)
After:
CleanShot 2025-02-05 at 19.39.13.mp4 (uploaded via Graphite)
Closes NDX-740