Skip to content
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

Switch <Context> to mean <Context.Provider> #28226

Merged
merged 3 commits into from
Feb 13, 2024
Merged

Conversation

gaearon
Copy link
Collaborator

@gaearon gaearon commented Feb 3, 2024

Previously, <Context> was equivalent to <Context.Consumer>. However, since the introduction of Hooks, the <Context.Consumer> API is rarely used. The goal here is to make the common case cleaner:

const ThemeContext = createContext('light')

function App() {
  return (
    <ThemeContext value="dark">
      ...
    </ThemeContext>
  )
}

function Button() {
  const theme = use(ThemeContext)
  // ...
}

This is technically a breaking change, but we've been warning about rendering <Context> directly for several years by now, so it's unlikely much code in the wild depends on the old behavior. Proof that it warns today (check console).


The relevant commit is 5696782. It switches createContext implementation so that Context.Provider === Context.

The main assumption that changed is that a Provider's fiber type is now the context itself (rather than an intermediate object). Whereas a Consumer's fiber type is now always an intermediate object (rather than it being sometimes the context itself and sometimes an intermediate object).

My methodology was to start with the relevant symbols, work tags, and types, and work my way backwards to all usages.

This might break tooling that depends on inspecting React's internal fields. I've added DevTools support in the second commit. This didn't need explicit versioning—the structure tells us enough.

@react-sizebot
Copy link

react-sizebot commented Feb 3, 2024

Comparing: 35b2c28...c86765f

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.min.js +0.02% 176.82 kB 176.86 kB = 55.12 kB 55.12 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js +0.02% 178.81 kB 178.85 kB = 55.70 kB 55.69 kB
facebook-www/ReactDOM-prod.classic.js +0.25% 593.39 kB 594.89 kB +0.22% 104.69 kB 104.92 kB
facebook-www/ReactDOM-prod.modern.js +0.17% 577.17 kB 578.18 kB +0.15% 101.78 kB 101.94 kB
facebook-www/ReactIs-dev.modern.js +13.56% 7.30 kB 8.29 kB +8.20% 1.82 kB 1.97 kB
facebook-www/ReactIs-dev.classic.js +13.56% 7.30 kB 8.29 kB +8.36% 1.82 kB 1.97 kB
facebook-www/ReactIs-prod.classic.js +13.36% 5.14 kB 5.83 kB +7.67% 1.26 kB 1.36 kB
facebook-www/ReactIs-prod.modern.js +13.36% 5.14 kB 5.83 kB +7.67% 1.26 kB 1.36 kB
oss-stable-semver/react-is/cjs/react-is.production.js +5.92% 6.25 kB 6.62 kB +4.89% 1.72 kB 1.80 kB
oss-stable/react-is/cjs/react-is.production.js +5.92% 6.25 kB 6.62 kB +4.89% 1.72 kB 1.80 kB
oss-experimental/react-is/cjs/react-is.production.js +5.90% 6.28 kB 6.65 kB +4.82% 1.72 kB 1.81 kB
oss-stable-semver/react-is/cjs/react-is.development.js +5.84% 6.27 kB 6.63 kB +4.66% 1.76 kB 1.84 kB
oss-stable/react-is/cjs/react-is.development.js +5.84% 6.27 kB 6.63 kB +4.66% 1.76 kB 1.84 kB
oss-experimental/react-is/cjs/react-is.development.js +5.82% 6.29 kB 6.66 kB +4.71% 1.76 kB 1.85 kB
facebook-react-native/react-is/cjs/ReactIs-dev.js +5.81% 6.87 kB 7.26 kB +4.69% 1.75 kB 1.83 kB
oss-stable-semver/react-is/umd/react-is.development.js +5.72% 6.82 kB 7.21 kB +4.53% 1.85 kB 1.94 kB
oss-stable/react-is/umd/react-is.development.js +5.72% 6.82 kB 7.21 kB +4.53% 1.85 kB 1.94 kB
oss-experimental/react-is/umd/react-is.development.js +5.70% 6.84 kB 7.23 kB +4.52% 1.86 kB 1.94 kB
facebook-react-native/react-is/cjs/ReactIs-prod.js +2.77% 4.52 kB 4.64 kB +1.24% 1.13 kB 1.14 kB
facebook-react-native/react-is/cjs/ReactIs-profiling.js +2.77% 4.52 kB 4.64 kB +1.24% 1.13 kB 1.14 kB
oss-stable-semver/react-is/cjs/react-is.production.min.js +2.17% 2.16 kB 2.21 kB +1.44% 0.76 kB 0.77 kB
oss-stable/react-is/cjs/react-is.production.min.js +2.17% 2.16 kB 2.21 kB +1.44% 0.76 kB 0.77 kB
oss-experimental/react-is/cjs/react-is.production.min.js +2.14% 2.20 kB 2.24 kB +1.56% 0.77 kB 0.78 kB
oss-experimental/react-is/umd/react-is.production.min.js +2.12% 2.26 kB 2.31 kB +1.17% 0.85 kB 0.86 kB
oss-stable-semver/react-is/umd/react-is.production.min.js +2.11% 2.23 kB 2.28 kB +1.18% 0.84 kB 0.85 kB
oss-stable/react-is/umd/react-is.production.min.js +2.11% 2.23 kB 2.28 kB +1.18% 0.84 kB 0.85 kB
test_utils/ReactAllWarnings.js Deleted 67.02 kB 0.00 kB Deleted 16.42 kB 0.00 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
facebook-www/ReactIs-dev.modern.js +13.56% 7.30 kB 8.29 kB +8.20% 1.82 kB 1.97 kB
facebook-www/ReactIs-dev.classic.js +13.56% 7.30 kB 8.29 kB +8.36% 1.82 kB 1.97 kB
facebook-www/ReactIs-prod.classic.js +13.36% 5.14 kB 5.83 kB +7.67% 1.26 kB 1.36 kB
facebook-www/ReactIs-prod.modern.js +13.36% 5.14 kB 5.83 kB +7.67% 1.26 kB 1.36 kB
oss-stable-semver/react-is/cjs/react-is.production.js +5.92% 6.25 kB 6.62 kB +4.89% 1.72 kB 1.80 kB
oss-stable/react-is/cjs/react-is.production.js +5.92% 6.25 kB 6.62 kB +4.89% 1.72 kB 1.80 kB
oss-experimental/react-is/cjs/react-is.production.js +5.90% 6.28 kB 6.65 kB +4.82% 1.72 kB 1.81 kB
oss-stable-semver/react-is/cjs/react-is.development.js +5.84% 6.27 kB 6.63 kB +4.66% 1.76 kB 1.84 kB
oss-stable/react-is/cjs/react-is.development.js +5.84% 6.27 kB 6.63 kB +4.66% 1.76 kB 1.84 kB
oss-experimental/react-is/cjs/react-is.development.js +5.82% 6.29 kB 6.66 kB +4.71% 1.76 kB 1.85 kB
facebook-react-native/react-is/cjs/ReactIs-dev.js +5.81% 6.87 kB 7.26 kB +4.69% 1.75 kB 1.83 kB
oss-stable-semver/react-is/umd/react-is.development.js +5.72% 6.82 kB 7.21 kB +4.53% 1.85 kB 1.94 kB
oss-stable/react-is/umd/react-is.development.js +5.72% 6.82 kB 7.21 kB +4.53% 1.85 kB 1.94 kB
oss-experimental/react-is/umd/react-is.development.js +5.70% 6.84 kB 7.23 kB +4.52% 1.86 kB 1.94 kB
facebook-react-native/react-is/cjs/ReactIs-prod.js +2.77% 4.52 kB 4.64 kB +1.24% 1.13 kB 1.14 kB
facebook-react-native/react-is/cjs/ReactIs-profiling.js +2.77% 4.52 kB 4.64 kB +1.24% 1.13 kB 1.14 kB
oss-stable-semver/react-is/cjs/react-is.production.min.js +2.17% 2.16 kB 2.21 kB +1.44% 0.76 kB 0.77 kB
oss-stable/react-is/cjs/react-is.production.min.js +2.17% 2.16 kB 2.21 kB +1.44% 0.76 kB 0.77 kB
oss-experimental/react-is/cjs/react-is.production.min.js +2.14% 2.20 kB 2.24 kB +1.56% 0.77 kB 0.78 kB
oss-experimental/react-is/umd/react-is.production.min.js +2.12% 2.26 kB 2.31 kB +1.17% 0.85 kB 0.86 kB
oss-stable-semver/react-is/umd/react-is.production.min.js +2.11% 2.23 kB 2.28 kB +1.18% 0.84 kB 0.85 kB
oss-stable/react-is/umd/react-is.production.min.js +2.11% 2.23 kB 2.28 kB +1.18% 0.84 kB 0.85 kB
facebook-www/React-prod.modern.js +1.87% 18.83 kB 19.18 kB +1.14% 4.81 kB 4.87 kB
facebook-www/React-prod.classic.js +1.85% 19.12 kB 19.48 kB +1.16% 4.90 kB 4.95 kB
facebook-www/React-profiling.modern.js +1.83% 19.26 kB 19.62 kB +1.14% 4.89 kB 4.95 kB
facebook-www/React-profiling.classic.js +1.80% 19.56 kB 19.91 kB +1.10% 4.98 kB 5.04 kB
facebook-www/JSXDEVRuntime-dev.modern.js +1.47% 53.39 kB 54.17 kB +0.81% 13.89 kB 14.00 kB
facebook-www/JSXDEVRuntime-dev.classic.js +1.47% 53.39 kB 54.17 kB +0.81% 13.88 kB 14.00 kB
oss-experimental/react-reconciler/cjs/react-reconciler-reflection.development.js +1.43% 18.55 kB 18.81 kB +1.01% 5.35 kB 5.41 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler-reflection.development.js +1.43% 18.55 kB 18.81 kB +1.01% 5.35 kB 5.41 kB
oss-stable/react-reconciler/cjs/react-reconciler-reflection.development.js +1.43% 18.55 kB 18.81 kB +1.01% 5.35 kB 5.41 kB
facebook-react-native/react/cjs/JSXDEVRuntime-dev.js +0.76% 40.12 kB 40.43 kB +0.55% 10.54 kB 10.60 kB
facebook-react-native/react/cjs/JSXRuntime-dev.js +0.75% 40.79 kB 41.09 kB +0.64% 10.72 kB 10.79 kB
facebook-www/ReactServer-dev.modern.js +0.72% 108.86 kB 109.64 kB +0.45% 26.40 kB 26.52 kB
oss-experimental/react/cjs/react-jsx-dev-runtime.development.js +0.63% 45.90 kB 46.19 kB +0.48% 13.40 kB 13.46 kB
oss-stable-semver/react/cjs/react-jsx-dev-runtime.development.js +0.63% 45.93 kB 46.22 kB +0.48% 13.40 kB 13.47 kB
oss-stable/react/cjs/react-jsx-dev-runtime.development.js +0.63% 45.93 kB 46.22 kB +0.48% 13.40 kB 13.47 kB
oss-experimental/react/cjs/react-jsx-runtime.development.js +0.62% 46.50 kB 46.79 kB +0.47% 13.57 kB 13.63 kB
oss-stable-semver/react/cjs/react-jsx-runtime.development.js +0.62% 46.52 kB 46.81 kB +0.47% 13.58 kB 13.64 kB
oss-stable/react/cjs/react-jsx-runtime.development.js +0.62% 46.52 kB 46.81 kB +0.47% 13.58 kB 13.64 kB
oss-experimental/react/cjs/react-jsx-runtime.react-server.development.js +0.62% 46.58 kB 46.87 kB +0.46% 13.61 kB 13.67 kB
oss-stable-semver/react/cjs/react-jsx-runtime.react-server.development.js +0.62% 46.61 kB 46.90 kB +0.47% 13.61 kB 13.68 kB
oss-stable/react/cjs/react-jsx-runtime.react-server.development.js +0.62% 46.61 kB 46.90 kB +0.47% 13.61 kB 13.68 kB
facebook-www/ReactART-prod.classic.js +0.41% 363.53 kB 365.03 kB +0.32% 61.70 kB 61.89 kB
facebook-www/ReactDOMServer-prod.modern.js +0.40% 202.71 kB 203.53 kB +0.52% 36.74 kB 36.94 kB
facebook-www/ReactDOMServer-prod.classic.js +0.40% 203.88 kB 204.69 kB +0.50% 37.03 kB 37.22 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js +0.38% 206.61 kB 207.40 kB +0.37% 38.14 kB 38.29 kB
oss-stable-semver/react/cjs/react.react-server.development.js +0.37% 78.08 kB 78.37 kB +0.31% 21.52 kB 21.59 kB
oss-stable/react/cjs/react.react-server.development.js +0.37% 78.10 kB 78.39 kB +0.32% 21.55 kB 21.62 kB
oss-experimental/react-debug-tools/cjs/react-debug-tools.development.js +0.37% 25.26 kB 25.35 kB +0.33% 6.76 kB 6.78 kB
oss-stable-semver/react-debug-tools/cjs/react-debug-tools.development.js +0.37% 25.26 kB 25.35 kB +0.33% 6.76 kB 6.78 kB
oss-stable/react-debug-tools/cjs/react-debug-tools.development.js +0.37% 25.26 kB 25.35 kB +0.33% 6.76 kB 6.78 kB
oss-experimental/react-debug-tools/cjs/react-debug-tools.production.min.js +0.35% 7.83 kB 7.85 kB +0.32% 2.82 kB 2.83 kB
oss-stable-semver/react-debug-tools/cjs/react-debug-tools.production.min.js +0.35% 7.83 kB 7.85 kB +0.32% 2.82 kB 2.83 kB
oss-stable/react-debug-tools/cjs/react-debug-tools.production.min.js +0.35% 7.83 kB 7.85 kB +0.32% 2.82 kB 2.83 kB
oss-experimental/react/cjs/react.react-server.development.js +0.34% 84.53 kB 84.82 kB +0.30% 23.41 kB 23.48 kB
facebook-www/ReactART-prod.modern.js +0.29% 352.57 kB 353.58 kB +0.27% 59.71 kB 59.88 kB
facebook-www/ReactDOM-prod.classic.js +0.25% 593.39 kB 594.89 kB +0.22% 104.69 kB 104.92 kB
oss-stable-semver/react-server/cjs/react-server.production.js +0.25% 155.57 kB 155.95 kB +0.26% 36.61 kB 36.71 kB
oss-stable/react-server/cjs/react-server.production.js +0.25% 155.57 kB 155.95 kB +0.26% 36.61 kB 36.71 kB
facebook-www/ReactDOMTesting-prod.classic.js +0.25% 608.17 kB 609.67 kB +0.20% 108.38 kB 108.59 kB
facebook-www/ReactDOM-profiling.classic.js +0.24% 623.82 kB 625.33 kB +0.21% 109.23 kB 109.46 kB
oss-experimental/react-server/cjs/react-server.production.js +0.23% 167.06 kB 167.45 kB +0.25% 38.54 kB 38.64 kB
facebook-www/ReactDOMTesting-prod.modern.js +0.22% 593.55 kB 594.86 kB +0.18% 105.89 kB 106.08 kB
oss-experimental/react-dom/umd/react-dom-server.browser.development.js = 464.86 kB 463.92 kB = 99.50 kB 99.22 kB
oss-experimental/react-dom/umd/react-dom-server-legacy.browser.development.js = 455.58 kB 454.64 kB = 98.33 kB 98.05 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.development.js = 444.87 kB 443.94 kB = 98.63 kB 98.35 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.development.js = 444.29 kB 443.36 kB = 98.49 kB 98.21 kB
oss-experimental/react-dom/cjs/react-dom-server.node.development.js = 442.72 kB 441.79 kB = 97.72 kB 97.43 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.development.js = 437.27 kB 436.34 kB = 97.85 kB 97.57 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.development.js = 435.41 kB 434.49 kB = 97.39 kB 97.10 kB
oss-stable/react-dom/umd/react-dom-server-legacy.browser.development.js = 440.90 kB 439.97 kB = 96.04 kB 95.75 kB
oss-stable-semver/react-dom/umd/react-dom-server-legacy.browser.development.js = 440.88 kB 439.94 kB = 96.02 kB 95.73 kB
oss-stable/react-dom/umd/react-dom-server.browser.development.js = 440.43 kB 439.49 kB = 96.22 kB 95.94 kB
oss-stable-semver/react-dom/umd/react-dom-server.browser.development.js = 440.41 kB 439.47 kB = 96.20 kB 95.91 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.development.js = 429.11 kB 428.18 kB = 95.43 kB 95.14 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.node.development.js = 423.18 kB 422.25 kB = 95.54 kB 95.24 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.node.development.js = 423.15 kB 422.23 kB = 95.52 kB 95.22 kB
oss-stable/react-dom/cjs/react-dom-server.edge.development.js = 421.45 kB 420.52 kB = 95.38 kB 95.09 kB
oss-stable-semver/react-dom/cjs/react-dom-server.edge.development.js = 421.42 kB 420.50 kB = 95.36 kB 95.07 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.browser.development.js = 421.32 kB 420.40 kB = 95.07 kB 94.78 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.browser.development.js = 421.30 kB 420.37 kB = 95.05 kB 94.75 kB
oss-stable/react-dom/cjs/react-dom-server.browser.development.js = 420.86 kB 419.94 kB = 95.25 kB 94.95 kB
oss-stable-semver/react-dom/cjs/react-dom-server.browser.development.js = 420.84 kB 419.91 kB = 95.22 kB 94.93 kB
oss-stable/react-dom/cjs/react-dom-server.node.development.js = 419.83 kB 418.90 kB = 94.19 kB 93.90 kB
oss-stable-semver/react-dom/cjs/react-dom-server.node.development.js = 419.80 kB 418.87 kB = 94.17 kB 93.87 kB
oss-stable/react-dom/cjs/react-dom-server.bun.development.js = 415.02 kB 414.09 kB = 93.11 kB 92.81 kB
oss-stable-semver/react-dom/cjs/react-dom-server.bun.development.js = 414.99 kB 414.07 kB = 93.09 kB 92.79 kB
oss-experimental/react-server/cjs/react-server.development.js = 210.56 kB 209.63 kB = 49.00 kB 48.72 kB
oss-stable-semver/react-server/cjs/react-server.development.js = 199.10 kB 198.17 kB = 47.09 kB 46.80 kB
oss-stable/react-server/cjs/react-server.development.js = 199.10 kB 198.17 kB = 47.09 kB 46.80 kB
facebook-www/React-dev.classic.js = 142.40 kB 141.16 kB = 34.57 kB 34.29 kB
facebook-www/React-dev.modern.js = 141.18 kB 139.94 kB = 34.33 kB 34.03 kB
oss-experimental/react/umd/react.development.js = 128.09 kB 126.47 kB = 32.73 kB 32.38 kB
oss-stable/react/umd/react.development.js = 125.44 kB 123.82 kB = 32.04 kB 31.69 kB
oss-stable-semver/react/umd/react.development.js = 125.42 kB 123.80 kB = 32.01 kB 31.67 kB
facebook-react-native/react/cjs/React-dev.js = 128.36 kB 126.45 kB = 31.00 kB 30.61 kB
oss-experimental/react/cjs/react.development.js = 104.91 kB 103.31 kB = 27.97 kB 27.64 kB
oss-stable/react/cjs/react.development.js = 102.37 kB 100.78 kB = 27.33 kB 26.99 kB
oss-stable-semver/react/cjs/react.development.js = 102.34 kB 100.75 kB = 27.30 kB 26.96 kB
test_utils/ReactAllWarnings.js Deleted 67.02 kB 0.00 kB Deleted 16.42 kB 0.00 kB

Generated by 🚫 dangerJS against c86765f

@@ -17,7 +17,7 @@ export const REACT_PORTAL_TYPE: symbol = Symbol.for('react.portal');
export const REACT_FRAGMENT_TYPE: symbol = Symbol.for('react.fragment');
export const REACT_STRICT_MODE_TYPE: symbol = Symbol.for('react.strict_mode');
export const REACT_PROFILER_TYPE: symbol = Symbol.for('react.profiler');
export const REACT_PROVIDER_TYPE: symbol = Symbol.for('react.provider');
export const REACT_CONSUMER_TYPE: symbol = Symbol.for('react.consumer');
export const REACT_CONTEXT_TYPE: symbol = Symbol.for('react.context');
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is the crux of the change.

Providers shifted from REACT_PROVIDER_TYPE (deleted) to REACT_CONTEXT_TYPE.

Consumers shifted from REACT_CONTEXT_TYPE to REACT_CONSUMER_TYPE (new).

This lets us avoid changing anything about use(Foo) or contextType = Foo and only change how we map a Fiber type to the underlying context.

@gaearon gaearon force-pushed the renderable-context branch 3 times, most recently from da25659 to 87624dc Compare February 5, 2024 22:44
Copy link
Collaborator

@gnoff gnoff left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's hold on merging til we confirm we can but excited for this change

case REACT_PROVIDER_TYPE:
const provider: ReactProviderType<any> = (type: any);
return getContextName(provider._context) + '.Provider';
return getContextName(context) + '.Provider';
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I imagine we'll be in a world soon where you never think about .Provider and just assume rendering a context provides values and "using" a context reads values. In this context does it make sense for the component name to carry forward this notion of .Provider? or should we switch it and call FooContext.Provider FooContext instead of calling FooContext FooContext.Provider?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm yea, I'd be happy to drop but figured it might invalidate snapshot tests or stuff like this. Maybe as a separate change later if this one settles?

if ((context: any)._context !== undefined) {
// Support inspection of pre-19+ providers.
context = (context: any)._context;
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note: this isn't feature-flagged because it needs to support both.

@gaearon gaearon force-pushed the renderable-context branch 4 times, most recently from 45d611b to 58c9942 Compare February 11, 2024 01:54
props: Object,
): void {
const context = type._context;
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved this to the callsite.

@@ -1703,31 +1704,6 @@ function renderContextConsumer(
context: ReactContext<any>,
props: Object,
): void {
// The logic below for Context differs depending on PROD or DEV mode. In
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Moved this to the callsite.

@gaearon gaearon force-pushed the renderable-context branch 2 times, most recently from 819e9db to 01168df Compare February 11, 2024 02:15
@gaearon
Copy link
Collaborator Author

gaearon commented Feb 11, 2024

Rebased and added a feature flag. I didn't keep the old warnings but I did preserve the codepaths and data structures to make it safer to land. The feature flag is hardcoded false everywhere except www where it's dynamic.

@rickhanlonii rickhanlonii merged commit 14fd963 into main Feb 13, 2024
36 checks passed
@rickhanlonii rickhanlonii deleted the renderable-context branch February 13, 2024 15:04
github-actions bot pushed a commit that referenced this pull request Feb 13, 2024
Previously, `<Context>` was equivalent to `<Context.Consumer>`. However,
since the introduction of Hooks, the `<Context.Consumer>` API is rarely
used. The goal here is to make the common case cleaner:

```js
const ThemeContext = createContext('light')

function App() {
  return (
    <ThemeContext value="dark">
      ...
    </ThemeContext>
  )
}

function Button() {
  const theme = use(ThemeContext)
  // ...
}
```

This is technically a breaking change, but we've been warning about
rendering `<Context>` directly for several years by now, so it's
unlikely much code in the wild depends on the old behavior. [Proof that
it warns today (check
console).](https://codesandbox.io/p/sandbox/peaceful-nobel-pdxtfl)

---

**The relevant commit is 5696782.** It
switches `createContext` implementation so that `Context.Provider ===
Context`.

The main assumption that changed is that a Provider's fiber type is now
the context itself (rather than an intermediate object). Whereas a
Consumer's fiber type is now always an intermediate object (rather than
it being sometimes the context itself and sometimes an intermediate
object).

My methodology was to start with the relevant symbols, work tags, and
types, and work my way backwards to all usages.

This might break tooling that depends on inspecting React's internal
fields. I've added DevTools support in the second commit. This didn't
need explicit versioning—the structure tells us enough.

DiffTrain build for [14fd963](14fd963)
hoxyq added a commit that referenced this pull request Feb 22, 2024
Full list of changes (not a public CHANGELOG):

* feature[REMOVED][devtools]: turn off / hide location based component
filters ([hoxyq](https://github.com/hoxyq) in
[#28417](#28417))
* Add useSyncExternalStore and useTransition to getPrimitiveStackCache
([jamesbvaughan](https://github.com/jamesbvaughan) in
[#28399](#28399))
* chore[devtools]: use react-window from npm and bump
react-virtualized-auto-sizer to ^1.0.23
([hoxyq](https://github.com/hoxyq) in
[#28408](#28408))
* Pass ref as normal prop ([acdlite](https://github.com/acdlite) in
[#28348](#28348))
* Combine createElement and JSX modules
([acdlite](https://github.com/acdlite) in
[#28320](#28320))
* [Debug Tools] Always use includeHooksSource option
([sebmarkbage](https://github.com/sebmarkbage) in
[#28309](#28309))
* Revert "[Tests] Reset modules by default"
([acdlite](https://github.com/acdlite) in
[#28318](#28318))
* Switch <Context> to mean <Context.Provider>
([gaearon](https://github.com/gaearon) in
[#28226](#28226))
* [Debug Tools] Introspect Promises in use()
([sebmarkbage](https://github.com/sebmarkbage) in
[#28297](#28297))
* fix[devtools/useModalDismissSignal]: use getRootNode for shadow root
case support ([hoxyq](https://github.com/hoxyq) in
[#28145](#28145))
* fix: define IS_ACT_ENVIRONMENT global for tests with concurrent mode
and synchronous act ([hoxyq](https://github.com/hoxyq) in
[#28296](#28296))
* chore: gate legacy apis for react-devtools-shell
([hoxyq](https://github.com/hoxyq) in
[#28273](#28273))
* DevTools: Add support for use(Context)
([eps1lon](https://github.com/eps1lon) in
[#28233](#28233))
* Remove __self and __source location from elements
([sebmarkbage](https://github.com/sebmarkbage) in
[#28265](#28265))
* chore: use versioned render in inspectedElement test
([hoxyq](https://github.com/hoxyq) in
[#28246](#28246))
* chore: use versioned render in TimelineProfiler test and gate some for
legacy rendering ([hoxyq](https://github.com/hoxyq) in
[#28218](#28218))
* [Tests] Reset modules by default
([rickhanlonii](https://github.com/rickhanlonii) in
[#28254](#28254))
* chore: use versioned render in preprocessData test and gate some for …
([hoxyq](https://github.com/hoxyq) in
[#28219](#28219))
* chore: use versioned render in storeStressSync test and gate them for
legacy rendering ([hoxyq](https://github.com/hoxyq) in
[#28216](#28216))
* Patch devtools before running useMemo function in strict mode
([gsathya](https://github.com/gsathya) in
[#28249](#28249))
* chore: use versioned render in storeComponentFilters test
([hoxyq](https://github.com/hoxyq) in
[#28241](#28241))
* chore: use versioned render in profilerContext test
([hoxyq](https://github.com/hoxyq) in
[#28243](#28243))
* chore: use versioned render in profilingCommitTreeBuilder test and
gate some for legacy rendering ([hoxyq](https://github.com/hoxyq) in
[#28236](#28236))
* chore: use versioned render in profilingHostRoot test and gate some
for legacy rendering ([hoxyq](https://github.com/hoxyq) in
[#28237](#28237))
* chore: use versioned render in profilingCache test
([hoxyq](https://github.com/hoxyq) in
[#28242](#28242))
* chore: use versioned render in ownersListContext test
([hoxyq](https://github.com/hoxyq) in
[#28240](#28240))
* chore: use versioned render in editing test
([hoxyq](https://github.com/hoxyq) in
[#28239](#28239))
* chore: use versioned render in treeContext test
([hoxyq](https://github.com/hoxyq) in
[#28245](#28245))
* chore: use versioned render in store test
([hoxyq](https://github.com/hoxyq) in
[#28244](#28244))
* chore: use versioned render in profilerStore test
([hoxyq](https://github.com/hoxyq) in
[#28238](#28238))
* chore: use versioned render in profilingCharts test
([hoxyq](https://github.com/hoxyq) in
[#28235](#28235))
* chore: use versioned render in profilerChangeDescriptions test
([hoxyq](https://github.com/hoxyq) in
[#28221](#28221))
* chore: use versioned render in storeOwners test
([hoxyq](https://github.com/hoxyq) in
[#28215](#28215))
* chore: use versioned render in componentStacks test
([hoxyq](https://github.com/hoxyq) in
[#28214](#28214))
* chore: use versioned render in console test
([hoxyq](https://github.com/hoxyq) in
[#28213](#28213))
* chore: use versioned render in useEditableValue test
([hoxyq](https://github.com/hoxyq) in
[#28212](#28212))
* chore: use versioned render in FastRefreshDevToolsIntegration test
([hoxyq](https://github.com/hoxyq) in
[#28211](#28211))
* chore: add versioned render implementation for DevTools tests
([hoxyq](https://github.com/hoxyq) in
[#28210](#28210))
* chore: add single versioned implementation of act for DevTools tests
([hoxyq](https://github.com/hoxyq) in
[#28186](#28186))
* DevTools: Add support for useFormState
([eps1lon](https://github.com/eps1lon) in
[#28232](#28232))
* DevTools: Add support for useOptimistic Hook
([eps1lon](https://github.com/eps1lon) in
[#27982](#27982))
* Add stable React.act export ([acdlite](https://github.com/acdlite) in
[#28160](#28160))
* [flow] upgrade to 0.225.1 ([kassens](https://github.com/kassens) in
[#27871](#27871))
* fix[devtools/e2e]: add fallback for act in integration tests
([hoxyq](https://github.com/hoxyq) in
[#27842](#27842))
* Add stable concurrent option to react-test-renderer
([jackpope](https://github.com/jackpope) in
[#27804](#27804))
* Update act references in tests ([gnoff](https://github.com/gnoff) in
[#27805](#27805))
* Flow: make more objects exact ([kassens](https://github.com/kassens)
in [#27790](#27790))
huozhi added a commit to vercel/next.js that referenced this pull request Feb 23, 2024
### React upstream changes

- facebook/react#28333
- facebook/react#28334
- facebook/react#28378
- facebook/react#28377
- facebook/react#28376
- facebook/react#28338
- facebook/react#28331
- facebook/react#28336
- facebook/react#28320
- facebook/react#28317
- facebook/react#28375
- facebook/react#28367
- facebook/react#28380
- facebook/react#28368
- facebook/react#28343
- facebook/react#28355
- facebook/react#28374
- facebook/react#28362
- facebook/react#28344
- facebook/react#28339
- facebook/react#28353
- facebook/react#28346
- facebook/react#25790
- facebook/react#28352
- facebook/react#28326
- facebook/react#27688
- facebook/react#28329
- facebook/react#28332
- facebook/react#28340
- facebook/react#28327
- facebook/react#28325
- facebook/react#28324
- facebook/react#28309
- facebook/react#28310
- facebook/react#28307
- facebook/react#28306
- facebook/react#28315
- facebook/react#28318
- facebook/react#28226
- facebook/react#28308
- facebook/react#27563
- facebook/react#28297
- facebook/react#28286
- facebook/react#28284
- facebook/react#28275
- facebook/react#28145
- facebook/react#28301
- facebook/react#28224
- facebook/react#28152
- facebook/react#28296
- facebook/react#28294
- facebook/react#28279
- facebook/react#28273
- facebook/react#28269
- facebook/react#28376
- facebook/react#28338
- facebook/react#28331
- facebook/react#28336
- facebook/react#28320
- facebook/react#28317
- facebook/react#28375
- facebook/react#28367
- facebook/react#28380
- facebook/react#28368
- facebook/react#28343
- facebook/react#28355
- facebook/react#28374
- facebook/react#28362
- facebook/react#28344
- facebook/react#28339
- facebook/react#28353
- facebook/react#28346
- facebook/react#25790
- facebook/react#28352
- facebook/react#28326
- facebook/react#27688
- facebook/react#28329
- facebook/react#28332
- facebook/react#28340
- facebook/react#28327
- facebook/react#28325
- facebook/react#28324
- facebook/react#28309
- facebook/react#28310
- facebook/react#28307
- facebook/react#28306
- facebook/react#28315
- facebook/react#28318
- facebook/react#28226
- facebook/react#28308
- facebook/react#27563
- facebook/react#28297
- facebook/react#28286
- facebook/react#28284
- facebook/react#28275
- facebook/react#28145
- facebook/react#28301
- facebook/react#28224
- facebook/react#28152
- facebook/react#28296
- facebook/react#28294
- facebook/react#28279
- facebook/react#28273
- facebook/react#28269

Closes NEXT-2542


Disable ppr test for strict mode for now, @acdlite will check it and
we'll sync again
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
Previously, `<Context>` was equivalent to `<Context.Consumer>`. However,
since the introduction of Hooks, the `<Context.Consumer>` API is rarely
used. The goal here is to make the common case cleaner:

```js
const ThemeContext = createContext('light')

function App() {
  return (
    <ThemeContext value="dark">
      ...
    </ThemeContext>
  )
}

function Button() {
  const theme = use(ThemeContext)
  // ...
}
```

This is technically a breaking change, but we've been warning about
rendering `<Context>` directly for several years by now, so it's
unlikely much code in the wild depends on the old behavior. [Proof that
it warns today (check
console).](https://codesandbox.io/p/sandbox/peaceful-nobel-pdxtfl)

---

**The relevant commit is 5696782.** It
switches `createContext` implementation so that `Context.Provider ===
Context`.

The main assumption that changed is that a Provider's fiber type is now
the context itself (rather than an intermediate object). Whereas a
Consumer's fiber type is now always an intermediate object (rather than
it being sometimes the context itself and sometimes an intermediate
object).

My methodology was to start with the relevant symbols, work tags, and
types, and work my way backwards to all usages.

This might break tooling that depends on inspecting React's internal
fields. I've added DevTools support in the second commit. This didn't
need explicit versioning—the structure tells us enough.
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
Full list of changes (not a public CHANGELOG):

* feature[REMOVED][devtools]: turn off / hide location based component
filters ([hoxyq](https://github.com/hoxyq) in
[facebook#28417](facebook#28417))
* Add useSyncExternalStore and useTransition to getPrimitiveStackCache
([jamesbvaughan](https://github.com/jamesbvaughan) in
[facebook#28399](facebook#28399))
* chore[devtools]: use react-window from npm and bump
react-virtualized-auto-sizer to ^1.0.23
([hoxyq](https://github.com/hoxyq) in
[facebook#28408](facebook#28408))
* Pass ref as normal prop ([acdlite](https://github.com/acdlite) in
[facebook#28348](facebook#28348))
* Combine createElement and JSX modules
([acdlite](https://github.com/acdlite) in
[facebook#28320](facebook#28320))
* [Debug Tools] Always use includeHooksSource option
([sebmarkbage](https://github.com/sebmarkbage) in
[facebook#28309](facebook#28309))
* Revert "[Tests] Reset modules by default"
([acdlite](https://github.com/acdlite) in
[facebook#28318](facebook#28318))
* Switch <Context> to mean <Context.Provider>
([gaearon](https://github.com/gaearon) in
[facebook#28226](facebook#28226))
* [Debug Tools] Introspect Promises in use()
([sebmarkbage](https://github.com/sebmarkbage) in
[facebook#28297](facebook#28297))
* fix[devtools/useModalDismissSignal]: use getRootNode for shadow root
case support ([hoxyq](https://github.com/hoxyq) in
[facebook#28145](facebook#28145))
* fix: define IS_ACT_ENVIRONMENT global for tests with concurrent mode
and synchronous act ([hoxyq](https://github.com/hoxyq) in
[facebook#28296](facebook#28296))
* chore: gate legacy apis for react-devtools-shell
([hoxyq](https://github.com/hoxyq) in
[facebook#28273](facebook#28273))
* DevTools: Add support for use(Context)
([eps1lon](https://github.com/eps1lon) in
[facebook#28233](facebook#28233))
* Remove __self and __source location from elements
([sebmarkbage](https://github.com/sebmarkbage) in
[facebook#28265](facebook#28265))
* chore: use versioned render in inspectedElement test
([hoxyq](https://github.com/hoxyq) in
[facebook#28246](facebook#28246))
* chore: use versioned render in TimelineProfiler test and gate some for
legacy rendering ([hoxyq](https://github.com/hoxyq) in
[facebook#28218](facebook#28218))
* [Tests] Reset modules by default
([rickhanlonii](https://github.com/rickhanlonii) in
[facebook#28254](facebook#28254))
* chore: use versioned render in preprocessData test and gate some for …
([hoxyq](https://github.com/hoxyq) in
[facebook#28219](facebook#28219))
* chore: use versioned render in storeStressSync test and gate them for
legacy rendering ([hoxyq](https://github.com/hoxyq) in
[facebook#28216](facebook#28216))
* Patch devtools before running useMemo function in strict mode
([gsathya](https://github.com/gsathya) in
[facebook#28249](facebook#28249))
* chore: use versioned render in storeComponentFilters test
([hoxyq](https://github.com/hoxyq) in
[facebook#28241](facebook#28241))
* chore: use versioned render in profilerContext test
([hoxyq](https://github.com/hoxyq) in
[facebook#28243](facebook#28243))
* chore: use versioned render in profilingCommitTreeBuilder test and
gate some for legacy rendering ([hoxyq](https://github.com/hoxyq) in
[facebook#28236](facebook#28236))
* chore: use versioned render in profilingHostRoot test and gate some
for legacy rendering ([hoxyq](https://github.com/hoxyq) in
[facebook#28237](facebook#28237))
* chore: use versioned render in profilingCache test
([hoxyq](https://github.com/hoxyq) in
[facebook#28242](facebook#28242))
* chore: use versioned render in ownersListContext test
([hoxyq](https://github.com/hoxyq) in
[facebook#28240](facebook#28240))
* chore: use versioned render in editing test
([hoxyq](https://github.com/hoxyq) in
[facebook#28239](facebook#28239))
* chore: use versioned render in treeContext test
([hoxyq](https://github.com/hoxyq) in
[facebook#28245](facebook#28245))
* chore: use versioned render in store test
([hoxyq](https://github.com/hoxyq) in
[facebook#28244](facebook#28244))
* chore: use versioned render in profilerStore test
([hoxyq](https://github.com/hoxyq) in
[facebook#28238](facebook#28238))
* chore: use versioned render in profilingCharts test
([hoxyq](https://github.com/hoxyq) in
[facebook#28235](facebook#28235))
* chore: use versioned render in profilerChangeDescriptions test
([hoxyq](https://github.com/hoxyq) in
[facebook#28221](facebook#28221))
* chore: use versioned render in storeOwners test
([hoxyq](https://github.com/hoxyq) in
[facebook#28215](facebook#28215))
* chore: use versioned render in componentStacks test
([hoxyq](https://github.com/hoxyq) in
[facebook#28214](facebook#28214))
* chore: use versioned render in console test
([hoxyq](https://github.com/hoxyq) in
[facebook#28213](facebook#28213))
* chore: use versioned render in useEditableValue test
([hoxyq](https://github.com/hoxyq) in
[facebook#28212](facebook#28212))
* chore: use versioned render in FastRefreshDevToolsIntegration test
([hoxyq](https://github.com/hoxyq) in
[facebook#28211](facebook#28211))
* chore: add versioned render implementation for DevTools tests
([hoxyq](https://github.com/hoxyq) in
[facebook#28210](facebook#28210))
* chore: add single versioned implementation of act for DevTools tests
([hoxyq](https://github.com/hoxyq) in
[facebook#28186](facebook#28186))
* DevTools: Add support for useFormState
([eps1lon](https://github.com/eps1lon) in
[facebook#28232](facebook#28232))
* DevTools: Add support for useOptimistic Hook
([eps1lon](https://github.com/eps1lon) in
[facebook#27982](facebook#27982))
* Add stable React.act export ([acdlite](https://github.com/acdlite) in
[facebook#28160](facebook#28160))
* [flow] upgrade to 0.225.1 ([kassens](https://github.com/kassens) in
[facebook#27871](facebook#27871))
* fix[devtools/e2e]: add fallback for act in integration tests
([hoxyq](https://github.com/hoxyq) in
[facebook#27842](facebook#27842))
* Add stable concurrent option to react-test-renderer
([jackpope](https://github.com/jackpope) in
[facebook#27804](facebook#27804))
* Update act references in tests ([gnoff](https://github.com/gnoff) in
[facebook#27805](facebook#27805))
* Flow: make more objects exact ([kassens](https://github.com/kassens)
in [facebook#27790](facebook#27790))
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
Previously, `<Context>` was equivalent to `<Context.Consumer>`. However,
since the introduction of Hooks, the `<Context.Consumer>` API is rarely
used. The goal here is to make the common case cleaner:

```js
const ThemeContext = createContext('light')

function App() {
  return (
    <ThemeContext value="dark">
      ...
    </ThemeContext>
  )
}

function Button() {
  const theme = use(ThemeContext)
  // ...
}
```

This is technically a breaking change, but we've been warning about
rendering `<Context>` directly for several years by now, so it's
unlikely much code in the wild depends on the old behavior. [Proof that
it warns today (check
console).](https://codesandbox.io/p/sandbox/peaceful-nobel-pdxtfl)

---

**The relevant commit is 5696782.** It
switches `createContext` implementation so that `Context.Provider ===
Context`.

The main assumption that changed is that a Provider's fiber type is now
the context itself (rather than an intermediate object). Whereas a
Consumer's fiber type is now always an intermediate object (rather than
it being sometimes the context itself and sometimes an intermediate
object).

My methodology was to start with the relevant symbols, work tags, and
types, and work my way backwards to all usages.

This might break tooling that depends on inspecting React's internal
fields. I've added DevTools support in the second commit. This didn't
need explicit versioning—the structure tells us enough.

DiffTrain build for commit 14fd963.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants