Skip to content

Conversation

@sebmarkbage
Copy link
Collaborator

We currently only track the reason something might suspend in development mode through debug info but this excludes some cases. As a result we can end up with boundary that suspends but has no cause. This tries to detect that and show a notice for why that might be. I'm also trying to make it work with old React versions to cover everything.

In production we don't track any of this meta data like _debugInfo, _debugThenable etc. so after resolution there's no information to take from. Except suspensey images / css which we can track in prod too. We could track lazy component types already. We'd have to add something that tracks after the fact if something used a lazy child, child as a promise, hooks, etc. which doesn't exist today. So that's not backwards compatible and might add some perf/memory cost. However, another strategy is also to try to replay the components after the fact which could be backwards compatible. That's tricky for child position since there's so many rules for how to do that which would have to be replicated.

If you're in development you get a different error. Given that we've added instrumentation very recently. If you're on an older development version of React, then you get a different error. Unfortunately I think my feature test is not quite perfect because it's tricky to test for the instrumentation I just added. #34146 So I think for some prereleases that has _debugOwner but doesn't have that you'll get a misleading error.

Finally, if you're in a modern development environment, the only reason we should have any gaps is because of throw-a-Promise. This will highlight it as missing. We can detect that something threw if a Suspense boundary commits with a RetryCache but since it's a WeakSet we can't look into it to see anything about what it might have been. I don't plan on doing anything to improve this since it would only apply to new versions of React anyway and it's just inherently flawed. So just deprecate it #34032.

Note that nothing in here can detect that we suspended Transition. So throwing at the root or in an update won't show that anywhere.

@sebmarkbage sebmarkbage requested a review from eps1lon August 14, 2025 00:40
@meta-cla meta-cla bot added the CLA Signed label Aug 14, 2025
@github-actions github-actions bot added the React Core Team Opened by a member of the React Core Team label Aug 14, 2025
outdated version of a library that doesn't yet fully take advantage of
use(). Upgrade your data fetching library to see exactly what might
suspend.
</div>
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note that this error can also be shown when use() is conditionally used. #34030.

@sebmarkbage sebmarkbage force-pushed the devtoolsthrowpromise branch from 806a4e8 to 5c62446 Compare August 15, 2025 17:36
@sebmarkbage sebmarkbage merged commit 431bb0b into facebook:main Aug 15, 2025
241 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed React Core Team Opened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants