8000 [Flight] Serialize functions by reference by devongovett · Pull Request #33539 · facebook/react · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

[Flight] Serialize functions by reference #33539

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

Merged
merged 3 commits into from
Jun 20, 2025

Conversation

devongovett
Copy link
Contributor

On pages that have a high number of server components (e.g. common when doing syntax highlighting), the debug outlining can produce extremely large RSC payloads. For example a documentation page I was working on had a 13.8 MB payload. I noticed that a majority of this was the source code for the same function components repeated over and over again (over 4000 times) within $E() eval commands.

This PR deduplicates the same functions by serializing by reference, similar to what is already done for objects. Doing this reduced the payload size of my page from 13.8 MB to 4.6 MB, and resulted in only 31 evals instead of over 4000. As a result it reduced development page load and hydration time from 4 seconds to 1.5 seconds. It also means the deserialized functions will have reference equality just as they did on the server.

@react-sizebot
Copy link
react-sizebot commented Jun 15, 2025

Comparing: 6b7e207...529af77

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.js = 6.68 kB 6.68 kB = 1.83 kB 1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js = 530.47 kB 530.47 kB = 93.64 kB 93.64 kB
oss-experimental/react-dom/cjs/react-dom.production.js = 6.69 kB 6.69 kB = 1.83 kB 1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js = 651.56 kB 651.56 kB = 114.75 kB 114.75 kB
facebook-www/ReactDOM-prod.classic.js = 674.98 kB 674.98 kB = 118.81 kB 118.81 kB
facebook-www/ReactDOM-prod.modern.js = 665.46 kB 665.46 kB = 117.23 kB 117.23 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable-semver/react-server/cjs/react-server-flight.development.js +0.56% 110.12 kB 110.74 kB +0.21% 20.34 kB 20.39 kB
oss-stable/react-server/cjs/react-server-flight.development.js +0.56% 110.12 kB 110.74 kB +0.21% 20.34 kB 20.39 kB
oss-experimental/react-server/cjs/react-server-flight.development.js +0.52% 118.00 kB 118.61 kB +0.19% 21.76 kB 21.80 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js +0.41% 149.06 kB 149.67 kB +0.21% 27.59 kB 27.65 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js +0.41% 149.06 kB 149.67 kB +0.21% 27.59 kB 27.65 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js +0.40% 152.63 kB 153.24 kB +0.21% 28.09 kB 28.15 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js +0.40% 152.63 kB 153.24 kB +0.21% 28.09 kB 28.15 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +0.40% 153.42 kB 154.04 kB +0.17% 28.46 kB 28.51 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +0.40% 153.42 kB 154.04 kB +0.17% 28.46 kB 28.51 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +0.39% 156.89 kB 157.51 kB +0.25% 28.97 kB 29.04 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +0.39% 156.89 kB 157.51 kB +0.25% 28.97 kB 29.04 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.39% 157.44 kB 158.05 kB +0.25% 29.09 kB 29.17 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.39% 157.44 kB 158.05 kB +0.25% 29.09 kB 29.17 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js +0.39% 158.09 kB 158.71 kB +0.17% 28.92 kB 28.97 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js +0.39% 158.09 kB 158.71 kB +0.17% 28.92 kB 28.97 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js +0.39% 156.95 kB 157.56 kB +0.18% 29.00 kB 29.05 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.39% 160.47 kB 161.09 kB +0.22% 29.46 kB 29.53 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.39% 160.47 kB 161.09 kB +0.22% 29.46 kB 29.53 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +0.39% 160.50 kB 161.12 kB +0.22% 29.46 kB 29.52 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +0.39% 160.50 kB 161.12 kB +0.22% 29.46 kB 29.52 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js +0.38% 160.87 kB 161.48 kB +0.17% 29.52 kB 29.57 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +0.37% 164.93 kB 165.54 kB +0.16% 29.99 kB 30.04 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +0.37% 164.93 kB 165.54 kB +0.16% 29.99 kB 30.04 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +0.37% 166.08 kB 166.69 kB +0.17% 30.26 kB 30.31 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +0.37% 166.08 kB 166.69 kB +0.17% 30.26 kB 30.31 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.37% 166.13 kB 166.75 kB +0.18% 30.28 kB 30.33 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.37% 166.13 kB 166.75 kB +0.18% 30.28 kB 30.33 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +0.37% 164.79 kB 165.40 kB +0.17% 30.36 kB 30.41 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.37% 165.33 kB 165.94 kB +0.18% 30.48 kB 30.54 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.36% 168.72 kB 169.33 kB +0.15% 30.93 kB 30.97 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +0.36% 168.75 kB 169.36 kB +0.15% 30.92 kB 30.97 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +0.35% 172.56 kB 173.17 kB +0.19% 32.01 kB 32.07 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js +0.35% 177.22 kB 177.83 kB +0.19% 32.48 kB 32.54 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +0.33% 184.06 kB 184.67 kB +0.17% 33.55 kB 33.61 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +0.33% 185.21 kB 185.82 kB +0.18% 33.84 kB 33.90 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.33% 185.26 kB 185.88 kB +0.18% 33.85 kB 33.91 kB

Generated by 🚫 dangerJS against 529af77

const processedChunk = encodeReferenceChunk(request, id, serializedValue);
request.completedRegularChunks.push(processedChunk);
const reference = serializeByValueID(id);
writtenObjects.set(value, reference);
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 a problem with this set today that it's not safe to write into this from renderConsoleValue because renderConsoleValue has a different serialization logic (e.g. it can serialize functions like this and can cut off properties at a certain depth).

That's why we don't actually dedupe objects neither unless they also appear in the actual RSC payload elsewhere. Currently we only read from it and assume that if you're sending it across anyway, then whatever serialization happened in the production path is good enough also for the console value path.

We should really have a separate writtenObjects set just for the renderConsoleValue serialization.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ah that makes sense. Thanks for handling the follow up!

@sebmarkbage sebmarkbage merged commit 643257c into facebook:main Jun 20, 2025
241 checks passed
sebmarkbage added a commit that referenced this pull request Jun 20, 2025
…33583)

Stacked on #33539.

Stores dedupes of `renderConsoleValue` in a separate set. This allows us
to dedupe objects safely since we can't write objects using this
algorithm if they might also be referenced by the "real" serialization.

Also renamed it to `renderDebugModel` since it's not just for console
anymore.
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.

4 participants
0