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

[Flight][Float] Preinitialize module imports during SSR #27314

Merged
merged 2 commits into from Sep 27, 2023

Conversation

gnoff
Copy link
Collaborator

@gnoff gnoff commented Aug 30, 2023

Currently when we SSR a Flight response we do not emit any resources for module imports. This means that when the client hydrates it won't have already loaded the necessary scripts to satisfy the Imports defined in the Flight payload which will lead to a delay in hydration completing.

This change updates react-server-dom-webpack and react-server-dom-esm to emit async script tags in the head when we encounter a modules in the flight response.

To support this we need some additional server configuration. We need to know the path prefix for chunk loading and whether the chunks will load with CORS or not (and if so with what configuration).

@react-sizebot
Copy link

react-sizebot commented Aug 30, 2023

Comparing: 49eba01...77fed1f

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.06% 167.45 kB 167.55 kB = 52.15 kB 52.15 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js +0.06% 176.11 kB 176.22 kB = 54.84 kB 54.84 kB
facebook-www/ReactDOM-prod.classic.js +0.05% 563.33 kB 563.60 kB +0.03% 99.28 kB 99.30 kB
facebook-www/ReactDOM-prod.modern.js +0.05% 547.06 kB 547.32 kB +0.04% 96.35 kB 96.39 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-plugin.js +32.65% 4.62 kB 6.13 kB +35.04% 2.03 kB 2.74 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-plugin.js +32.65% 4.62 kB 6.13 kB +35.04% 2.03 kB 2.74 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-plugin.js +32.65% 4.62 kB 6.13 kB +35.04% 2.03 kB 2.74 kB
oss-experimental/react-dom/cjs/react-dom.shared-subset.production.min.js +4.61% 2.43 kB 2.54 kB +0.86% 0.81 kB 0.82 kB
oss-stable-semver/react-dom/cjs/react-dom.shared-subset.production.min.js +4.61% 2.43 kB 2.54 kB +0.86% 0.81 kB 0.82 kB
oss-stable/react-dom/cjs/react-dom.shared-subset.production.min.js +4.61% 2.43 kB 2.54 kB +0.86% 0.81 kB 0.82 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-flight-client.production.min.js +4.55% 0.90 kB 0.94 kB +2.57% 0.51 kB 0.52 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-flight-client.production.min.js +4.55% 0.90 kB 0.94 kB +2.57% 0.51 kB 0.52 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-flight-client.production.min.js +4.55% 0.90 kB 0.94 kB +2.57% 0.51 kB 0.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +3.96% 58.59 kB 60.91 kB +5.13% 14.28 kB 15.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +3.96% 58.59 kB 60.91 kB +5.13% 14.28 kB 15.01 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +3.82% 59.31 kB 61.57 kB +4.98% 14.42 kB 15.14 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +3.82% 59.31 kB 61.57 kB +4.98% 14.42 kB 15.14 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-flight-client.development.js +3.80% 1.84 kB 1.91 kB +3.63% 0.80 kB 0.83 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-flight-client.development.js +3.80% 1.84 kB 1.91 kB +3.63% 0.80 kB 0.83 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-flight-client.development.js +3.80% 1.84 kB 1.91 kB +3.63% 0.80 kB 0.83 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +3.72% 57.35 kB 59.48 kB +5.16% 13.89 kB 14.60 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +3.72% 57.35 kB 59.48 kB +5.16% 13.89 kB 14.60 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +3.64% 63.63 kB 65.95 kB +4.77% 15.29 kB 16.02 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +3.52% 64.36 kB 66.62 kB +4.63% 15.44 kB 16.16 kB
oss-stable-semver/react-dom/cjs/react-dom-server-rendering-stub.production.min.js +3.47% 3.09 kB 3.19 kB +0.44% 1.13 kB 1.14 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.min.js +3.46% 11.49 kB 11.89 kB +3.76% 4.31 kB 4.47 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.min.js +3.46% 11.49 kB 11.89 kB +3.76% 4.31 kB 4.47 kB
oss-stable/react-dom/cjs/react-dom-server-rendering-stub.production.min.js +3.44% 3.11 kB 3.22 kB +0.52% 1.16 kB 1.16 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +3.42% 62.39 kB 64.53 kB +4.78% 14.90 kB 15.62 kB
oss-stable-semver/react-dom/umd/react-dom-server-rendering-stub.production.min.js +3.26% 3.28 kB 3.39 kB +0.89% 1.24 kB 1.25 kB
oss-stable/react-dom/umd/react-dom-server-rendering-stub.production.min.js +3.24% 3.31 kB 3.41 kB +0.87% 1.27 kB 1.28 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +3.17% 11.89 kB 12.27 kB +3.77% 4.48 kB 4.65 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +3.17% 11.89 kB 12.27 kB +3.77% 4.48 kB 4.65 kB
oss-experimental/react-dom/cjs/react-dom-server-rendering-stub.production.min.js +3.16% 3.26 kB 3.36 kB +0.75% 1.21 kB 1.22 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +3.15% 12.22 kB 12.60 kB +3.40% 4.62 kB 4.77 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +3.15% 12.22 kB 12.60 kB +3.40% 4.62 kB 4.77 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.min.js +3.10% 12.81 kB 13.21 kB +3.37% 4.68 kB 4.84 kB
oss-experimental/react-dom/umd/react-dom-server-rendering-stub.production.min.js +3.09% 3.46 kB 3.57 kB +0.99% 1.32 kB 1.33 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +2.86% 13.21 kB 13.59 kB +3.57% 4.85 kB 5.02 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.85% 56.06 kB 57.66 kB +3.50% 13.56 kB 14.03 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.85% 56.06 kB 57.66 kB +3.50% 13.56 kB 14.03 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +2.84% 13.54 kB 13.92 kB +3.21% 4.98 kB 5.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +2.77% 12.48 kB 12.82 kB +3.27% 4.70 kB 4.86 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +2.77% 12.48 kB 12.82 kB +3.27% 4.70 kB 4.86 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.62% 61.11 kB 62.71 kB +3.25% 14.57 kB 15.05 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +2.51% 13.79 kB 14.13 kB +2.88% 5.07 kB 5.21 kB
oss-experimental/react-dom/cjs/react-dom.shared-subset.development.js +2.48% 14.24 kB 14.60 kB +1.02% 3.03 kB 3.06 kB
oss-stable-semver/react-dom/cjs/react-dom.shared-subset.development.js +2.48% 14.24 kB 14.60 kB +1.02% 3.03 kB 3.06 kB
oss-stable/react-dom/cjs/react-dom.shared-subset.development.js +2.48% 14.24 kB 14.60 kB +1.02% 3.03 kB 3.06 kB
oss-stable-semver/react-dom/umd/react-dom-server-rendering-stub.development.js +2.37% 16.33 kB 16.72 kB +0.81% 3.60 kB 3.63 kB
oss-stable/react-dom/umd/react-dom-server-rendering-stub.development.js +2.37% 16.36 kB 16.75 kB +0.80% 3.63 kB 3.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +2.30% 54.11 kB 55.35 kB +3.24% 13.17 kB 13.60 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +2.30% 54.11 kB 55.35 kB +3.24% 13.17 kB 13.60 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +2.28% 57.58 kB 58.89 kB +3.25% 13.38 kB 13.82 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +2.28% 57.58 kB 58.89 kB +3.25% 13.38 kB 13.82 kB
oss-stable-semver/react-dom/cjs/react-dom-server-rendering-stub.development.js +2.27% 15.52 kB 15.88 kB +0.95% 3.48 kB 3.51 kB
oss-stable/react-dom/cjs/react-dom-server-rendering-stub.development.js +2.27% 15.55 kB 15.90 kB +0.97% 3.51 kB 3.54 kB
oss-experimental/react-dom/umd/react-dom-server-rendering-stub.development.js +2.18% 17.73 kB 18.11 kB +0.68% 4.14 kB 4.17 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +2.10% 59.15 kB 60.40 kB +3.06% 14.16 kB 14.60 kB
oss-experimental/react-dom/cjs/react-dom-server-rendering-stub.development.js +2.09% 16.88 kB 17.24 kB +0.72% 4.02 kB 4.05 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +2.09% 62.93 kB 64.24 kB +3.03% 14.40 kB 14.84 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-plugin.js +32.65% 4.62 kB 6.13 kB +35.04% 2.03 kB 2.74 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-plugin.js +32.65% 4.62 kB 6.13 kB +35.04% 2.03 kB 2.74 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-plugin.js +32.65% 4.62 kB 6.13 kB +35.04% 2.03 kB 2.74 kB
oss-experimental/react-dom/cjs/react-dom.shared-subset.production.min.js +4.61% 2.43 kB 2.54 kB +0.86% 0.81 kB 0.82 kB
oss-stable-semver/react-dom/cjs/react-dom.shared-subset.production.min.js +4.61% 2.43 kB 2.54 kB +0.86% 0.81 kB 0.82 kB
oss-stable/react-dom/cjs/react-dom.shared-subset.production.min.js +4.61% 2.43 kB 2.54 kB +0.86% 0.81 kB 0.82 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-flight-client.production.min.js +4.55% 0.90 kB 0.94 kB +2.57% 0.51 kB 0.52 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-flight-client.production.min.js +4.55% 0.90 kB 0.94 kB +2.57% 0.51 kB 0.52 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-flight-client.production.min.js +4.55% 0.90 kB 0.94 kB +2.57% 0.51 kB 0.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +3.96% 58.59 kB 60.91 kB +5.13% 14.28 kB 15.01 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +3.96% 58.59 kB 60.91 kB +5.13% 14.28 kB 15.01 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +3.82% 59.31 kB 61.57 kB +4.98% 14.42 kB 15.14 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +3.82% 59.31 kB 61.57 kB +4.98% 14.42 kB 15.14 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-flight-client.development.js +3.80% 1.84 kB 1.91 kB +3.63% 0.80 kB 0.83 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-flight-client.development.js +3.80% 1.84 kB 1.91 kB +3.63% 0.80 kB 0.83 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-flight-client.development.js +3.80% 1.84 kB 1.91 kB +3.63% 0.80 kB 0.83 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +3.72% 57.35 kB 59.48 kB +5.16% 13.89 kB 14.60 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +3.72% 57.35 kB 59.48 kB +5.16% 13.89 kB 14.60 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +3.64% 63.63 kB 65.95 kB +4.77% 15.29 kB 16.02 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +3.52% 64.36 kB 66.62 kB +4.63% 15.44 kB 16.16 kB
oss-stable-semver/react-dom/cjs/react-dom-server-rendering-stub.production.min.js +3.47% 3.09 kB 3.19 kB +0.44% 1.13 kB 1.14 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.min.js +3.46% 11.49 kB 11.89 kB +3.76% 4.31 kB 4.47 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.min.js +3.46% 11.49 kB 11.89 kB +3.76% 4.31 kB 4.47 kB
oss-stable/react-dom/cjs/react-dom-server-rendering-stub.production.min.js +3.44% 3.11 kB 3.22 kB +0.52% 1.16 kB 1.16 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +3.42% 62.39 kB 64.53 kB +4.78% 14.90 kB 15.62 kB
oss-stable-semver/react-dom/umd/react-dom-server-rendering-stub.production.min.js +3.26% 3.28 kB 3.39 kB +0.89% 1.24 kB 1.25 kB
oss-stable/react-dom/umd/react-dom-server-rendering-stub.production.min.js +3.24% 3.31 kB 3.41 kB +0.87% 1.27 kB 1.28 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +3.17% 11.89 kB 12.27 kB +3.77% 4.48 kB 4.65 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +3.17% 11.89 kB 12.27 kB +3.77% 4.48 kB 4.65 kB
oss-experimental/react-dom/cjs/react-dom-server-rendering-stub.production.min.js +3.16% 3.26 kB 3.36 kB +0.75% 1.21 kB 1.22 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +3.15% 12.22 kB 12.60 kB +3.40% 4.62 kB 4.77 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +3.15% 12.22 kB 12.60 kB +3.40% 4.62 kB 4.77 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.min.js +3.10% 12.81 kB 13.21 kB +3.37% 4.68 kB 4.84 kB
oss-experimental/react-dom/umd/react-dom-server-rendering-stub.production.min.js +3.09% 3.46 kB 3.57 kB +0.99% 1.32 kB 1.33 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +2.86% 13.21 kB 13.59 kB +3.57% 4.85 kB 5.02 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.85% 56.06 kB 57.66 kB +3.50% 13.56 kB 14.03 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.85% 56.06 kB 57.66 kB +3.50% 13.56 kB 14.03 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +2.84% 13.54 kB 13.92 kB +3.21% 4.98 kB 5.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +2.77% 12.48 kB 12.82 kB +3.27% 4.70 kB 4.86 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +2.77% 12.48 kB 12.82 kB +3.27% 4.70 kB 4.86 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.62% 61.11 kB 62.71 kB +3.25% 14.57 kB 15.05 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +2.51% 13.79 kB 14.13 kB +2.88% 5.07 kB 5.21 kB
oss-experimental/react-dom/cjs/react-dom.shared-subset.development.js +2.48% 14.24 kB 14.60 kB +1.02% 3.03 kB 3.06 kB
oss-stable-semver/react-dom/cjs/react-dom.shared-subset.development.js +2.48% 14.24 kB 14.60 kB +1.02% 3.03 kB 3.06 kB
oss-stable/react-dom/cjs/react-dom.shared-subset.development.js +2.48% 14.24 kB 14.60 kB +1.02% 3.03 kB 3.06 kB
oss-stable-semver/react-dom/umd/react-dom-server-rendering-stub.development.js +2.37% 16.33 kB 16.72 kB +0.81% 3.60 kB 3.63 kB
oss-stable/react-dom/umd/react-dom-server-rendering-stub.development.js +2.37% 16.36 kB 16.75 kB +0.80% 3.63 kB 3.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +2.30% 54.11 kB 55.35 kB +3.24% 13.17 kB 13.60 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +2.30% 54.11 kB 55.35 kB +3.24% 13.17 kB 13.60 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +2.28% 57.58 kB 58.89 kB +3.25% 13.38 kB 13.82 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +2.28% 57.58 kB 58.89 kB +3.25% 13.38 kB 13.82 kB
oss-stable-semver/react-dom/cjs/react-dom-server-rendering-stub.development.js +2.27% 15.52 kB 15.88 kB +0.95% 3.48 kB 3.51 kB
oss-stable/react-dom/cjs/react-dom-server-rendering-stub.development.js +2.27% 15.55 kB 15.90 kB +0.97% 3.51 kB 3.54 kB
oss-experimental/react-dom/umd/react-dom-server-rendering-stub.development.js +2.18% 17.73 kB 18.11 kB +0.68% 4.14 kB 4.17 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +2.10% 59.15 kB 60.40 kB +3.06% 14.16 kB 14.60 kB
oss-experimental/react-dom/cjs/react-dom-server-rendering-stub.development.js +2.09% 16.88 kB 17.24 kB +0.72% 4.02 kB 4.05 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +2.09% 62.93 kB 64.24 kB +3.03% 14.40 kB 14.84 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.min.js +1.66% 10.70 kB 10.87 kB +1.29% 4.12 kB 4.17 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.min.js +1.66% 10.70 kB 10.87 kB +1.29% 4.12 kB 4.17 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.production.min.js +1.62% 10.96 kB 11.14 kB +1.26% 4.22 kB 4.27 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.production.min.js +1.62% 10.96 kB 11.14 kB +1.26% 4.22 kB 4.27 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.min.js +1.49% 12.00 kB 12.18 kB +1.05% 4.47 kB 4.51 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.production.min.js +1.46% 12.27 kB 12.45 kB +1.09% 4.57 kB 4.62 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +1.09% 102.77 kB 103.90 kB +1.71% 24.80 kB 25.22 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +1.09% 102.77 kB 103.90 kB +1.71% 24.80 kB 25.22 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +1.08% 108.67 kB 109.84 kB +1.69% 25.18 kB 25.61 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +1.08% 108.67 kB 109.84 kB +1.69% 25.18 kB 25.61 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +1.04% 107.64 kB 108.76 kB +1.59% 25.70 kB 26.11 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.min.js +1.04% 9.94 kB 10.05 kB +1.17% 3.84 kB 3.89 kB
oss-stable/react-client/cjs/react-client-flight.production.min.js +1.04% 9.94 kB 10.05 kB +1.17% 3.84 kB 3.89 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +1.03% 113.77 kB 114.94 kB +1.56% 26.06 kB 26.47 kB
oss-experimental/react-client/cjs/react-client-flight.production.min.js +0.93% 11.13 kB 11.23 kB +1.13% 4.18 kB 4.22 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.59% 103.18 kB 103.79 kB +1.02% 24.91 kB 25.17 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.59% 103.18 kB 103.79 kB +1.02% 24.91 kB 25.17 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.56% 108.05 kB 108.65 kB +0.94% 25.82 kB 26.06 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.56% 108.91 kB 109.51 kB +0.98% 26.11 kB 26.36 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.56% 108.91 kB 109.51 kB +0.98% 26.11 kB 26.36 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.53% 113.32 kB 113.93 kB +0.92% 26.84 kB 27.09 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js +0.48% 51.20 kB 51.44 kB +0.57% 12.71 kB 12.78 kB
oss-stable/react-client/cjs/react-client-flight.development.js +0.48% 51.20 kB 51.44 kB +0.57% 12.71 kB 12.78 kB
oss-experimental/react-client/cjs/react-client-flight.development.js +0.44% 56.24 kB 56.49 kB +0.52% 13.72 kB 13.79 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +0.39% 26.52 kB 26.62 kB +0.48% 8.99 kB 9.03 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +0.39% 26.52 kB 26.62 kB +0.48% 8.99 kB 9.03 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +0.38% 27.73 kB 27.84 kB +0.45% 9.29 kB 9.33 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +0.37% 26.68 kB 26.78 kB +0.42% 9.12 kB 9.16 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +0.37% 26.68 kB 26.78 kB +0.42% 9.12 kB 9.16 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +0.36% 27.90 kB 28.00 kB +0.45% 9.41 kB 9.46 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.min.js +0.35% 9.99 kB 10.03 kB +0.42% 3.83 kB 3.85 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.min.js +0.35% 9.99 kB 10.03 kB +0.42% 3.83 kB 3.85 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.min.js +0.30% 11.30 kB 11.33 kB +0.38% 4.18 kB 4.20 kB

Generated by 🚫 dangerJS against 77fed1f

@gnoff gnoff force-pushed the preinit-imports-webpack-esm branch from a6011c2 to ebd48ac Compare August 30, 2023 17:34
Comment on lines +16 to +28
const webpackGetChunkFilename = __webpack_require__.u;
__webpack_require__.u = function (chunkId: string) {
const flightChunk = chunkMap.get(chunkId);
if (flightChunk !== undefined) {
return flightChunk;
}
return webpackGetChunkFilename(chunkId);
};

export function loadChunk(chunkId: string, filename: string): Promise<mixed> {
chunkMap.set(chunkId, filename);
return __webpack_chunk_load__(chunkId);
}
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

@sebmarkbage why did we think we needed chunkId still on the client? With this implementation I can just send the filenames. I believe if there is a dynamic import for module Foo and module Foo is also in a client component chunk the dynamic import gets it's own chunk I think. webpack tries to load the dynamic chunk it'll have a different chunkId than the chunk used for client components. This is unfortunate b/c the code might already be on the client and if there were module state it wouldn't be shared across both instances. However if this is just how the bundling has to be there is no sense in serializing the chunkIds for client component imports because we can just look up the chunk in chunkMap using the filename rather than the chunkId (by passing the filename into __webpack_chunk_load__

Copy link
Collaborator

Choose a reason for hiding this comment

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

I think the answer I don't think Webpack does duplicate the modules. If it does, then we need to fix that. Maybe there's a bug in Next.js but I wouldn't expect the prototype implementation do that. Can you confirm?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I confirmed you are correct

@gnoff gnoff force-pushed the preinit-imports-webpack-esm branch 2 times, most recently from bf0c510 to 7f8d6d1 Compare August 30, 2023 17:51
await virtualFs.readFile(
path.join(buildPath, 'react-ssr-manifest.json'),
path.join(buildPath, 'react-ssr-bundle-config.json'),
Copy link
Collaborator

Choose a reason for hiding this comment

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

The name manifest comes from the Webpack usage. That just leaked into our internal SSRManifest name. Renaming it is a bit the tail wagging the dog. We shouldn't try to change the naming convention for these files which are still just manifests.

Copy link
Collaborator

Choose a reason for hiding this comment

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

In other words, our SSRManifest was a Module Map living in a Manifest file. Now it's a Bundler Config living in a Manifest file. It doesn't change that the outer thing is still a manifest.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

I updated the filename but also renamed our type SSRManifest to SSRModuleMap since that is what it is. We can go back to the manifest type if we consolidate ModuleLoading with the ModuleMap as you questioned below however since you previously suggested doing the opposite I'll await further consideration there.

}
root = createFromNodeStream(rscResponse, ssrBundleConfig.ssrManifest, {
moduleLoading: ssrBundleConfig.moduleLoading,
});
Copy link
Collaborator

Choose a reason for hiding this comment

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

Does this suggest that this should just be a single argument option that has both in it?

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

That's what my original implementation had and your feedback at that time was preinitialization and ssr module mapping were unrelated concepts and I should separate them :)

The moduleLoading is technically optional whereas the ssrManifest is a must so I can see the argument they are separate.

Copy link
Collaborator

Choose a reason for hiding this comment

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

There's an internal concept and an external concept. This is also related to the name of the type. Almost always we refer to the internal type as one thing but the exported type (which is the name we recommend DefinitelyTyped to use) could be aliased to another name.

I wonder if that's also the case here. Internally they can be two separate concepts and such the configs have to deal with them separately but we can join them here as a single input. Especially if we expect the Webpack plugin to generate it. I don't think I expected that we'd generate it originally.

@@ -0,0 +1,45 @@
/**
Copy link
Collaborator

Choose a reason for hiding this comment

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

This file should maybe be called ClientReferenceMetaData or maybe we go away from the ClientReference naming all together and call it ImportMetaData or something.

Because there is a notion of a ClientReference and ServerReference - the reified thing (e.g. proxy or real thing) - which is not this. And there's no code in this file related to it, and there shouldn't be because that code can't be shared before server/client.

So this file shouldn't be called ReactFlightClientReference.js.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

yeah this makes sense to me

@gnoff gnoff force-pushed the preinit-imports-webpack-esm branch 4 times, most recently from f34a29c to 4cc6990 Compare September 5, 2023 22:57
Copy link
Collaborator

@sebmarkbage sebmarkbage left a comment

Choose a reason for hiding this comment

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

Nit: The public API can now be merged into a single SSRManifest type instead of two options.

Also, still some test failures.

@gnoff gnoff force-pushed the preinit-imports-webpack-esm branch 9 times, most recently from 1895b38 to 19237fb Compare September 12, 2023 23:53
@gnoff gnoff force-pushed the preinit-imports-webpack-esm branch 3 times, most recently from 0df428a to c16a3b1 Compare September 20, 2023 18:07
@gnoff gnoff merged commit 701ac2e into facebook:main Sep 27, 2023
36 checks passed
@gnoff gnoff deleted the preinit-imports-webpack-esm branch September 27, 2023 16:53
github-actions bot pushed a commit that referenced this pull request Sep 27, 2023
Currently when we SSR a Flight response we do not emit any resources for
module imports. This means that when the client hydrates it won't have
already loaded the necessary scripts to satisfy the Imports defined in
the Flight payload which will lead to a delay in hydration completing.

This change updates `react-server-dom-webpack` and
`react-server-dom-esm` to emit async script tags in the head when we
encounter a modules in the flight response.

To support this we need some additional server configuration. We need to
know the path prefix for chunk loading and whether the chunks will load
with CORS or not (and if so with what configuration).

DiffTrain build for [701ac2e](701ac2e)
gnoff added a commit that referenced this pull request Sep 27, 2023
stacked on #27314 

Turbopack requires a different module loading strategy than Webpack and
as such this PR implements a new package `react-server-dom-turbopack`
which largely follows the `react-server-dom-webpack` but is implemented
for this new bundler
github-actions bot pushed a commit that referenced this pull request Sep 27, 2023
stacked on #27314

Turbopack requires a different module loading strategy than Webpack and
as such this PR implements a new package `react-server-dom-turbopack`
which largely follows the `react-server-dom-webpack` but is implemented
for this new bundler

DiffTrain build for [f81c0f1](f81c0f1)
kodiakhq bot pushed a commit to vercel/next.js that referenced this pull request Oct 3, 2023
Today when we hydrate an SSR'd RSC response on the client we encounter import chunks which initiate code loading for client components. However we only start fetching these chunks after hydration has begun which is necessarily after the initial chunks for the entrypoint have loaded.

React has upstream changes that need to land which will preinitialize the rendered chunks for all client components used during the SSR pass. This will cause a `<script async="" src... />` tag to be emitted in the head for each chunk we need to load during hydration which allows the browser to start fetching these resources even before the entrypoint has started to execute.

Additionally the implementation for webpack and turbopack is different enough that there will be a new `react-server-dom-turbopack` package in the React repo which should be used when using Turbopack with Next.

This PR also removes a number of patches to React src that proxy loading (`__next_chunk_load__`) and bundler requires (`__next_require__`) through the `globalThis` object. Now the react packages can be fully responsible for implementing chunk loading and all Next needs to do is supply the necessary information such as chunk prefix and crossOrigin attributes necessary for this loading. This information is produced as part of the client-manifest by either a Webpack plugin or Turbopack.

Additionally any modifications to the chunk filename that were previously done at runtime need to be made in the manifest itself now. This means we need to encode the deployment id for skew protection and encode the filename to make it match our static path matching (and resolutions on s3) when using `[` and `]` segment characters.

There are a few followup items to consider in later PRs
1. we currently bundle a node and edge version of react-server-dom-webpack/client. The node version has an implementation for busboy whereas the edge version does not. Next is currently configured to use busboy when handling a fetch action sent as multipart with a node runtime. Ideally we'd only bundle the one platform we are buliding for but some additional refactoring to support better forking is possibly required here

This PR also updates react from 09285d5a7 to d900fadbf.

### React upstream changes

- facebook/react#27439
- facebook/react#26763
- facebook/react#27434
- facebook/react#27433
- facebook/react#27424
- facebook/react#27428
- facebook/react#27427
- facebook/react#27315
- facebook/react#27314
- facebook/react#27400
- facebook/react#27421
- facebook/react#27419
- facebook/react#27418
unstubbable added a commit to unstubbable/mfng that referenced this pull request Oct 30, 2023
Based on facebook/react#27314

This feature requires `AsyncLocalStorage` to be available in the edge
environment via the `node:async_hooks` module. This is the case for
[Vercel](https://vercel.com/docs/functions/edge-functions/edge-runtime#compatible-node.js-modules)
as well as
[Cloudflare](https://developers.cloudflare.com/workers/runtime-apis/nodejs/asynclocalstorage/).

fixes #17
unstubbable added a commit to unstubbable/mfng that referenced this pull request Oct 30, 2023
Based on facebook/react#27314

This feature requires `AsyncLocalStorage` to be available in the edge
environment via the `node:async_hooks` module. This is the case for
[Vercel](https://vercel.com/docs/functions/edge-functions/edge-runtime#compatible-node.js-modules)
as well as
[Cloudflare](https://developers.cloudflare.com/workers/runtime-apis/nodejs/asynclocalstorage/).

fixes #17
sebmarkbage added a commit that referenced this pull request Feb 16, 2024
We have an unresolved conflict where the Flight client wants to execute
inside Fizz to emit side-effects like preloads (which can be early) into
that stream. However, the FormState API requires the state to be passed
at the root, so if you're getting that through the RSC payload it's a
Catch 22.

#27314 used a hack to mutate the form state array to fill it in later,
but that doesn't actually work because it's not always an array. It's
sometimes null like if there wasn't a POST. This lead to a bunch of
hydration errors - which doesn't have the best error message for this
case neither. It probably should error with something that specifies
that it's form state.

This fixes it by teeing the stream into two streams and consuming it
with two Flight clients. One to read the form state and one to emit
side-effects and read the root.
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
Currently when we SSR a Flight response we do not emit any resources for
module imports. This means that when the client hydrates it won't have
already loaded the necessary scripts to satisfy the Imports defined in
the Flight payload which will lead to a delay in hydration completing.

This change updates `react-server-dom-webpack` and
`react-server-dom-esm` to emit async script tags in the head when we
encounter a modules in the flight response.

To support this we need some additional server configuration. We need to
know the path prefix for chunk loading and whether the chunks will load
with CORS or not (and if so with what configuration).
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
stacked on facebook#27314 

Turbopack requires a different module loading strategy than Webpack and
as such this PR implements a new package `react-server-dom-turbopack`
which largely follows the `react-server-dom-webpack` but is implemented
for this new bundler
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
We have an unresolved conflict where the Flight client wants to execute
inside Fizz to emit side-effects like preloads (which can be early) into
that stream. However, the FormState API requires the state to be passed
at the root, so if you're getting that through the RSC payload it's a
Catch 22.

facebook#27314 used a hack to mutate the form state array to fill it in later,
but that doesn't actually work because it's not always an array. It's
sometimes null like if there wasn't a POST. This lead to a bunch of
hydration errors - which doesn't have the best error message for this
case neither. It probably should error with something that specifies
that it's form state.

This fixes it by teeing the stream into two streams and consuming it
with two Flight clients. One to read the form state and one to emit
side-effects and read the root.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
Currently when we SSR a Flight response we do not emit any resources for
module imports. This means that when the client hydrates it won't have
already loaded the necessary scripts to satisfy the Imports defined in
the Flight payload which will lead to a delay in hydration completing.

This change updates `react-server-dom-webpack` and
`react-server-dom-esm` to emit async script tags in the head when we
encounter a modules in the flight response.

To support this we need some additional server configuration. We need to
know the path prefix for chunk loading and whether the chunks will load
with CORS or not (and if so with what configuration).

DiffTrain build for commit 701ac2e.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
stacked on #27314

Turbopack requires a different module loading strategy than Webpack and
as such this PR implements a new package `react-server-dom-turbopack`
which largely follows the `react-server-dom-webpack` but is implemented
for this new bundler

DiffTrain build for commit f81c0f1.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
We have an unresolved conflict where the Flight client wants to execute
inside Fizz to emit side-effects like preloads (which can be early) into
that stream. However, the FormState API requires the state to be passed
at the root, so if you're getting that through the RSC payload it's a
Catch 22.

#27314 used a hack to mutate the form state array to fill it in later,
but that doesn't actually work because it's not always an array. It's
sometimes null like if there wasn't a POST. This lead to a bunch of
hydration errors - which doesn't have the best error message for this
case neither. It probably should error with something that specifies
that it's form state.

This fixes it by teeing the stream into two streams and consuming it
with two Flight clients. One to read the form state and one to emit
side-effects and read the root.

DiffTrain build for commit 6a44f35.
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.

None yet

4 participants