Skip to content

Commit 0db83ce

Browse files
committed
Add useModernStrictMode as dynamic flag on www (#28346)
## Summary Preparing modern strict mode rollout with dynamic feature flag ## How did you test this change? ![Screenshot 2024-02-15 at 10 09 49 AM](https://github.com/facebook/react/assets/8965173/9e90efc2-3578-4e63-ae2c-63d4a4e194b3) DiffTrain build for [ef72271](ef72271)
1 parent 651e755 commit 0db83ce

20 files changed

+727
-39
lines changed

compiled/facebook-www/JSXDEVRuntime-dev.classic.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ if (__DEV__) {
109109

110110
var enableDebugTracing = dynamicFeatureFlags.enableDebugTracing,
111111
enableTransitionTracing = dynamicFeatureFlags.enableTransitionTracing,
112-
enableRenderableContext = dynamicFeatureFlags.enableRenderableContext; // On WWW, false is used for a new modern build.
112+
enableRenderableContext = dynamicFeatureFlags.enableRenderableContext;
113+
// On WWW, false is used for a new modern build.
113114

114115
var REACT_CLIENT_REFERENCE$2 = Symbol.for("react.client.reference");
115116
function isValidElementType(type) {

compiled/facebook-www/JSXDEVRuntime-dev.modern.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,8 @@ if (__DEV__) {
109109

110110
var enableDebugTracing = dynamicFeatureFlags.enableDebugTracing,
111111
enableTransitionTracing = dynamicFeatureFlags.enableTransitionTracing,
112-
enableRenderableContext = dynamicFeatureFlags.enableRenderableContext; // On WWW, true is used for a new modern build.
112+
enableRenderableContext = dynamicFeatureFlags.enableRenderableContext;
113+
// On WWW, true is used for a new modern build.
113114

114115
var REACT_CLIENT_REFERENCE$2 = Symbol.for("react.client.reference");
115116
function isValidElementType(type) {

compiled/facebook-www/REVISION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
a9cc32511a12c261ee719e5383818182800d6af4
1+
ef72271c2d1234c9d1e1358f8083021089a50faa

compiled/facebook-www/React-dev.classic.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ if (__DEV__) {
2424
) {
2525
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
2626
}
27-
var ReactVersion = "18.3.0-www-classic-77843590";
27+
var ReactVersion = "18.3.0-www-classic-435f93e8";
2828

2929
// ATTENTION
3030
// When adding new symbols to this file,
@@ -475,7 +475,8 @@ if (__DEV__) {
475475

476476
var enableDebugTracing = dynamicFeatureFlags.enableDebugTracing,
477477
enableTransitionTracing = dynamicFeatureFlags.enableTransitionTracing,
478-
enableRenderableContext = dynamicFeatureFlags.enableRenderableContext; // On WWW, false is used for a new modern build.
478+
enableRenderableContext = dynamicFeatureFlags.enableRenderableContext;
479+
// On WWW, false is used for a new modern build.
479480

480481
function getWrappedName(outerType, innerType, wrapperName) {
481482
var displayName = outerType.displayName;

compiled/facebook-www/React-dev.modern.js

+3-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ if (__DEV__) {
2424
) {
2525
__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStart(new Error());
2626
}
27-
var ReactVersion = "18.3.0-www-modern-0bb55f38";
27+
var ReactVersion = "18.3.0-www-modern-d64ea480";
2828

2929
// ATTENTION
3030
// When adding new symbols to this file,
@@ -475,7 +475,8 @@ if (__DEV__) {
475475

476476
var enableDebugTracing = dynamicFeatureFlags.enableDebugTracing,
477477
enableTransitionTracing = dynamicFeatureFlags.enableTransitionTracing,
478-
enableRenderableContext = dynamicFeatureFlags.enableRenderableContext; // On WWW, true is used for a new modern build.
478+
enableRenderableContext = dynamicFeatureFlags.enableRenderableContext;
479+
// On WWW, true is used for a new modern build.
479480

480481
function getWrappedName(outerType, innerType, wrapperName) {
481482
var displayName = outerType.displayName;

compiled/facebook-www/React-prod.classic.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -618,4 +618,4 @@ exports.useSyncExternalStore = function (
618618
exports.useTransition = function () {
619619
return ReactCurrentDispatcher.current.useTransition();
620620
};
621-
exports.version = "18.3.0-www-classic-707cd731";
621+
exports.version = "18.3.0-www-classic-863536b2";

compiled/facebook-www/React-prod.modern.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -610,4 +610,4 @@ exports.useSyncExternalStore = function (
610610
exports.useTransition = function () {
611611
return ReactCurrentDispatcher.current.useTransition();
612612
};
613-
exports.version = "18.3.0-www-modern-f4321f8c";
613+
exports.version = "18.3.0-www-modern-19268851";

compiled/facebook-www/ReactART-dev.classic.js

+116-3
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ if (__DEV__) {
6666
return self;
6767
}
6868

69-
var ReactVersion = "18.3.0-www-classic-fc548c7d";
69+
var ReactVersion = "18.3.0-www-classic-162b9b5d";
7070

7171
var LegacyRoot = 0;
7272
var ConcurrentRoot = 1;
@@ -187,7 +187,8 @@ if (__DEV__) {
187187
dynamicFeatureFlags.transitionLaneExpirationMs,
188188
enableInfiniteRenderLoopDetection =
189189
dynamicFeatureFlags.enableInfiniteRenderLoopDetection,
190-
enableRenderableContext = dynamicFeatureFlags.enableRenderableContext; // On WWW, false is used for a new modern build.
190+
enableRenderableContext = dynamicFeatureFlags.enableRenderableContext,
191+
useModernStrictMode = dynamicFeatureFlags.useModernStrictMode; // On WWW, false is used for a new modern build.
191192
var enableProfilerTimer = true;
192193
var enableProfilerCommitHooks = true;
193194
var enableProfilerNestedUpdatePhase = true;
@@ -28106,9 +28107,121 @@ if (__DEV__) {
2810628107
}
2810728108
}
2810828109

28110+
function recursivelyTraverseAndDoubleInvokeEffectsInDEV(
28111+
root,
28112+
parentFiber,
28113+
isInStrictMode
28114+
) {
28115+
if (
28116+
(parentFiber.subtreeFlags & (PlacementDEV | Visibility)) ===
28117+
NoFlags$1
28118+
) {
28119+
// Parent's descendants have already had effects double invoked.
28120+
// Early exit to avoid unnecessary tree traversal.
28121+
return;
28122+
}
28123+
28124+
var child = parentFiber.child;
28125+
28126+
while (child !== null) {
28127+
doubleInvokeEffectsInDEVIfNecessary(root, child, isInStrictMode);
28128+
child = child.sibling;
28129+
}
28130+
} // Unconditionally disconnects and connects passive and layout effects.
28131+
28132+
function doubleInvokeEffectsOnFiber(root, fiber) {
28133+
var shouldDoubleInvokePassiveEffects =
28134+
arguments.length > 2 && arguments[2] !== undefined
28135+
? arguments[2]
28136+
: true;
28137+
disappearLayoutEffects(fiber);
28138+
28139+
if (shouldDoubleInvokePassiveEffects) {
28140+
disconnectPassiveEffect(fiber);
28141+
}
28142+
28143+
reappearLayoutEffects(root, fiber.alternate, fiber, false);
28144+
28145+
if (shouldDoubleInvokePassiveEffects) {
28146+
reconnectPassiveEffects(root, fiber, NoLanes, null, false);
28147+
}
28148+
}
28149+
28150+
function doubleInvokeEffectsInDEVIfNecessary(
28151+
root,
28152+
fiber,
28153+
parentIsInStrictMode
28154+
) {
28155+
var isStrictModeFiber = fiber.type === REACT_STRICT_MODE_TYPE;
28156+
var isInStrictMode = parentIsInStrictMode || isStrictModeFiber; // First case: the fiber **is not** of type OffscreenComponent. No
28157+
// special rules apply to double invoking effects.
28158+
28159+
if (fiber.tag !== OffscreenComponent) {
28160+
if (fiber.flags & PlacementDEV) {
28161+
setCurrentFiber(fiber);
28162+
28163+
if (isInStrictMode) {
28164+
doubleInvokeEffectsOnFiber(
28165+
root,
28166+
fiber,
28167+
(fiber.mode & NoStrictPassiveEffectsMode) === NoMode
28168+
);
28169+
}
28170+
28171+
resetCurrentFiber();
28172+
} else {
28173+
recursivelyTraverseAndDoubleInvokeEffectsInDEV(
28174+
root,
28175+
fiber,
28176+
isInStrictMode
28177+
);
28178+
}
28179+
28180+
return;
28181+
} // Second case: the fiber **is** of type OffscreenComponent.
28182+
// This branch contains cases specific to Offscreen.
28183+
28184+
if (fiber.memoizedState === null) {
28185+
// Only consider Offscreen that is visible.
28186+
// TODO (Offscreen) Handle manual mode.
28187+
setCurrentFiber(fiber);
28188+
28189+
if (isInStrictMode && fiber.flags & Visibility) {
28190+
// Double invoke effects on Offscreen's subtree only
28191+
// if it is visible and its visibility has changed.
28192+
doubleInvokeEffectsOnFiber(root, fiber);
28193+
} else if (fiber.subtreeFlags & PlacementDEV) {
28194+
// Something in the subtree could have been suspended.
28195+
// We need to continue traversal and find newly inserted fibers.
28196+
recursivelyTraverseAndDoubleInvokeEffectsInDEV(
28197+
root,
28198+
fiber,
28199+
isInStrictMode
28200+
);
28201+
}
28202+
28203+
resetCurrentFiber();
28204+
}
28205+
}
28206+
2810928207
function commitDoubleInvokeEffectsInDEV(root, hasPassiveEffects) {
2811028208
{
28111-
{
28209+
if (useModernStrictMode && root.tag !== LegacyRoot) {
28210+
var doubleInvokeEffects = true;
28211+
28212+
if (
28213+
root.tag === ConcurrentRoot &&
28214+
!(root.current.mode & (StrictLegacyMode | StrictEffectsMode))
28215+
) {
28216+
doubleInvokeEffects = false;
28217+
}
28218+
28219+
recursivelyTraverseAndDoubleInvokeEffectsInDEV(
28220+
root,
28221+
root.current,
28222+
doubleInvokeEffects
28223+
);
28224+
} else {
2811228225
legacyCommitDoubleInvokeEffectsInDEV(root.current, hasPassiveEffects);
2811328226
}
2811428227
}

compiled/facebook-www/ReactART-dev.modern.js

+116-3
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ if (__DEV__) {
6666
return self;
6767
}
6868

69-
var ReactVersion = "18.3.0-www-modern-cdfb5e55";
69+
var ReactVersion = "18.3.0-www-modern-4bc0b3fd";
7070

7171
var LegacyRoot = 0;
7272
var ConcurrentRoot = 1;
@@ -187,7 +187,8 @@ if (__DEV__) {
187187
dynamicFeatureFlags.transitionLaneExpirationMs,
188188
enableInfiniteRenderLoopDetection =
189189
dynamicFeatureFlags.enableInfiniteRenderLoopDetection,
190-
enableRenderableContext = dynamicFeatureFlags.enableRenderableContext; // On WWW, true is used for a new modern build.
190+
enableRenderableContext = dynamicFeatureFlags.enableRenderableContext,
191+
useModernStrictMode = dynamicFeatureFlags.useModernStrictMode; // On WWW, true is used for a new modern build.
191192
var enableProfilerTimer = true;
192193
var enableProfilerCommitHooks = true;
193194
var enableProfilerNestedUpdatePhase = true;
@@ -27756,9 +27757,121 @@ if (__DEV__) {
2775627757
}
2775727758
}
2775827759

27760+
function recursivelyTraverseAndDoubleInvokeEffectsInDEV(
27761+
root,
27762+
parentFiber,
27763+
isInStrictMode
27764+
) {
27765+
if (
27766+
(parentFiber.subtreeFlags & (PlacementDEV | Visibility)) ===
27767+
NoFlags$1
27768+
) {
27769+
// Parent's descendants have already had effects double invoked.
27770+
// Early exit to avoid unnecessary tree traversal.
27771+
return;
27772+
}
27773+
27774+
var child = parentFiber.child;
27775+
27776+
while (child !== null) {
27777+
doubleInvokeEffectsInDEVIfNecessary(root, child, isInStrictMode);
27778+
child = child.sibling;
27779+
}
27780+
} // Unconditionally disconnects and connects passive and layout effects.
27781+
27782+
function doubleInvokeEffectsOnFiber(root, fiber) {
27783+
var shouldDoubleInvokePassiveEffects =
27784+
arguments.length > 2 && arguments[2] !== undefined
27785+
? arguments[2]
27786+
: true;
27787+
disappearLayoutEffects(fiber);
27788+
27789+
if (shouldDoubleInvokePassiveEffects) {
27790+
disconnectPassiveEffect(fiber);
27791+
}
27792+
27793+
reappearLayoutEffects(root, fiber.alternate, fiber, false);
27794+
27795+
if (shouldDoubleInvokePassiveEffects) {
27796+
reconnectPassiveEffects(root, fiber, NoLanes, null, false);
27797+
}
27798+
}
27799+
27800+
function doubleInvokeEffectsInDEVIfNecessary(
27801+
root,
27802+
fiber,
27803+
parentIsInStrictMode
27804+
) {
27805+
var isStrictModeFiber = fiber.type === REACT_STRICT_MODE_TYPE;
27806+
var isInStrictMode = parentIsInStrictMode || isStrictModeFiber; // First case: the fiber **is not** of type OffscreenComponent. No
27807+
// special rules apply to double invoking effects.
27808+
27809+
if (fiber.tag !== OffscreenComponent) {
27810+
if (fiber.flags & PlacementDEV) {
27811+
setCurrentFiber(fiber);
27812+
27813+
if (isInStrictMode) {
27814+
doubleInvokeEffectsOnFiber(
27815+
root,
27816+
fiber,
27817+
(fiber.mode & NoStrictPassiveEffectsMode) === NoMode
27818+
);
27819+
}
27820+
27821+
resetCurrentFiber();
27822+
} else {
27823+
recursivelyTraverseAndDoubleInvokeEffectsInDEV(
27824+
root,
27825+
fiber,
27826+
isInStrictMode
27827+
);
27828+
}
27829+
27830+
return;
27831+
} // Second case: the fiber **is** of type OffscreenComponent.
27832+
// This branch contains cases specific to Offscreen.
27833+
27834+
if (fiber.memoizedState === null) {
27835+
// Only consider Offscreen that is visible.
27836+
// TODO (Offscreen) Handle manual mode.
27837+
setCurrentFiber(fiber);
27838+
27839+
if (isInStrictMode && fiber.flags & Visibility) {
27840+
// Double invoke effects on Offscreen's subtree only
27841+
// if it is visible and its visibility has changed.
27842+
doubleInvokeEffectsOnFiber(root, fiber);
27843+
} else if (fiber.subtreeFlags & PlacementDEV) {
27844+
// Something in the subtree could have been suspended.
27845+
// We need to continue traversal and find newly inserted fibers.
27846+
recursivelyTraverseAndDoubleInvokeEffectsInDEV(
27847+
root,
27848+
fiber,
27849+
isInStrictMode
27850+
);
27851+
}
27852+
27853+
resetCurrentFiber();
27854+
}
27855+
}
27856+
2775927857
function commitDoubleInvokeEffectsInDEV(root, hasPassiveEffects) {
2776027858
{
27761-
{
27859+
if (useModernStrictMode && root.tag !== LegacyRoot) {
27860+
var doubleInvokeEffects = true;
27861+
27862+
if (
27863+
root.tag === ConcurrentRoot &&
27864+
!(root.current.mode & (StrictLegacyMode | StrictEffectsMode))
27865+
) {
27866+
doubleInvokeEffects = false;
27867+
}
27868+
27869+
recursivelyTraverseAndDoubleInvokeEffectsInDEV(
27870+
root,
27871+
root.current,
27872+
doubleInvokeEffects
27873+
);
27874+
} else {
2776227875
legacyCommitDoubleInvokeEffectsInDEV(root.current, hasPassiveEffects);
2776327876
}
2776427877
}

0 commit comments

Comments
 (0)