Skip to content

[RFC] useServerContextsForRefetch #23382

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

Closed
wants to merge 9 commits into from

Conversation

salazarm
Copy link
Contributor

@salazarm salazarm commented Feb 28, 2022

Summary

Summary
This PR is stacked on top of #23244 (curse you github for not supporting stacked PRs!) If you want to see just this PR check out this commit: 5aa5554

This PR adds a client side hook to be used in conjunction with Flight/Fizz for using ServerContext.

useServerContextsForRefetch
This hook is meant to be used with Flight (RSC).

It returns the parent server contexts of the react component it is called for.
It returns the original server values, that is if the server context is overridden on the client that value will be ignored.
It returns the server contexts as a reverse linked list in the format:

type ServerContextNodeType = {
  parent: null | ServerContextNodeType,
  name: string,
  value: any,
};

eg:
Server.js

function App() {
  <ServerContext.Provider value="Foo">
     <HybridComponent />
    <ServerContext.Provider value="Bar">
       <HybridComponent2 />
}

On the client if we wanted to re-render HybridComponent2 then we'd call the callback returned by useServerContextsForRefetch for HybridComponent2 and it would return [['ServerContext', 'Bar']]. Then on the server we can render using that context.

Note: useServerContextsForRefetch hook only makes sense for Hybrid components and not client components because trying to refetch a client only component with Flight would just result in Flight deferring to the client to render the component. However if you pass the result from Flight to Fizz to SSR the result then that could make sense for devices with really slow CPU however it usually isn't the right tradeoff since the components are already loaded on the client.

Why Refetch at all?

The main benefit to refetching a subtree in Flight rather than just re-rendering on the client can be seen when we consider request waterfalls. A request waterfall on the client includes latency from server <--> client multiple times. Where as a request waterfall on the server is a lot faster since the requests are all happening within your network.

How did you test this change?

jest

@facebook-github-bot facebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Feb 28, 2022
@sizebot
Copy link

sizebot commented Feb 28, 2022

Comparing: be229c5...6e9f716

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 = 131.76 kB 131.76 kB = 42.31 kB 42.31 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js = 137.03 kB 137.03 kB = 43.90 kB 43.90 kB
facebook-www/ReactDOM-prod.classic.js = 440.91 kB 440.91 kB = 80.63 kB 80.63 kB
facebook-www/ReactDOM-prod.modern.js = 426.21 kB 426.21 kB = 78.44 kB 78.44 kB
facebook-www/ReactDOMForked-prod.classic.js = 441.61 kB 441.61 kB = 80.85 kB 80.85 kB
facebook-www/ReactFlightDOMRelayClientHooks-dev.classic.js +∞% 0.00 kB 2.85 kB +∞% 0.00 kB 1.04 kB
facebook-www/ReactFlightDOMRelayClientHooks-dev.modern.js +∞% 0.00 kB 2.85 kB +∞% 0.00 kB 1.04 kB
facebook-www/ReactFlightDOMRelayClientHooks-prod.classic.js +∞% 0.00 kB 0.54 kB +∞% 0.00 kB 0.34 kB
facebook-www/ReactFlightDOMRelayClientHooks-prod.modern.js +∞% 0.00 kB 0.54 kB +∞% 0.00 kB 0.34 kB
oss-experimental/react-client/cjs/react-client-flight-hooks.development.js +∞% 0.00 kB 1.99 kB +∞% 0.00 kB 0.87 kB
oss-experimental/react-client/cjs/react-client-flight-hooks.production.min.js +∞% 0.00 kB 0.49 kB +∞% 0.00 kB 0.33 kB
oss-experimental/react-client/flight-hooks.js +∞% 0.00 kB 0.23 kB +∞% 0.00 kB 0.16 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-flight-hooks.development.js +∞% 0.00 kB 0.58 kB +∞% 0.00 kB 0.38 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-flight-hooks.production.min.js +∞% 0.00 kB 0.45 kB +∞% 0.00 kB 0.31 kB
oss-experimental/react-noop-renderer/flight-hooks.js +∞% 0.00 kB 0.24 kB +∞% 0.00 kB 0.17 kB
oss-stable-semver/react-client/cjs/react-client-flight-hooks.development.js +∞% 0.00 kB 1.99 kB +∞% 0.00 kB 0.87 kB
oss-stable-semver/react-client/cjs/react-client-flight-hooks.production.min.js +∞% 0.00 kB 0.49 kB +∞% 0.00 kB 0.33 kB
oss-stable-semver/react-client/flight-hooks.js +∞% 0.00 kB 0.23 kB +∞% 0.00 kB 0.16 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-flight-hooks.development.js +∞% 0.00 kB 0.58 kB +∞% 0.00 kB 0.38 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-flight-hooks.production.min.js +∞% 0.00 kB 0.45 kB +∞% 0.00 kB 0.31 kB
oss-stable-semver/react-noop-renderer/flight-hooks.js +∞% 0.00 kB 0.24 kB +∞% 0.00 kB 0.17 kB
oss-stable/react-client/cjs/react-client-flight-hooks.development.js +∞% 0.00 kB 1.99 kB +∞% 0.00 kB 0.87 kB
oss-stable/react-client/cjs/react-client-flight-hooks.production.min.js +∞% 0.00 kB 0.49 kB +∞% 0.00 kB 0.33 kB
oss-stable/react-client/flight-hooks.js +∞% 0.00 kB 0.23 kB +∞% 0.00 kB 0.16 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-flight-hooks.development.js +∞% 0.00 kB 0.58 kB +∞% 0.00 kB 0.38 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-flight-hooks.production.min.js +∞% 0.00 kB 0.45 kB +∞% 0.00 kB 0.31 kB
oss-stable/react-noop-renderer/flight-hooks.js +∞% 0.00 kB 0.24 kB +∞% 0.00 kB 0.17 kB
facebook-www/ReactFlightDOMRelayClient-prod.classic.js +15.59% 6.34 kB 7.33 kB +14.81% 1.92 kB 2.21 kB
facebook-www/ReactFlightDOMRelayClient-prod.modern.js +15.59% 6.34 kB 7.33 kB +14.81% 1.92 kB 2.21 kB
facebook-relay/flight/ReactFlightNativeRelayClient-prod.js +15.59% 6.20 kB 7.17 kB +15.01% 1.87 kB 2.15 kB
oss-experimental/react-client/cjs/react-client-flight.production.min.js +11.04% 3.75 kB 4.16 kB +9.46% 1.71 kB 1.88 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.min.js +11.04% 3.75 kB 4.16 kB +9.46% 1.71 kB 1.88 kB
oss-stable/react-client/cjs/react-client-flight.production.min.js +11.04% 3.75 kB 4.16 kB +9.46% 1.71 kB 1.88 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack.production.min.js +9.96% 4.16 kB 4.57 kB +8.36% 1.85 kB 2.01 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack.production.min.js +9.96% 4.16 kB 4.57 kB +8.36% 1.85 kB 2.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack.production.min.js +9.96% 4.16 kB 4.57 kB +8.36% 1.85 kB 2.01 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack.production.min.js +9.43% 4.38 kB 4.79 kB +7.92% 1.96 kB 2.11 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack.production.min.js +9.43% 4.38 kB 4.79 kB +7.92% 1.96 kB 2.11 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack.production.min.js +9.43% 4.38 kB 4.79 kB +7.92% 1.96 kB 2.11 kB
facebook-relay/flight/ReactFlightNativeRelayClient-dev.js +8.75% 10.78 kB 11.72 kB +8.07% 3.21 kB 3.47 kB
facebook-www/ReactFlightDOMRelayClient-dev.modern.js +7.53% 12.83 kB 13.79 kB +6.98% 3.78 kB 4.05 kB
facebook-www/ReactFlightDOMRelayClient-dev.classic.js +7.53% 12.83 kB 13.79 kB +6.98% 3.78 kB 4.05 kB
oss-experimental/react-client/cjs/react-client-flight.development.js +6.65% 13.95 kB 14.87 kB +5.93% 4.10 kB 4.34 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js +6.65% 13.95 kB 14.87 kB +5.93% 4.10 kB 4.34 kB
oss-stable/react-client/cjs/react-client-flight.development.js +6.65% 13.95 kB 14.87 kB +5.93% 4.10 kB 4.34 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack.development.js +5.53% 16.76 kB 17.68 kB +4.83% 4.78 kB 5.01 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack.development.js +5.53% 16.76 kB 17.68 kB +4.83% 4.78 kB 5.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack.development.js +5.53% 16.76 kB 17.68 kB +4.83% 4.78 kB 5.01 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack.development.js +5.47% 17.98 kB 18.97 kB +4.81% 4.91 kB 5.14 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack.development.js +5.47% 17.98 kB 18.97 kB +4.81% 4.91 kB 5.14 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack.development.js +5.47% 17.98 kB 18.97 kB +4.81% 4.91 kB 5.14 kB
facebook-relay/flight/ReactFlightNativeRelayServer-prod.js +2.00% 21.65 kB 22.08 kB +1.68% 5.37 kB 5.46 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
facebook-www/ReactFlightDOMRelayClientHooks-dev.classic.js +∞% 0.00 kB 2.85 kB +∞% 0.00 kB 1.04 kB
facebook-www/ReactFlightDOMRelayClientHooks-dev.modern.js +∞% 0.00 kB 2.85 kB +∞% 0.00 kB 1.04 kB
facebook-www/ReactFlightDOMRelayClientHooks-prod.classic.js +∞% 0.00 kB 0.54 kB +∞% 0.00 kB 0.34 kB
facebook-www/ReactFlightDOMRelayClientHooks-prod.modern.js +∞% 0.00 kB 0.54 kB +∞% 0.00 kB 0.34 kB
oss-experimental/react-client/cjs/react-client-flight-hooks.development.js +∞% 0.00 kB 1.99 kB +∞% 0.00 kB 0.87 kB
oss-experimental/react-client/cjs/react-client-flight-hooks.production.min.js +∞% 0.00 kB 0.49 kB +∞% 0.00 kB 0.33 kB
oss-experimental/react-client/flight-hooks.js +∞% 0.00 kB 0.23 kB +∞% 0.00 kB 0.16 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-flight-hooks.development.js +∞% 0.00 kB 0.58 kB +∞% 0.00 kB 0.38 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-flight-hooks.production.min.js +∞% 0.00 kB 0.45 kB +∞% 0.00 kB 0.31 kB
oss-experimental/react-noop-renderer/flight-hooks.js +∞% 0.00 kB 0.24 kB +∞% 0.00 kB 0.17 kB
oss-stable-semver/react-client/cjs/react-client-flight-hooks.development.js +∞% 0.00 kB 1.99 kB +∞% 0.00 kB 0.87 kB
oss-stable-semver/react-client/cjs/react-client-flight-hooks.production.min.js +∞% 0.00 kB 0.49 kB +∞% 0.00 kB 0.33 kB
oss-stable-semver/react-client/flight-hooks.js +∞% 0.00 kB 0.23 kB +∞% 0.00 kB 0.16 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-flight-hooks.development.js +∞% 0.00 kB 0.58 kB +∞% 0.00 kB 0.38 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-flight-hooks.production.min.js +∞% 0.00 kB 0.45 kB +∞% 0.00 kB 0.31 kB
oss-stable-semver/react-noop-renderer/flight-hooks.js +∞% 0.00 kB 0.24 kB +∞% 0.00 kB 0.17 kB
oss-stable/react-client/cjs/react-client-flight-hooks.development.js +∞% 0.00 kB 1.99 kB +∞% 0.00 kB 0.87 kB
oss-stable/react-client/cjs/react-client-flight-hooks.production.min.js +∞% 0.00 kB 0.49 kB +∞% 0.00 kB 0.33 kB
oss-stable/react-client/flight-hooks.js +∞% 0.00 kB 0.23 kB +∞% 0.00 kB 0.16 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-flight-hooks.development.js +∞% 0.00 kB 0.58 kB +∞% 0.00 kB 0.38 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-flight-hooks.production.min.js +∞% 0.00 kB 0.45 kB +∞% 0.00 kB 0.31 kB
oss-stable/react-noop-renderer/flight-hooks.js +∞% 0.00 kB 0.24 kB +∞% 0.00 kB 0.17 kB
facebook-www/ReactFlightDOMRelayClient-prod.classic.js +15.59% 6.34 kB 7.33 kB +14.81% 1.92 kB 2.21 kB
facebook-www/ReactFlightDOMRelayClient-prod.modern.js +15.59% 6.34 kB 7.33 kB +14.81% 1.92 kB 2.21 kB
facebook-relay/flight/ReactFlightNativeRelayClient-prod.js +15.59% 6.20 kB 7.17 kB +15.01% 1.87 kB 2.15 kB
oss-experimental/react-client/cjs/react-client-flight.production.min.js +11.04% 3.75 kB 4.16 kB +9.46% 1.71 kB 1.88 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.min.js +11.04% 3.75 kB 4.16 kB +9.46% 1.71 kB 1.88 kB
oss-stable/react-client/cjs/react-client-flight.production.min.js +11.04% 3.75 kB 4.16 kB +9.46% 1.71 kB 1.88 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack.production.min.js +9.96% 4.16 kB 4.57 kB +8.36% 1.85 kB 2.01 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack.production.min.js +9.96% 4.16 kB 4.57 kB +8.36% 1.85 kB 2.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack.production.min.js +9.96% 4.16 kB 4.57 kB +8.36% 1.85 kB 2.01 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack.production.min.js +9.43% 4.38 kB 4.79 kB +7.92% 1.96 kB 2.11 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack.production.min.js +9.43% 4.38 kB 4.79 kB +7.92% 1.96 kB 2.11 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack.production.min.js +9.43% 4.38 kB 4.79 kB +7.92% 1.96 kB 2.11 kB
facebook-relay/flight/ReactFlightNativeRelayClient-dev.js +8.75% 10.78 kB 11.72 kB +8.07% 3.21 kB 3.47 kB
facebook-www/ReactFlightDOMRelayClient-dev.modern.js +7.53% 12.83 kB 13.79 kB +6.98% 3.78 kB 4.05 kB
facebook-www/ReactFlightDOMRelayClient-dev.classic.js +7.53% 12.83 kB 13.79 kB +6.98% 3.78 kB 4.05 kB
oss-experimental/react-client/cjs/react-client-flight.development.js +6.65% 13.95 kB 14.87 kB +5.93% 4.10 kB 4.34 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js +6.65% 13.95 kB 14.87 kB +5.93% 4.10 kB 4.34 kB
oss-stable/react-client/cjs/react-client-flight.development.js +6.65% 13.95 kB 14.87 kB +5.93% 4.10 kB 4.34 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack.development.js +5.53% 16.76 kB 17.68 kB +4.83% 4.78 kB 5.01 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack.development.js +5.53% 16.76 kB 17.68 kB +4.83% 4.78 kB 5.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack.development.js +5.53% 16.76 kB 17.68 kB +4.83% 4.78 kB 5.01 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack.development.js +5.47% 17.98 kB 18.97 kB +4.81% 4.91 kB 5.14 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack.development.js +5.47% 17.98 kB 18.97 kB +4.81% 4.91 kB 5.14 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack.development.js +5.47% 17.98 kB 18.97 kB +4.81% 4.91 kB 5.14 kB
facebook-relay/flight/ReactFlightNativeRelayServer-prod.js +2.00% 21.65 kB 22.08 kB +1.68% 5.37 kB 5.46 kB
facebook-www/ReactFlightDOMRelayServer-prod.classic.js +1.58% 27.46 kB 27.89 kB +1.30% 7.23 kB 7.33 kB
facebook-www/ReactFlightDOMRelayServer-prod.modern.js +1.57% 27.53 kB 27.97 kB +1.25% 7.27 kB 7.36 kB
oss-experimental/react-server/cjs/react-server-flight.development.js +1.52% 39.18 kB 39.78 kB +1.63% 9.98 kB 10.14 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js +1.52% 39.18 kB 39.78 kB +1.63% 9.98 kB 10.14 kB
oss-stable/react-server/cjs/react-server-flight.development.js +1.52% 39.18 kB 39.78 kB +1.63% 9.98 kB 10.14 kB
facebook-relay/flight/ReactFlightNativeRelayServer-dev.js +1.49% 39.52 kB 40.11 kB +1.63% 10.10 kB 10.26 kB
oss-experimental/react-server/cjs/react-server-flight.production.min.js +1.12% 10.14 kB 10.25 kB +1.42% 3.81 kB 3.87 kB
oss-stable-semver/react-server/cjs/react-server-flight.production.min.js +1.12% 10.14 kB 10.25 kB +1.42% 3.81 kB 3.87 kB
oss-stable/react-server/cjs/react-server-flight.production.min.js +1.12% 10.14 kB 10.25 kB +1.42% 3.81 kB 3.87 kB
facebook-www/ReactFlightDOMRelayServer-dev.classic.js +1.09% 54.03 kB 54.62 kB +1.18% 13.76 kB 13.92 kB
facebook-www/ReactFlightDOMRelayServer-dev.modern.js +1.09% 54.09 kB 54.68 kB +1.19% 13.78 kB 13.94 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-writer.browser.development.server.js +0.95% 66.20 kB 66.83 kB +0.98% 16.56 kB 16.72 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-writer.browser.development.server.js +0.95% 66.20 kB 66.83 kB +0.98% 16.56 kB 16.72 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-writer.browser.development.server.js +0.94% 66.26 kB 66.89 kB +0.98% 16.58 kB 16.75 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.browser.development.server.js +0.94% 62.98 kB 63.57 kB +0.99% 16.34 kB 16.50 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.browser.development.server.js +0.94% 62.98 kB 63.57 kB +0.99% 16.34 kB 16.50 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.browser.development.server.js +0.94% 63.03 kB 63.63 kB +0.98% 16.36 kB 16.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.node.development.server.js +0.92% 64.66 kB 65.25 kB +0.97% 16.49 kB 16.65 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.node.development.server.js +0.92% 64.66 kB 65.25 kB +0.97% 16.49 kB 16.65 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.node.development.server.js +0.92% 64.71 kB 65.31 kB +0.97% 16.51 kB 16.67 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.browser.production.min.server.js +0.70% 16.36 kB 16.48 kB +0.81% 6.14 kB 6.19 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.browser.production.min.server.js +0.70% 16.36 kB 16.48 kB +0.81% 6.14 kB 6.19 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.browser.production.min.server.js +0.70% 16.41 kB 16.52 kB +0.94% 6.16 kB 6.21 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.node.production.min.server.js +0.68% 16.93 kB 17.04 kB +0.88% 6.28 kB 6.33 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.node.production.min.server.js +0.68% 16.93 kB 17.04 kB +0.88% 6.28 kB 6.33 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-writer.node.production.min.server.js +0.68% 16.97 kB 17.09 kB +0.86% 6.30 kB 6.35 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-writer.browser.production.min.server.js +0.66% 16.55 kB 16.66 kB +0.87% 6.18 kB 6.23 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-writer.browser.production.min.server.js +0.66% 16.55 kB 16.66 kB +0.87% 6.18 kB 6.23 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-writer.browser.production.min.server.js +0.66% 16.59 kB 16.70 kB +0.85% 6.20 kB 6.25 kB

Generated by 🚫 dangerJS against 6e9f716

<ServerContextContextProvider value={context}>
<ServerContext.Provider value={value}>{children}</ServerContext.Provider>
</ServerContextContextProvider>
return React.createElement(
Copy link
Collaborator

Choose a reason for hiding this comment

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

Prefer React.jsx since that's now what JSX compiles to. Really people shouldn't do that themselves since we can change the compiler but we are us.


const {useContext, useMemo, createContext} = React;

const ServerContextContext = createContext(null);
Copy link
Collaborator

@sebmarkbage sebmarkbage Mar 1, 2022

Choose a reason for hiding this comment

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

Thought provoking, but could this itself be a ServerContext? 🤯

If we wanted to enable this same hook to work from inside Server Components on the server so that you can serialize the context for later use by other server components (like pre-rendering other subtrees).

@sebmarkbage
Copy link
Collaborator

Now that I see it, I'm not sure about the name. It's partly for refetches but it's also for loading alternative branches of a subtree. That's kind of a refetch but also not quite. Let the bikeshedding commence.

@salazarm salazarm force-pushed the serverContextHooks branch 2 times, most recently from adfcd87 to 6228562 Compare March 8, 2022 14:23
@salazarm salazarm changed the base branch from main to 0.3-stable March 8, 2022 14:27
@salazarm salazarm changed the base branch from 0.3-stable to main March 8, 2022 14:27
@salazarm salazarm closed this Mar 8, 2022
@salazarm salazarm deleted the serverContextHooks branch March 8, 2022 14:32
@salazarm salazarm restored the serverContextHooks branch March 8, 2022 14:35
@salazarm salazarm reopened this Mar 8, 2022
@salazarm salazarm force-pushed the serverContextHooks branch from 6228562 to 73065cc Compare March 8, 2022 14:41
@@ -0,0 +1,10 @@
/**
Copy link
Collaborator

Choose a reason for hiding this comment

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

You'll need to add this to be built as a bundle too.

We'll also need a react-server-dom-relay one for FB.

Copy link
Collaborator

@sebmarkbage sebmarkbage Mar 8, 2022

Choose a reason for hiding this comment

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

You can also make tests out of these two in ReactFlightDOM-test and ReactFlightDOMRelay-test to ensure that you did. E.g. by porting the test you have above.

"exports": {
".": "./flight.js",
"./flight": "./flight.js",
"./flight-hooks": "./flight-hooks.js"
Copy link
Collaborator

Choose a reason for hiding this comment

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

This package is really just exposed as a way to build custom renderers but we don't even publish it.

You don't have to include an exports but if you do you need to include ./src/* to export the source to the compiler. https://github.com/facebook/react/blob/main/packages%2Freact%2Fpackage.json#L30

It gets stripped out on publish.

if ((tuple[1]: any).$$typeof === REACT_PROVIDER_TYPE) {
return createElement(ServerContextWrapper, null, {
ServerContext: ((tuple[1]: any): ReactProviderType<any>)._context,
...tuple[3],
Copy link
Collaborator

Choose a reason for hiding this comment

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

You know it's going to be children and value, so you can just enumerate those here. It's faster than spread.

@facebook-github-bot
Copy link

Hi @salazarm!

Thank you for your pull request.

We require contributors to sign our Contributor License Agreement, and yours needs attention.

You currently have a record in our system, but the CLA is no longer valid, and will need to be resubmitted.

Process

In order for us to review and merge your suggested changes, please sign at https://code.facebook.com/cla. If you are contributing on behalf of someone else (eg your employer), the individual CLA may not be sufficient and your employer may need to sign the corporate CLA.

Once the CLA is signed, our tooling will perform checks and validations. Afterwards, the pull request will be tagged with CLA signed. The tagging process may take up to 1 hour after signing. Please give it that time before contacting us about it.

If you have received this in error or have any questions, please contact us at [email protected]. Thanks!

@facebook-github-bot
Copy link

Thank you for signing our Contributor License Agreement. We can now accept your code for this (and any) Meta Open Source project. Thanks!

@sebmarkbage sebmarkbage force-pushed the serverContextHooks branch 2 times, most recently from c3cbcb6 to 24b3257 Compare April 21, 2022 04:32
@sebmarkbage sebmarkbage force-pushed the serverContextHooks branch from 24b3257 to fe1d427 Compare June 8, 2022 03:14
salazarm and others added 3 commits June 14, 2022 12:11
This is so we know which host config we're using for these.

After a couple of future fixes I don't think I'll need this anymore but
in the current approach it's needed.
This is not published to npm. It's meant for use in FB only.
So we import the deep import from these entry points instead.

Build react-client/flight-hooks

For use by implementors of renderers.
We don't support that syntax in the build toolchain.
This surfaces a suspected bug since we build flight-hooks separately
it creates a separate copy of the client contexts.
@salazarm salazarm closed this Jan 17, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CLA Signed React Core Team Opened by a member of the React Core Team
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants