-
Notifications
You must be signed in to change notification settings - Fork 46.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add concept of StrictMode levels 1 & 2 (no public API yet) #20844
Conversation
e12cf07
to
f0a5fac
Compare
Comparing: 4190a34...372bb8b Critical size changesIncludes critical production bundles, as well as any change greater than 2%:
Significant size changesIncludes any change greater than 0.2%: Expand to show
|
StrictMode level sounds nice. |
Both of the new warnings you refer to are related to render phase side effects, so if anything they both belong in level 1. An argument could be made for warning about mutated refs even outside of strict mode. |
Sorry if this is too off-topic - does this mean double invoking the functions passed to |
@jacobp100 For what "strict effects mode" is, check out the original PR: TL;DR: It doesn't just double invoke the functions passed to
--#19523 |
e52ca35
to
dd40e13
Compare
Circle CI doing something weird here I think. Hm. Should sort itself out next time I rebase onto master. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I still wonder if we can wait on this until we have more information but happy to move forward if others want to approve and land.
dd40e13
to
11b8797
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks great, these changes are really exciting 🎉
@@ -46,7 +46,7 @@ import { | |||
} from './ReactFiber.new'; | |||
import {emptyRefsObject} from './ReactFiberClassComponent.new'; | |||
import {isCompatibleFamilyForHotReloading} from './ReactFiberHotReloading.new'; | |||
import {StrictMode} from './ReactTypeOfMode'; | |||
import {StrictLegacyMode} from './ReactTypeOfMode'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Chatted offline and we can follow up with this if we agree - we may want to name this something other than "legacy" since the term overloaded to mean "legacy root", "legacy strict mode" and any other "legacys" we have. I was thinking something like:
NoMode
= 0StrictWarningMode
= Level 1StrictRenderMode
= Level 2StrictEffectMode
= Level 3
…y subtrees into strict mode level one ('mode == StrictModeL1'). This mode enables DEV-only double rendering, double component lifecycles, string ref warnings, legacy context warnings, etc. The primary purpose of this mode is to help detected render phase side effects. No new behavior. Roots created with experimental 'createRoot' and 'createBlockingRoot' APIs will also (for now) continue to default to strict mode level 1. In a subsequent commit I will add support for a 'level' attribute on the '<React.StrictMode>' tag (as well as a new option supported by ). This will be the way to opt into strict mode level 2 ('mode == StrictModeL2'). This mode will enable DEV-only double invoking of effects on initial mount. This will simulate future Offscreen API semantics for trees being mounted, then hidden, and then shown again. The primary purpose of this mode is to enable applications to prepare for compatibility with the new Offscreen API (more information to follow shortly). For now, this commit changes no public facing behavior. The only mechanism for opting into strict mode level 2 is the pre-existing 'enableDoubleInvokingEffects' feature flag (only enabled within Facebook for now).
StrictModeL1 -> StrictLegacyMode and StrictModeL2 -> StrictEffectsMode
11b8797
to
372bb8b
Compare
Merged via #20849 |
PR Stack
Strict mode level 0 (aka loose or sloppy mode)
This isn't really a mode so much as it's the absence of any strict modes.
Strict mode level 1 (aka legacy mode)
The exported
<React.StrictMode>
tag remains the same and opts legacy subtrees into strict mode level one (mode == StrictLegacyMode
). This mode enables DEV-only double rendering, double component lifecycles, string ref warnings, legacy context warnings, etc. The primary purpose of this mode is to help detected render phase side effects. No new behavior. Roots created with experimentalcreateRoot
andcreateBlockingRoot
APIs will also (for now) continue to default to strict mode level 1.Strict mode level 2 (aka strict effects mode)
In a subsequent commit I will add support for a
"level"
attribute on the<React.StrictMode>
tag (as well as a new option supported bycreateRoot
). This will be the way to opt into strict mode level 2 (mode == StrictEffectsMode
). This mode will enable DEV-only double invoking of effects on initial mount (see #19523). This will simulate future Offscreen API semantics for trees being mounted, then hidden, and then shown again. The primary purpose of this mode is to enable applications to prepare for compatibility with the new Offscreen API (more information to follow shortly).Strict mode level >= 3?
In the future we may add additional strict mode levels (TBD).
External changes?
For now, this commit changes no public facing behavior. The only mechanism for opting into strict mode level 2 is the pre-existing
enableDoubleInvokingEffects
feature flag (only enabled within Facebook for now).