facebook/react · error · Error
The should not be any remaining suspense node children if th
Error message
The should not be any remaining suspense node children if there is no parent.
What it means
Internal invariant in the React DevTools backend's incremental tree mirroring. When a fiber bails out, consumeSuspenseNodesOfExistingInstance re-attaches leftover Suspense boundaries to the instance; finding remaining suspense child nodes while reconcilingParentSuspenseNode is null means the traversal's suspense bookkeeping is inconsistent. This is a DevTools-backend consistency error, normally caused by a bug or a renderer/DevTools version mismatch, not by app code.
Source
Thrown at packages/react-devtools-shared/src/backend/fiber/renderer.js:2719
child = child.nextSibling
) {
measureUnchangedSuspenseNodesRecursively(child);
}
suspenseNode.rects = nextRects;
recordSuspenseResize(suspenseNode);
}
function consumeSuspenseNodesOfExistingInstance(
instance: DevToolsInstance,
): void {
// We need to also consume any unchanged Suspense boundaries.
let suspenseNode = remainingReconcilingChildrenSuspenseNodes;
if (suspenseNode === null) {
return;
}
const parentSuspenseNode = reconcilingParentSuspenseNode;
if (parentSuspenseNode === null) {
throw new Error(
'The should not be any remaining suspense node children if there is no parent.',
);
}
let foundOne = false;
let previousSkippedSibling = null;
while (suspenseNode !== null) {
// Check if this SuspenseNode was a child of the bailed out FiberInstance.
if (
isChildOf(instance, suspenseNode.instance, parentSuspenseNode.instance)
) {
foundOne = true;
// The suspenseNode was child of the bailed out Fiber.
// First, remove it from the remaining children set.
const nextRemainingSibling = suspenseNode.nextSibling;
if (previousSkippedSibling === null) {
remainingReconcilingChildrenSuspenseNodes = nextRemainingSibling;
} else {
previousSkippedSibling.nextSibling = nextRemainingSibling;View on GitHub (pinned to eafeac097b)
Solutions
- Update the React DevTools extension / react-devtools-shared to the build matching your React release channel (stable vs canary)
- Reload the page so the backend re-mounts the whole tree from scratch instead of resuming corrupted reconciliation state
- Reduce to a minimal repro (component + Suspense nesting + update pattern) and report it to the facebook/react repo with the component stack
- If embedding the backend, wrap the commit hook so one bad commit logs a warning instead of killing the bridge
Defensive patterns
Strategy: try-catch
Try / catch
// when embedding the react-devtools-shared backend
try {
backend.handleCommitFiberRoot(renderer, root);
} catch (e) {
if (/remaining suspense node children if there is no parent/.test(e.message)) {
reportDevToolsBug(e, root); scheduleBackendReset(); // log + rebuild mirror
} else throw e;
} Prevention
- Keep the DevTools extension/backend version matched to the React release channel (stable vs canary)
- Attach DevTools before page load or reload after errors so reconciliation state is rebuilt cleanly
- Verify only one DevTools backend instance is attached to the renderer
- Capture minimal Suspense bailout repros early - these invariants are backend bugs, not app bugs
When it happens
Trigger: Attaching DevTools to an app whose updates bail out inside nested Suspense boundaries; rapid commits or hydration completing while the DevTools tree is being rebuilt; running a canary/experimental React with a stable DevTools backend that does not share the same tree-shape assumptions.
Common situations: DevTools extension or react-devtools-shared version out of sync with the React renderer version; SSR apps with deep Suspense nesting where bailouts are common; embedded DevTools backends (React Native DevTools) pinned to an older copy.
Related errors
- There should always be an Offscreen Fiber child in a hydrate
- A dehydrated Suspense node should not have a content Fiber.
- Encountered a dehydrated Suspense boundary that was previous
- Attempted to measure a Suspense node that does not exist.
- There should always be a SuspenseNode parent on a mounted in
AI-assisted analysis of facebook/react@eafeac097b (2026-08-21).
Data as JSON: /api/errors/fb5896b82505e207.
Report an issue: GitHub.