-
Notifications
You must be signed in to change notification settings - Fork 47.2k
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
Show deprecated context object warnings usage in ReactDOM server #14033
Merged
Merged
Changes from 4 commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
9262995
Applies context object warnings to ReactDOM server
trueadm 7514a7b
fix flow
trueadm 49346bd
Merge remote-tracking branch 'upstream/master' into ssr-context-objec…
trueadm f533a4b
Fix eslint
trueadm 0afeb07
run prettier
trueadm 65cab46
address feedback
trueadm File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -10,7 +10,6 @@ | |
import type {ReactElement} from 'shared/ReactElementType'; | ||
import type { | ||
ReactProvider, | ||
ReactConsumer, | ||
ReactContext, | ||
} from 'shared/ReactTypes'; | ||
|
||
|
@@ -91,6 +90,7 @@ let validatePropertiesInDevelopment = (type, props) => {}; | |
let pushCurrentDebugStack = (stack: Array<Frame>) => {}; | ||
let pushElementToDebugStack = (element: ReactElement) => {}; | ||
let popCurrentDebugStack = () => {}; | ||
let hasWarnedAboutUsingContextAsConsumer = false; | ||
|
||
if (__DEV__) { | ||
ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame; | ||
|
@@ -1054,9 +1054,35 @@ class ReactDOMServerRenderer { | |
return ''; | ||
} | ||
case REACT_CONTEXT_TYPE: { | ||
const consumer: ReactConsumer<any> = (nextChild: any); | ||
const nextProps: any = consumer.props; | ||
const nextValue = consumer.type._currentValue; | ||
let reactContext: ReactContext<any> = (nextChild: any).type; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Seems a little odd that we're any-casting something that explicitly might not be |
||
// The logic below for Context differs depending on PROD or DEV mode. In | ||
// DEV mode, we create a separate object for Context.Consumer that acts | ||
// like a proxy to Context. This proxy object adds unnecessary code in PROD | ||
// so we use the old behaviour (Context.Consumer references Context) to | ||
// reduce size and overhead. The separate object references context via | ||
// a property called "_context", which also gives us the ability to check | ||
// in DEV mode if this property exists or not and warn if it does not. | ||
if (__DEV__) { | ||
if ((reactContext: any)._context === undefined) { | ||
// This may be because it's a Context (rather than a Consumer). | ||
// Or it may be because it's older React where they're the same thing. | ||
// We only want to warn if we're sure it's a new React. | ||
if (reactContext !== reactContext.Consumer) { | ||
if (!hasWarnedAboutUsingContextAsConsumer) { | ||
hasWarnedAboutUsingContextAsConsumer = true; | ||
warning( | ||
false, | ||
'Rendering <Context> directly is not supported and will be removed in ' + | ||
'a future major release. Did you mean to render <Context.Consumer> instead?', | ||
); | ||
} | ||
} | ||
} else { | ||
reactContext = (reactContext: any)._context; | ||
} | ||
} | ||
const nextProps: any = (nextChild: any).props; | ||
const nextValue = reactContext._currentValue; | ||
|
||
const nextChildren = toArray(nextProps.children(nextValue)); | ||
const frame: Frame = { | ||
|
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
These tests seem a little weak since they don't assert on what the error message actually is. I guess
ReactDOMServerIntegrationTestUtils
doesn't provide a mechanism to do this currently, but it seems like it would be an improvement if e.g.expectErrors
supported either a number or an error of partial messages.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 agree, this is something I stumbled into. It can be something we do as a follow up as I know that we're planning on making some changes to the server renderer and this might flow nicely with that workload.