Skip to content

Conversation

@sophiebits
Copy link
Collaborator

This is kind of annoying because Date implements toJSON so JSON.stringify turns it into a string before calling our replacer function.

@facebook-github-bot facebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Apr 14, 2023
@react-sizebot
Copy link

react-sizebot commented Apr 14, 2023

Comparing: d8089f2...9a6aa5d

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 = 164.49 kB 164.49 kB = 51.69 kB 51.69 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js = 166.96 kB 166.96 kB = 52.37 kB 52.37 kB
facebook-www/ReactDOM-prod.classic.js = 565.31 kB 565.31 kB = 99.48 kB 99.48 kB
facebook-www/ReactDOM-prod.modern.js = 549.10 kB 549.10 kB = 96.79 kB 96.79 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-client.browser.development.js +1.86% 46.27 kB 47.13 kB +2.26% 11.40 kB 11.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +1.86% 46.27 kB 47.13 kB +2.26% 11.40 kB 11.66 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +1.86% 46.27 kB 47.13 kB +2.26% 11.40 kB 11.66 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +1.83% 49.19 kB 50.09 kB +2.23% 11.58 kB 11.84 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +1.83% 49.19 kB 50.09 kB +2.23% 11.58 kB 11.84 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js +1.83% 49.19 kB 50.09 kB +2.23% 11.58 kB 11.84 kB
facebook-relay/flight/ReactFlightNativeRelayServer-dev.js +1.23% 61.19 kB 61.94 kB +1.62% 14.86 kB 15.10 kB
facebook-www/ReactFlightDOMRelayServer-dev.classic.js +1.23% 61.22 kB 61.98 kB +1.67% 14.81 kB 15.05 kB
facebook-www/ReactFlightDOMRelayServer-dev.modern.js +1.23% 61.22 kB 61.98 kB +1.67% 14.81 kB 15.05 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.min.js +1.22% 9.40 kB 9.52 kB +1.24% 3.70 kB 3.75 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.min.js +1.22% 9.40 kB 9.52 kB +1.24% 3.70 kB 3.75 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.min.js +1.22% 9.40 kB 9.52 kB +1.24% 3.70 kB 3.75 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.production.min.js +1.18% 9.64 kB 9.76 kB +1.34% 3.81 kB 3.86 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.production.min.js +1.18% 9.64 kB 9.76 kB +1.34% 3.81 kB 3.86 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.production.min.js +1.18% 9.64 kB 9.76 kB +1.34% 3.81 kB 3.86 kB
oss-experimental/react-server/cjs/react-server-flight.development.js +1.14% 63.84 kB 64.57 kB +1.50% 15.42 kB 15.65 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js +1.14% 63.84 kB 64.57 kB +1.50% 15.42 kB 15.65 kB
oss-stable/react-server/cjs/react-server-flight.development.js +1.14% 63.84 kB 64.57 kB +1.50% 15.42 kB 15.65 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +1.01% 83.21 kB 84.06 kB +1.29% 20.48 kB 20.74 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +1.01% 83.21 kB 84.06 kB +1.29% 20.48 kB 20.74 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +1.01% 83.21 kB 84.06 kB +1.29% 20.48 kB 20.74 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +1.01% 83.70 kB 84.55 kB +1.27% 20.62 kB 20.88 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +1.01% 83.70 kB 84.55 kB +1.27% 20.62 kB 20.88 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +1.01% 83.70 kB 84.55 kB +1.27% 20.62 kB 20.88 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +1.00% 87.95 kB 88.83 kB +1.47% 20.75 kB 21.06 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +1.00% 87.95 kB 88.83 kB +1.47% 20.75 kB 21.06 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js +1.00% 87.95 kB 88.83 kB +1.47% 20.75 kB 21.06 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +0.98% 85.78 kB 86.62 kB +1.28% 20.73 kB 20.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +0.98% 85.78 kB 86.62 kB +1.28% 20.73 kB 20.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +0.98% 85.78 kB 86.62 kB +1.28% 20.73 kB 20.99 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.96% 88.09 kB 88.93 kB +1.22% 21.40 kB 21.66 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.96% 88.09 kB 88.93 kB +1.22% 21.40 kB 21.66 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.96% 88.09 kB 88.93 kB +1.22% 21.40 kB 21.66 kB
oss-experimental/react-client/cjs/react-client-flight.production.min.js +0.85% 6.25 kB 6.30 kB +0.73% 2.48 kB 2.50 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.min.js +0.85% 6.25 kB 6.30 kB +0.73% 2.48 kB 2.50 kB
oss-stable/react-client/cjs/react-client-flight.production.min.js +0.85% 6.25 kB 6.30 kB +0.73% 2.48 kB 2.50 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +0.78% 6.78 kB 6.84 kB +0.63% 2.70 kB 2.72 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +0.78% 6.78 kB 6.84 kB +0.63% 2.70 kB 2.72 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.min.js +0.78% 6.78 kB 6.84 kB +0.63% 2.70 kB 2.72 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +0.74% 7.16 kB 7.21 kB +0.62% 2.89 kB 2.90 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +0.74% 7.16 kB 7.21 kB +0.62% 2.89 kB 2.90 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.min.js +0.74% 7.16 kB 7.21 kB +0.62% 2.89 kB 2.90 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +0.73% 7.23 kB 7.28 kB +0.54% 2.94 kB 2.95 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +0.73% 7.23 kB 7.28 kB +0.54% 2.94 kB 2.95 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.min.js +0.73% 7.23 kB 7.28 kB +0.54% 2.94 kB 2.95 kB
facebook-www/ReactFlightDOMRelayClient-prod.classic.js +0.59% 12.37 kB 12.44 kB +0.57% 3.16 kB 3.18 kB
facebook-www/ReactFlightDOMRelayClient-prod.modern.js +0.59% 12.37 kB 12.44 kB +0.57% 3.16 kB 3.18 kB
facebook-relay/flight/ReactFlightNativeRelayClient-prod.js +0.59% 12.43 kB 12.50 kB +0.62% 3.21 kB 3.23 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +0.57% 19.67 kB 19.78 kB +0.69% 7.08 kB 7.13 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +0.57% 19.67 kB 19.78 kB +0.69% 7.08 kB 7.13 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.min.js +0.57% 19.67 kB 19.78 kB +0.69% 7.08 kB 7.13 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +0.56% 19.95 kB 20.06 kB +0.73% 7.17 kB 7.22 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +0.56% 19.95 kB 20.06 kB +0.73% 7.17 kB 7.22 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.min.js +0.56% 19.95 kB 20.06 kB +0.73% 7.17 kB 7.22 kB
oss-experimental/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +0.56% 19.88 kB 19.99 kB +0.72% 7.20 kB 7.26 kB
oss-stable-semver/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +0.56% 19.88 kB 19.99 kB +0.72% 7.20 kB 7.26 kB
oss-stable/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.production.min.js +0.56% 19.88 kB 19.99 kB +0.72% 7.20 kB 7.26 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.min.js +0.54% 20.73 kB 20.84 kB +0.68% 7.45 kB 7.50 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.min.js +0.54% 20.73 kB 20.84 kB +0.68% 7.45 kB 7.50 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.production.min.js +0.54% 20.73 kB 20.84 kB +0.68% 7.45 kB 7.50 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +0.53% 21.29 kB 21.41 kB +0.67% 7.64 kB 7.69 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +0.53% 21.29 kB 21.41 kB +0.67% 7.64 kB 7.69 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.min.js +0.53% 21.29 kB 21.41 kB +0.67% 7.64 kB 7.69 kB
oss-experimental/react-client/cjs/react-client-flight.development.js +0.50% 22.79 kB 22.90 kB +0.36% 6.03 kB 6.05 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js +0.50% 22.79 kB 22.90 kB +0.36% 6.03 kB 6.05 kB
oss-stable/react-client/cjs/react-client-flight.development.js +0.50% 22.79 kB 22.90 kB +0.36% 6.03 kB 6.05 kB
facebook-www/ReactFlightDOMRelayClient-dev.classic.js +0.48% 20.63 kB 20.73 kB +0.43% 5.35 kB 5.37 kB
facebook-www/ReactFlightDOMRelayClient-dev.modern.js +0.48% 20.63 kB 20.73 kB +0.43% 5.35 kB 5.37 kB
facebook-relay/flight/ReactFlightNativeRelayClient-dev.js +0.48% 20.76 kB 20.86 kB +0.48% 5.41 kB 5.44 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +0.46% 24.77 kB 24.88 kB +0.37% 6.47 kB 6.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +0.46% 24.77 kB 24.88 kB +0.37% 6.47 kB 6.49 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +0.46% 24.77 kB 24.88 kB +0.37% 6.47 kB 6.49 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +0.43% 26.30 kB 26.42 kB +0.33% 6.91 kB 6.94 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +0.43% 26.30 kB 26.42 kB +0.33% 6.91 kB 6.94 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +0.43% 26.30 kB 26.42 kB +0.33% 6.91 kB 6.94 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +0.43% 26.51 kB 26.63 kB +0.36% 7.00 kB 7.02 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +0.43% 26.51 kB 26.63 kB +0.36% 7.00 kB 7.02 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +0.43% 26.51 kB 26.63 kB +0.36% 7.00 kB 7.02 kB
oss-experimental/react-server/cjs/react-server-flight.production.min.js +0.38% 15.41 kB 15.47 kB +0.68% 5.62 kB 5.66 kB
oss-stable-semver/react-server/cjs/react-server-flight.production.min.js +0.38% 15.41 kB 15.47 kB +0.68% 5.62 kB 5.66 kB
oss-stable/react-server/cjs/react-server-flight.production.min.js +0.38% 15.41 kB 15.47 kB +0.68% 5.62 kB 5.66 kB
facebook-relay/flight/ReactFlightNativeRelayServer-prod.js +0.34% 31.50 kB 31.61 kB +0.44% 7.48 kB 7.51 kB
facebook-www/ReactFlightDOMRelayServer-prod.classic.js +0.34% 31.60 kB 31.70 kB +0.37% 7.48 kB 7.51 kB
facebook-www/ReactFlightDOMRelayServer-prod.modern.js +0.34% 31.60 kB 31.70 kB +0.37% 7.48 kB 7.51 kB

Generated by 🚫 dangerJS against 9a6aa5d

key: string,
value: ReactClientValue,
): ReactJSONValue {
if (typeof value === 'string' && value[value.length - 1] === 'Z') {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Let's see if we can find a way not to duplicate this check. We have a string check further below, that can maybe unify with this. Since that is also going to check the first character both operations are free.

However, this technique doesn't seem very proof for other types of values. We don't have immediate plans to support URL but it's often requested - and it has a toJSON too.

Another thing we could do is always operate on the original value. Might make it more future proof. E.g. FormData doesn't have toJSON today but it might in the future. This might be bad for perf since it's a mega-morphic key look up for every value.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

How's this? ¯\_(ツ)_/¯ LMK if you prefer always reading the original value. (At that point it might be faster to reimplement JSON.stringify?)

This is kind of annoying because Date implements toJSON so JSON.stringify turns it into a string before calling our replacer function.
@sophiebits sophiebits merged commit c6db19f into facebook:main Apr 19, 2023
github-actions bot pushed a commit that referenced this pull request Apr 19, 2023
This is kind of annoying because Date implements toJSON so
JSON.stringify turns it into a string before calling our replacer
function.

DiffTrain build for [c6db19f](c6db19f)
kassens pushed a commit that referenced this pull request Apr 21, 2023
This is kind of annoying because Date implements toJSON so
JSON.stringify turns it into a string before calling our replacer
function.
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
This is kind of annoying because Date implements toJSON so
JSON.stringify turns it into a string before calling our replacer
function.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
This is kind of annoying because Date implements toJSON so
JSON.stringify turns it into a string before calling our replacer
function.

DiffTrain build for commit c6db19f.
unstubbable added a commit to unstubbable/react that referenced this pull request Sep 26, 2025
Using a similar approach as facebook#26622 for Date, we now allow URL instances
to be transported via Flight.

To make room for serializing URLs, which are prefixed with `'$u'`, we
now use `'$_'` as the serialization for `undefined`, instead of
`'$undefined'`. This also reduces the (uncompressed) RSC payload size a
bit when lots of `undefined` values are transported.
unstubbable added a commit to unstubbable/react that referenced this pull request Sep 26, 2025
Using a similar approach as facebook#26622 for Date, we now allow URL instances
to be transported via Flight.

To make room for serializing URLs, which are prefixed with `'$u'`, we
now use `'$_'` as the serialization for `undefined`, instead of
`'$undefined'`. This also reduces the (uncompressed) RSC payload size a
bit when lots of `undefined` values are transported.
unstubbable added a commit to unstubbable/react that referenced this pull request Sep 26, 2025
Previously, `URL` objects were serialized as plain strings via
`JSON.stringify`, so they lost their class identity on the receiving
side. This change extends Flight to transport `URL` instances directly,
using an approach similar to facebook#26622 for `Date`.

To make room for URL serialization (prefixed with `'$u'`), we now
represent undefined as `'$_'` instead of `'$undefined'`. This also
slightly reduces the uncompressed RSC payload size when many `undefined`
values are transported.

If Flight were the only concern, we could have used `'$U'` for URLs and
kept the existing encoding for `undefined`. However, this would conflict
with how `Uint8ClampedArray` is serialized in the Flight Reply Client.
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