Cleanup enableEagerAlternateStateNodeCleanup feature flag (#35508)
## Summary This has been fully rolled out internally and was manually merged in the RN release in https://github.com/facebook/react-native/commit/0411c43b3a239384c778baad22c7b4c501008449 ## How did you test this change? `yarn flow fabric`
Pieter De Baets committed
Jun 23, 2026 at 10:55 UTC
8a5274d8c8ce8649661656003e6e54e19f6dc0c3
9 files changed
+10
-23
packages/react-reconciler/src/ReactFiberCommitWork.js
+10
-13
@@ -59,7 +59,6 @@ import {
59
enableComponentPerformanceTrack,
60
enableViewTransition,
61
enableFragmentRefs,
62
- enableEagerAlternateStateNodeCleanup,
62
enableDefaultTransitionIndicator,
63
enableFragmentRefsTextNodes,
64
} from 'shared/ReactFeatureFlags';
@@ -2270,18 +2269,16 @@ function commitMutationEffectsOnFiber(
2269
}
2270
}
2271
} else {
2273
- if (enableEagerAlternateStateNodeCleanup) {
2274
- // $FlowFixMe[constant-condition]
2275
- if (supportsPersistence) {
2276
- if (finishedWork.alternate !== null) {
2277
- // `finishedWork.alternate.stateNode` is pointing to a stale shadow
2278
- // node at this point, retaining it and its subtree. To reclaim
2279
- // memory, point `alternate.stateNode` to new shadow node. This
2280
- // prevents shadow node from staying in memory longer than it
2281
- // needs to. The correct behaviour of this is checked by test in
2282
- // React Native: ShadowNodeReferenceCounter-itest.js#L150
2283
- finishedWork.alternate.stateNode = finishedWork.stateNode;
2284
- }
2272
+ // $FlowFixMe[constant-condition]
2273
+ if (supportsPersistence) {
2274
+ if (finishedWork.alternate !== null) {
2275
+ // `finishedWork.alternate.stateNode` is pointing to a stale shadow
2276
+ // node at this point, retaining it and its subtree. To reclaim
2277
+ // memory, point `alternate.stateNode` to new shadow node. This
2278
+ // prevents shadow node from staying in memory longer than it
2279
+ // needs to. The correct behaviour of this is checked by test in
2280
+ // React Native: ShadowNodeReferenceCounter-itest.js#L150
2281
+ finishedWork.alternate.stateNode = finishedWork.stateNode;
2282
}
2283
}
2284
}
packages/shared/ReactFeatureFlags.js
-2
@@ -129,8 +129,6 @@ export const enableEffectEventMutationPhase: boolean = false;
129
130
export const passChildrenWhenCloningPersistedNodes: boolean = false;
131
132
-export const enableEagerAlternateStateNodeCleanup: boolean = true;
133
-
132
/**
133
* Enables an expiration time for retry lanes to avoid starvation.
134
*/
packages/shared/forks/ReactFeatureFlags.native-fb-dynamic.js
-1
@@ -19,7 +19,6 @@
19
20
export const alwaysThrottleRetries = __VARIANT__;
21
export const enableObjectFiber = __VARIANT__;
22
-export const enableEagerAlternateStateNodeCleanup = __VARIANT__;
22
export const passChildrenWhenCloningPersistedNodes = __VARIANT__;
23
export const enableFragmentRefs = __VARIANT__;
24
export const enableFragmentRefsScrollIntoView = __VARIANT__;
packages/shared/forks/ReactFeatureFlags.native-fb.js
-1
@@ -22,7 +22,6 @@ export const {
22
alwaysThrottleRetries,
23
enableEffectEventMutationPhase,
24
enableObjectFiber,
25
- enableEagerAlternateStateNodeCleanup,
25
passChildrenWhenCloningPersistedNodes,
26
enableFragmentRefs,
27
enableFragmentRefsScrollIntoView,
packages/shared/forks/ReactFeatureFlags.native-oss.js
-1
@@ -44,7 +44,6 @@ export const enablePerformanceIssueReporting: boolean = false;
44
export const enableSchedulingProfiler: boolean =
45
!enableComponentPerformanceTrack && __PROFILE__;
46
export const enableScopeAPI: boolean = false;
47
-export const enableEagerAlternateStateNodeCleanup: boolean = true;
47
export const enableEffectEventMutationPhase: boolean = false;
48
export const enableSuspenseAvoidThisFallback: boolean = false;
49
export const enableSuspenseCallback: boolean = false;
packages/shared/forks/ReactFeatureFlags.test-renderer.js
-1
@@ -54,7 +54,6 @@ export const disableClientCache: boolean = true;
54
export const enableInfiniteRenderLoopDetection: boolean = false;
55
export const enableInfiniteRenderLoopDetectionForceThrow: boolean = false;
56
57
-export const enableEagerAlternateStateNodeCleanup: boolean = true;
57
export const enableEffectEventMutationPhase: boolean = false;
58
59
export const enableYieldingBeforePassive: boolean = true;
packages/shared/forks/ReactFeatureFlags.test-renderer.native-fb.js
-1
@@ -41,7 +41,6 @@ export const enableSchedulingProfiler = __PROFILE__;
41
export const enableComponentPerformanceTrack = false;
42
export const enablePerformanceIssueReporting = false;
43
export const enableScopeAPI = false;
44
-export const enableEagerAlternateStateNodeCleanup = true;
44
export const enableEffectEventMutationPhase = false;
45
export const enableSuspenseAvoidThisFallback = false;
46
export const enableSuspenseCallback = false;
packages/shared/forks/ReactFeatureFlags.test-renderer.www.js
-1
@@ -60,7 +60,6 @@ export const enableReactTestRendererWarning: boolean = false;
60
export const disableLegacyMode: boolean = true;
61
62
export const enableObjectFiber: boolean = false;
63
-export const enableEagerAlternateStateNodeCleanup: boolean = true;
63
export const enableEffectEventMutationPhase: boolean = false;
64
65
export const enableYieldingBeforePassive: boolean = false;
packages/shared/forks/ReactFeatureFlags.www.js
-2
@@ -98,8 +98,6 @@ export const enableReactTestRendererWarning: boolean = false;
98
99
export const disableLegacyMode: boolean = true;
100
101
-export const enableEagerAlternateStateNodeCleanup: boolean = true;
102
-
101
export const enableViewTransitionForPersistenceMode: boolean = false;
102
103
export const enableGestureTransition: boolean = false;