[DevTools] Stop mounting empty roots (#34467)

This commit is contained in:
Sebastian "Sebbie" Silbermann 2025-09-11 20:00:53 +02:00 committed by GitHub
parent 7fc888dde2
commit a9ad64c852
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 24 additions and 26 deletions

View File

@ -2489,7 +2489,7 @@ describe('Store', () => {
withErrorsOrWarningsIgnored(['test-only:'], async () => {
await act(() => render(<React.Fragment />));
});
expect(store).toMatchInlineSnapshot(`[root]`);
expect(store).toMatchInlineSnapshot(``);
expect(store.componentWithErrorCount).toBe(0);
expect(store.componentWithWarningCount).toBe(0);
});
@ -3083,6 +3083,9 @@ describe('Store', () => {
it('should handle an empty root', async () => {
await actAsync(() => render(null));
expect(store).toMatchInlineSnapshot(``);
await actAsync(() => render(<span />));
expect(store).toMatchInlineSnapshot(`[root]`);
});
});

View File

@ -5322,12 +5322,12 @@ export function attach(
root: FiberRoot,
priorityLevel: void | number,
) {
const current = root.current;
const nextFiber = root.current;
let prevFiber: null | Fiber = null;
let rootInstance = rootToFiberInstanceMap.get(root);
if (!rootInstance) {
rootInstance = createFiberInstance(current);
rootInstance = createFiberInstance(nextFiber);
rootToFiberInstanceMap.set(root, rootInstance);
idToDevToolsInstanceMap.set(rootInstance.id, rootInstance);
} else {
@ -5366,31 +5366,26 @@ export function attach(
};
}
if (prevFiber !== null) {
// TODO: relying on this seems a bit fishy.
const wasMounted =
prevFiber.memoizedState != null &&
prevFiber.memoizedState.element != null;
const isMounted =
current.memoizedState != null && current.memoizedState.element != null;
if (!wasMounted && isMounted) {
const nextIsMounted = nextFiber.child !== null;
const prevWasMounted = prevFiber !== null && prevFiber.child !== null;
if (!prevWasMounted && nextIsMounted) {
// Mount a new root.
setRootPseudoKey(currentRoot.id, current);
mountFiberRecursively(current, false);
} else if (wasMounted && isMounted) {
setRootPseudoKey(currentRoot.id, nextFiber);
mountFiberRecursively(nextFiber, false);
} else if (prevWasMounted && nextIsMounted) {
if (prevFiber === null) {
throw new Error(
'Expected a previous Fiber when updating an existing root.',
);
}
// Update an existing root.
updateFiberRecursively(rootInstance, current, prevFiber, false);
} else if (wasMounted && !isMounted) {
updateFiberRecursively(rootInstance, nextFiber, prevFiber, false);
} else if (prevWasMounted && !nextIsMounted) {
// Unmount an existing root.
unmountInstanceRecursively(rootInstance);
removeRootPseudoKey(currentRoot.id);
rootToFiberInstanceMap.delete(root);
}
} else {
// Mount a new root.
setRootPseudoKey(currentRoot.id, current);
mountFiberRecursively(current, false);
}
if (isProfiling && isProfilingSupported) {
if (!shouldBailoutWithPendingOperations()) {