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

Fast JSX: Don't clone props object #28768

Merged
merged 1 commit into from
Apr 5, 2024
Merged

Fast JSX: Don't clone props object #28768

merged 1 commit into from
Apr 5, 2024

Conversation

acdlite
Copy link
Collaborator

@acdlite acdlite commented Apr 5, 2024

(Unless "key" is spread onto the element.)

Historically, the JSX runtime clones the props object that is passed in. We've done this for two reasons.

One reason is that there are certain prop names that are reserved by React, like key and (before React 19) ref. These are not actual props and are not observable by the target component; React uses them internally but removes them from the props object before passing them to userspace.

The second reason is that the classic JSX runtime, createElement, is both a compiler target and a public API that can be called manually. Therefore, we can't assume that the props object that is passed into createElement won't be mutated by userspace code after it is passed in.

However, the new JSX runtime, jsx, is not a public API — it's solely a compiler target, and the compiler will always pass a fresh, inline object. So the only reason to clone the props is if a reserved prop name is used.

In React 19, ref is no longer a reserved prop name, and key will only appear in the props object if it is spread onto the element. (Because if key is statically defined, the compiler will pass it as a separate argument to the jsx function.) So the only remaining reason to clone the props object is if key is spread onto the element, which is a rare case, and also triggers a warning in development.

In a future release, we will not remove a spread key from the props object. (But we'll still warn.) We'll always pass the object straight through.

The expected impact is much faster JSX element creation, which in many apps is a significant slice of the overall runtime cost of rendering.

(Unless "key" is spread onto the element.)

Historically, the JSX runtime clones the props object that is passed in.
We've done this for two reasons.

One reason is that there are certain prop names that are reserved by
React, like `key` and (before React 19) `ref`. These are not actual
props and are not observable by the target component; React uses them
internally but removes them from the props object before passing them
to userspace.

The second reason is that the classic JSX runtime, `createElement`, is
both a compiler target _and_ a public API that can be called manually.
Therefore, we can't assume that the props object that is passed into
`createElement` won't be mutated by userspace code after it is
passed in.

However, the new JSX runtime, `jsx``, is not a public API — it's solely
a compiler target, and the compiler _will_ always pass a fresh, inline
object. So the only reason to clone the props is if a reserved prop name
is used.

In React 19, `ref` is no longer a reserved prop name, and `key` will
only appear in the props object if it is spread onto the element.
(Because if `key` is statically defined, the compiler will pass it as a
separate argument to the `jsx` function.) So the only remaining reason
to clone the props object is if `key` is spread onto the element, which
is a rare case, and also triggers a warning in development.

In a future release, we will not remove a spread key from the props
object. (But we'll still warn.) We'll always pass the object
straight through.

The expected impact is much faster JSX element creation, which in many
apps is a significant slice of the overall runtime cost of rendering.
@facebook-github-bot facebook-github-bot added CLA Signed React Core Team Opened by a member of the React Core Team labels Apr 5, 2024
@react-sizebot
Copy link

Comparing: bfd8da8...970e6e7

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 = 168.90 kB 168.90 kB = 52.69 kB 52.69 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js = 170.71 kB 170.71 kB = 53.24 kB 53.24 kB
facebook-www/ReactDOM-prod.classic.js = 590.23 kB 590.23 kB = 103.62 kB 103.62 kB
facebook-www/ReactDOM-prod.modern.js = 566.56 kB 566.56 kB = 99.57 kB 99.57 kB
oss-experimental/react/cjs/react-jsx-runtime.profiling.js +18.04% 4.51 kB 5.33 kB +14.50% 2.04 kB 2.33 kB
oss-stable-semver/react/cjs/react-jsx-runtime.profiling.js +18.04% 4.51 kB 5.33 kB +14.50% 2.04 kB 2.33 kB
oss-stable/react/cjs/react-jsx-runtime.profiling.js +18.04% 4.51 kB 5.33 kB +14.50% 2.04 kB 2.33 kB
oss-experimental/react/cjs/react-jsx-runtime.production.js +18.04% 4.51 kB 5.33 kB +14.39% 2.04 kB 2.33 kB
oss-stable-semver/react/cjs/react-jsx-runtime.production.js +18.04% 4.51 kB 5.33 kB +14.39% 2.04 kB 2.33 kB
oss-stable/react/cjs/react-jsx-runtime.production.js +18.04% 4.51 kB 5.33 kB +14.39% 2.04 kB 2.33 kB
oss-experimental/react/cjs/react-jsx-runtime.react-server.production.js +17.79% 4.58 kB 5.39 kB +14.32% 2.05 kB 2.35 kB
oss-stable-semver/react/cjs/react-jsx-runtime.react-server.production.js +17.79% 4.58 kB 5.39 kB +14.32% 2.05 kB 2.35 kB
oss-stable/react/cjs/react-jsx-runtime.react-server.production.js +17.79% 4.58 kB 5.39 kB +14.32% 2.05 kB 2.35 kB
oss-experimental/react/cjs/react-jsx-runtime.profiling.min.js +3.75% 0.67 kB 0.69 kB +3.21% 0.44 kB 0.45 kB
oss-stable-semver/react/cjs/react-jsx-runtime.profiling.min.js +3.75% 0.67 kB 0.69 kB +3.21% 0.44 kB 0.45 kB
oss-stable/react/cjs/react-jsx-runtime.profiling.min.js +3.75% 0.67 kB 0.69 kB +3.21% 0.44 kB 0.45 kB
oss-experimental/react/cjs/react-jsx-runtime.production.min.js +3.74% 0.67 kB 0.69 kB +3.20% 0.44 kB 0.45 kB
oss-stable-semver/react/cjs/react-jsx-runtime.production.min.js +3.74% 0.67 kB 0.69 kB +3.20% 0.44 kB 0.45 kB
oss-stable/react/cjs/react-jsx-runtime.production.min.js +3.74% 0.67 kB 0.69 kB +3.20% 0.44 kB 0.45 kB
oss-experimental/react/cjs/react-jsx-runtime.react-server.production.min.js +3.49% 0.72 kB 0.74 kB +3.32% 0.45 kB 0.47 kB
oss-stable-semver/react/cjs/react-jsx-runtime.react-server.production.min.js +3.49% 0.72 kB 0.74 kB +3.32% 0.45 kB 0.47 kB
oss-stable/react/cjs/react-jsx-runtime.react-server.production.min.js +3.49% 0.72 kB 0.74 kB +3.32% 0.45 kB 0.47 kB
test_utils/ReactAllWarnings.js Deleted 64.04 kB 0.00 kB Deleted 16.02 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
oss-experimental/react/cjs/react-jsx-runtime.profiling.js +18.04% 4.51 kB 5.33 kB +14.50% 2.04 kB 2.33 kB
oss-stable-semver/react/cjs/react-jsx-runtime.profiling.js +18.04% 4.51 kB 5.33 kB +14.50% 2.04 kB 2.33 kB
oss-stable/react/cjs/react-jsx-runtime.profiling.js +18.04% 4.51 kB 5.33 kB +14.50% 2.04 kB 2.33 kB
oss-experimental/react/cjs/react-jsx-runtime.production.js +18.04% 4.51 kB 5.33 kB +14.39% 2.04 kB 2.33 kB
oss-stable-semver/react/cjs/react-jsx-runtime.production.js +18.04% 4.51 kB 5.33 kB +14.39% 2.04 kB 2.33 kB
oss-stable/react/cjs/react-jsx-runtime.production.js +18.04% 4.51 kB 5.33 kB +14.39% 2.04 kB 2.33 kB
oss-experimental/react/cjs/react-jsx-runtime.react-server.production.js +17.79% 4.58 kB 5.39 kB +14.32% 2.05 kB 2.35 kB
oss-stable-semver/react/cjs/react-jsx-runtime.react-server.production.js +17.79% 4.58 kB 5.39 kB +14.32% 2.05 kB 2.35 kB
oss-stable/react/cjs/react-jsx-runtime.react-server.production.js +17.79% 4.58 kB 5.39 kB +14.32% 2.05 kB 2.35 kB
oss-experimental/react/cjs/react-jsx-runtime.profiling.min.js +3.75% 0.67 kB 0.69 kB +3.21% 0.44 kB 0.45 kB
oss-stable-semver/react/cjs/react-jsx-runtime.profiling.min.js +3.75% 0.67 kB 0.69 kB +3.21% 0.44 kB 0.45 kB
oss-stable/react/cjs/react-jsx-runtime.profiling.min.js +3.75% 0.67 kB 0.69 kB +3.21% 0.44 kB 0.45 kB
oss-experimental/react/cjs/react-jsx-runtime.production.min.js +3.74% 0.67 kB 0.69 kB +3.20% 0.44 kB 0.45 kB
oss-stable-semver/react/cjs/react-jsx-runtime.production.min.js +3.74% 0.67 kB 0.69 kB +3.20% 0.44 kB 0.45 kB
oss-stable/react/cjs/react-jsx-runtime.production.min.js +3.74% 0.67 kB 0.69 kB +3.20% 0.44 kB 0.45 kB
oss-experimental/react/cjs/react-jsx-runtime.react-server.production.min.js +3.49% 0.72 kB 0.74 kB +3.32% 0.45 kB 0.47 kB
oss-stable-semver/react/cjs/react-jsx-runtime.react-server.production.min.js +3.49% 0.72 kB 0.74 kB +3.32% 0.45 kB 0.47 kB
oss-stable/react/cjs/react-jsx-runtime.react-server.production.min.js +3.49% 0.72 kB 0.74 kB +3.32% 0.45 kB 0.47 kB
oss-experimental/react/cjs/react-jsx-dev-runtime.development.js +1.93% 40.95 kB 41.74 kB +2.13% 12.33 kB 12.60 kB
oss-stable-semver/react/cjs/react-jsx-dev-runtime.development.js +1.93% 40.95 kB 41.74 kB +2.13% 12.33 kB 12.60 kB
oss-stable/react/cjs/react-jsx-dev-runtime.development.js +1.93% 40.95 kB 41.74 kB +2.13% 12.33 kB 12.60 kB
oss-experimental/react/cjs/react-jsx-runtime.development.js +1.87% 42.18 kB 42.97 kB +2.05% 12.68 kB 12.94 kB
oss-stable-semver/react/cjs/react-jsx-runtime.development.js +1.87% 42.18 kB 42.97 kB +2.05% 12.68 kB 12.94 kB
oss-stable/react/cjs/react-jsx-runtime.development.js +1.87% 42.18 kB 42.97 kB +2.05% 12.68 kB 12.94 kB
oss-experimental/react/cjs/react-jsx-runtime.react-server.development.js +1.87% 42.25 kB 43.04 kB +2.05% 12.70 kB 12.96 kB
oss-stable-semver/react/cjs/react-jsx-runtime.react-server.development.js +1.87% 42.25 kB 43.04 kB +2.05% 12.70 kB 12.96 kB
oss-stable/react/cjs/react-jsx-runtime.react-server.development.js +1.87% 42.25 kB 43.04 kB +2.05% 12.70 kB 12.96 kB
facebook-www/JSXDEVRuntime-dev.classic.js +1.58% 58.58 kB 59.50 kB +1.84% 14.76 kB 15.03 kB
facebook-www/JSXDEVRuntime-dev.modern.js +1.58% 58.61 kB 59.53 kB +1.84% 14.77 kB 15.04 kB
facebook-react-native/react/cjs/JSXRuntime-prod.js +1.04% 2.80 kB 2.83 kB +0.33% 1.22 kB 1.22 kB
facebook-react-native/react/cjs/JSXRuntime-profiling.js +1.04% 2.80 kB 2.83 kB +0.33% 1.22 kB 1.22 kB
facebook-www/ReactServer-dev.modern.js +0.90% 103.24 kB 104.16 kB +1.41% 24.05 kB 24.38 kB
facebook-www/React-dev.modern.js +0.69% 134.14 kB 135.07 kB +1.11% 31.19 kB 31.53 kB
facebook-www/React-dev.classic.js +0.69% 134.69 kB 135.62 kB +1.11% 31.29 kB 31.63 kB
facebook-react-native/react/cjs/JSXDEVRuntime-dev.js +0.37% 55.33 kB 55.54 kB +0.50% 14.10 kB 14.17 kB
facebook-react-native/react/cjs/JSXRuntime-dev.js +0.36% 56.74 kB 56.95 kB +0.49% 14.48 kB 14.55 kB
test_utils/ReactAllWarnings.js Deleted 64.04 kB 0.00 kB Deleted 16.02 kB 0.00 kB

Generated by 🚫 dangerJS against 970e6e7

@acdlite acdlite merged commit d1547de into facebook:main Apr 5, 2024
38 checks passed
github-actions bot pushed a commit that referenced this pull request Apr 5, 2024
(Unless "key" is spread onto the element.)

Historically, the JSX runtime clones the props object that is passed in.
We've done this for two reasons.

One reason is that there are certain prop names that are reserved by
React, like `key` and (before React 19) `ref`. These are not actual
props and are not observable by the target component; React uses them
internally but removes them from the props object before passing them to
userspace.

The second reason is that the classic JSX runtime, `createElement`, is
both a compiler target _and_ a public API that can be called manually.
Therefore, we can't assume that the props object that is passed into
`createElement` won't be mutated by userspace code after it is passed
in.

However, the new JSX runtime, `jsx`, is not a public API — it's solely a
compiler target, and the compiler _will_ always pass a fresh, inline
object. So the only reason to clone the props is if a reserved prop name
is used.

In React 19, `ref` is no longer a reserved prop name, and `key` will
only appear in the props object if it is spread onto the element.
(Because if `key` is statically defined, the compiler will pass it as a
separate argument to the `jsx` function.) So the only remaining reason
to clone the props object is if `key` is spread onto the element, which
is a rare case, and also triggers a warning in development.

In a future release, we will not remove a spread key from the props
object. (But we'll still warn.) We'll always pass the object straight
through.

The expected impact is much faster JSX element creation, which in many
apps is a significant slice of the overall runtime cost of rendering.

DiffTrain build for [d1547de](d1547de)
acdlite added a commit to acdlite/react that referenced this pull request Apr 6, 2024
Follow up to facebook#28768.

The modern JSX runtime (`jsx`) does not need to check if each prop is
a direct property with `hasOwnProperty` because the compiler always
passes a plain object.

I'll leave the check in the old JSX runtime (`createElement`) since that
one can be called manually with any kind of object, and if there were
old user code that relied on this for some reason, it would be using
that runtime.
acdlite added a commit that referenced this pull request Apr 8, 2024
Follow up to #28768.

The modern JSX runtime (`jsx`) does not need to check if each prop is a
direct property with `hasOwnProperty` because the compiler always passes
a plain object.

I'll leave the check in the old JSX runtime (`createElement`) since that
one can be called manually with any kind of object, and if there were
old user code that relied on this for some reason, it would be using
that runtime.
github-actions bot pushed a commit that referenced this pull request Apr 8, 2024
Follow up to #28768.

The modern JSX runtime (`jsx`) does not need to check if each prop is a
direct property with `hasOwnProperty` because the compiler always passes
a plain object.

I'll leave the check in the old JSX runtime (`createElement`) since that
one can be called manually with any kind of object, and if there were
old user code that relied on this for some reason, it would be using
that runtime.

DiffTrain build for [0b3b8a6](0b3b8a6)
rickhanlonii pushed a commit that referenced this pull request Apr 11, 2024
(Unless "key" is spread onto the element.)

Historically, the JSX runtime clones the props object that is passed in.
We've done this for two reasons.

One reason is that there are certain prop names that are reserved by
React, like `key` and (before React 19) `ref`. These are not actual
props and are not observable by the target component; React uses them
internally but removes them from the props object before passing them to
userspace.

The second reason is that the classic JSX runtime, `createElement`, is
both a compiler target _and_ a public API that can be called manually.
Therefore, we can't assume that the props object that is passed into
`createElement` won't be mutated by userspace code after it is passed
in.

However, the new JSX runtime, `jsx`, is not a public API — it's solely a
compiler target, and the compiler _will_ always pass a fresh, inline
object. So the only reason to clone the props is if a reserved prop name
is used.

In React 19, `ref` is no longer a reserved prop name, and `key` will
only appear in the props object if it is spread onto the element.
(Because if `key` is statically defined, the compiler will pass it as a
separate argument to the `jsx` function.) So the only remaining reason
to clone the props object is if `key` is spread onto the element, which
is a rare case, and also triggers a warning in development.

In a future release, we will not remove a spread key from the props
object. (But we'll still warn.) We'll always pass the object straight
through.

The expected impact is much faster JSX element creation, which in many
apps is a significant slice of the overall runtime cost of rendering.
rickhanlonii pushed a commit that referenced this pull request Apr 11, 2024
Follow up to #28768.

The modern JSX runtime (`jsx`) does not need to check if each prop is a
direct property with `hasOwnProperty` because the compiler always passes
a plain object.

I'll leave the check in the old JSX runtime (`createElement`) since that
one can be called manually with any kind of object, and if there were
old user code that relied on this for some reason, it would be using
that runtime.
rickhanlonii pushed a commit that referenced this pull request Apr 11, 2024
(Unless "key" is spread onto the element.)

Historically, the JSX runtime clones the props object that is passed in.
We've done this for two reasons.

One reason is that there are certain prop names that are reserved by
React, like `key` and (before React 19) `ref`. These are not actual
props and are not observable by the target component; React uses them
internally but removes them from the props object before passing them to
userspace.

The second reason is that the classic JSX runtime, `createElement`, is
both a compiler target _and_ a public API that can be called manually.
Therefore, we can't assume that the props object that is passed into
`createElement` won't be mutated by userspace code after it is passed
in.

However, the new JSX runtime, `jsx`, is not a public API — it's solely a
compiler target, and the compiler _will_ always pass a fresh, inline
object. So the only reason to clone the props is if a reserved prop name
is used.

In React 19, `ref` is no longer a reserved prop name, and `key` will
only appear in the props object if it is spread onto the element.
(Because if `key` is statically defined, the compiler will pass it as a
separate argument to the `jsx` function.) So the only remaining reason
to clone the props object is if `key` is spread onto the element, which
is a rare case, and also triggers a warning in development.

In a future release, we will not remove a spread key from the props
object. (But we'll still warn.) We'll always pass the object straight
through.

The expected impact is much faster JSX element creation, which in many
apps is a significant slice of the overall runtime cost of rendering.
rickhanlonii pushed a commit that referenced this pull request Apr 11, 2024
Follow up to #28768.

The modern JSX runtime (`jsx`) does not need to check if each prop is a
direct property with `hasOwnProperty` because the compiler always passes
a plain object.

I'll leave the check in the old JSX runtime (`createElement`) since that
one can be called manually with any kind of object, and if there were
old user code that relied on this for some reason, it would be using
that runtime.
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
(Unless "key" is spread onto the element.)

Historically, the JSX runtime clones the props object that is passed in.
We've done this for two reasons.

One reason is that there are certain prop names that are reserved by
React, like `key` and (before React 19) `ref`. These are not actual
props and are not observable by the target component; React uses them
internally but removes them from the props object before passing them to
userspace.

The second reason is that the classic JSX runtime, `createElement`, is
both a compiler target _and_ a public API that can be called manually.
Therefore, we can't assume that the props object that is passed into
`createElement` won't be mutated by userspace code after it is passed
in.

However, the new JSX runtime, `jsx`, is not a public API — it's solely a
compiler target, and the compiler _will_ always pass a fresh, inline
object. So the only reason to clone the props is if a reserved prop name
is used.

In React 19, `ref` is no longer a reserved prop name, and `key` will
only appear in the props object if it is spread onto the element.
(Because if `key` is statically defined, the compiler will pass it as a
separate argument to the `jsx` function.) So the only remaining reason
to clone the props object is if `key` is spread onto the element, which
is a rare case, and also triggers a warning in development.

In a future release, we will not remove a spread key from the props
object. (But we'll still warn.) We'll always pass the object straight
through.

The expected impact is much faster JSX element creation, which in many
apps is a significant slice of the overall runtime cost of rendering.
EdisonVan pushed a commit to EdisonVan/react that referenced this pull request Apr 15, 2024
Follow up to facebook#28768.

The modern JSX runtime (`jsx`) does not need to check if each prop is a
direct property with `hasOwnProperty` because the compiler always passes
a plain object.

I'll leave the check in the old JSX runtime (`createElement`) since that
one can be called manually with any kind of object, and if there were
old user code that relied on this for some reason, it would be using
that runtime.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
(Unless "key" is spread onto the element.)

Historically, the JSX runtime clones the props object that is passed in.
We've done this for two reasons.

One reason is that there are certain prop names that are reserved by
React, like `key` and (before React 19) `ref`. These are not actual
props and are not observable by the target component; React uses them
internally but removes them from the props object before passing them to
userspace.

The second reason is that the classic JSX runtime, `createElement`, is
both a compiler target _and_ a public API that can be called manually.
Therefore, we can't assume that the props object that is passed into
`createElement` won't be mutated by userspace code after it is passed
in.

However, the new JSX runtime, `jsx`, is not a public API — it's solely a
compiler target, and the compiler _will_ always pass a fresh, inline
object. So the only reason to clone the props is if a reserved prop name
is used.

In React 19, `ref` is no longer a reserved prop name, and `key` will
only appear in the props object if it is spread onto the element.
(Because if `key` is statically defined, the compiler will pass it as a
separate argument to the `jsx` function.) So the only remaining reason
to clone the props object is if `key` is spread onto the element, which
is a rare case, and also triggers a warning in development.

In a future release, we will not remove a spread key from the props
object. (But we'll still warn.) We'll always pass the object straight
through.

The expected impact is much faster JSX element creation, which in many
apps is a significant slice of the overall runtime cost of rendering.

DiffTrain build for commit d1547de.
bigfootjon pushed a commit that referenced this pull request Apr 18, 2024
Follow up to #28768.

The modern JSX runtime (`jsx`) does not need to check if each prop is a
direct property with `hasOwnProperty` because the compiler always passes
a plain object.

I'll leave the check in the old JSX runtime (`createElement`) since that
one can be called manually with any kind of object, and if there were
old user code that relied on this for some reason, it would be using
that runtime.

DiffTrain build for commit 0b3b8a6.
facebook-github-bot pushed a commit to facebook/react-native that referenced this pull request Apr 19, 2024
Summary:
This sync includes the changes from:
- D56103750
- [TODO] A shim for SECRET_INTERNALS

This sync includes the following changes:
- **[b5e5ce8e0](facebook/react@b5e5ce8e0 )**: Update ReactNativeTypes for root options (part 2) ([#28857](facebook/react#28857)) //<Ricky>//
- **[da6ba53b1](facebook/react@da6ba53b1 )**: [UMD] Remove umd builds ([#28735](facebook/react#28735)) //<Josh Story>//
- **[0c245df1d](facebook/react@0c245df1d )**: Complete the typo fix ([#28856](facebook/react#28856)) //<Sebastian Silbermann>//
- **[f82051d7a](facebook/react@f82051d7a )**: console test utils fix: match entire string, not just first letter ([#28855](facebook/react#28855)) //<Andrew Clark>//
- **[4ca20fd36](facebook/react@4ca20fd36 )**: Test top level fragment inside lazy semantics ([#28852](facebook/react#28852)) //<Sebastian Markbåge>//
- **[c0cf7c696](facebook/react@c0cf7c696 )**: Promote ASYNC_ITERATOR symbol to React Symbols ([#28851](facebook/react#28851)) //<Sebastian Markbåge>//
- **[657428a9e](facebook/react@657428a9e )**: Add ReactNativeTypes for root options ([#28850](facebook/react#28850)) //<Ricky>//
- **[7909d8eab](facebook/react@7909d8eab )**: [Flight] Encode ReadableStream and AsyncIterables ([#28847](facebook/react#28847)) //<Sebastian Markbåge>//
- **[13eb61d05](facebook/react@13eb61d05 )**: Move enableUseDeferredValueInitialArg to canary ([#28818](facebook/react#28818)) //<Andrew Clark>//
- **[8afa144bd](facebook/react@8afa144bd )**: Enable flag disableClientCache ([#28846](facebook/react#28846)) //<Jan Kassens>//
- **[734956ace](facebook/react@734956ace )**: Devtools: Add support for useFormStatus ([#28413](facebook/react#28413)) //<Sebastian Silbermann>//
- **[17e920c00](facebook/react@17e920c00 )**: [Flight Reply] Encode Typed Arrays and Blobs ([#28819](facebook/react#28819)) //<Sebastian Markbåge>//
- **[0347fcd00](facebook/react@0347fcd00 )**: Add on(Caught|Uncaught|Recoverable) opts to RN ([#28836](facebook/react#28836)) //<Ricky>//
- **[c113503ad](facebook/react@c113503ad )**: Flush direct streams in Bun ([#28837](facebook/react#28837)) //<Kenta Iwasaki>//
- **[9defcd56b](facebook/react@9defcd56b )**: Remove redundant props assign ([#28829](facebook/react#28829)) //<Sebastian Silbermann>//
- **[ed4023603](facebook/react@ed4023603 )**: Fix mistaken "react-server" condition ([#28835](facebook/react#28835)) //<Sebastian Markbåge>//
- **[c8a035036](facebook/react@c8a035036 )**: [Fizz] hoistables should never flush before the preamble ([#28802](facebook/react#28802)) //<Josh Story>//
- **[4f5c812a3](facebook/react@4f5c812a3 )**: DevTools: Rely on sourcemaps to compute hook name of built-in hooks in newer versions ([#28593](facebook/react#28593)) //<Sebastian Silbermann>//
- **[435415962](facebook/react@435415962 )**: Backwards compatibility for string refs on WWW ([#28826](facebook/react#28826)) //<Jack Pope>//
- **[608edcc90](facebook/react@608edcc90 )**: [tests] add `assertConsole<method>Dev` helpers ([#28732](facebook/react#28732)) //<Ricky>//
- **[da69b6af9](facebook/react@da69b6af9 )**: ReactDOM.requestFormReset  ([#28809](facebook/react#28809)) //<Andrew Clark>//
- **[374b5d26c](facebook/react@374b5d26c )**: Scaffolding for requestFormReset API ([#28808](facebook/react#28808)) //<Andrew Clark>//
- **[41950d14a](facebook/react@41950d14a )**: Automatically reset forms after action finishes ([#28804](facebook/react#28804)) //<Andrew Clark>//
- **[dc6a7e01e](facebook/react@dc6a7e01e )**: [Float] Don't preload images inside `<noscript>` ([#28815](facebook/react#28815)) //<Josh Story>//
- **[3f947b1b4](facebook/react@3f947b1b4 )**: [tests] Assert scheduler log empty in internalAct ([#28737](facebook/react#28737)) //<Ricky>//
- **[bf09089f6](facebook/react@bf09089f6 )**: Remove Scheduler.log from ReactSuspenseFuzz-test ([#28812](facebook/react#28812)) //<Ricky>//
- **[84cb3b4cb](facebook/react@84cb3b4cb )**: Hardcode disableIEWorkarounds for www ([#28811](facebook/react#28811)) //<Ricky>//
- **[2243b40ab](facebook/react@2243b40ab )**: [tests] assertLog before act in useEffectEvent ([#28763](facebook/react#28763)) //<Ricky>//
- **[dfc64c6e3](facebook/react@dfc64c6e3 )**: [tests] assertLog before act in ReactUse ([#28762](facebook/react#28762)) //<Ricky>//
- **[42eff4bc7](facebook/react@42eff4bc7 )**: [tests] Fix assertions not flushed before act ([#28745](facebook/react#28745)) //<Ricky>//
- **[ed3c65caf](facebook/react@ed3c65caf )**: Warn if outdated JSX transform is detected ([#28781](facebook/react#28781)) //<Andrew Clark>//
- **[3f9e237a2](facebook/react@3f9e237a2 )**: Fix: Suspend while recovering from hydration error ([#28800](facebook/react#28800)) //<Andrew Clark>//
- **[7f5d25e23](facebook/react@7f5d25e23 )**: Fix cloneElement using string ref w no owner ([#28797](facebook/react#28797)) //<Joseph Savona>//
- **[bf40b0244](facebook/react@bf40b0244 )**: [Fizz] Stop publishing external-runtime to stable channel ([#28796](facebook/react#28796)) //<Josh Story>//
- **[7f93cb41c](facebook/react@7f93cb41c )**: [DOM] Infer react-server entries bundles if not explicitly configured ([#28795](facebook/react#28795)) //<Josh Story>//
- **[f61316535](facebook/react@f61316535 )**: Rename SECRET INTERNALS to `__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE` ([#28789](facebook/react#28789)) //<Sebastian Markbåge>//
- **[9644d206e](facebook/react@9644d206e )**: Soften useFormState warning ([#28788](facebook/react#28788)) //<Ricky>//
- **[c771016e1](facebook/react@c771016e1 )**: Rename The Secret Export of Server Internals ([#28786](facebook/react#28786)) //<Sebastian Markbåge>//
- **[d50323eb8](facebook/react@d50323eb8 )**: Flatten ReactSharedInternals ([#28783](facebook/react#28783)) //<Sebastian Markbåge>//
- **[f62cf8c62](facebook/react@f62cf8c62 )**: [Float] treat `props.async` in Float consistent with the rest of react-dom ([#26760](facebook/react#26760)) //<Josh Story>//
- **[dfd3d5af8](facebook/react@dfd3d5af8 )**: Add support for transition{run,start,cancel} events ([#27345](facebook/react#27345)) //<Hugo Sales>//
- **[1f8327f83](facebook/react@1f8327f83 )**: [Fiber] Use real event priority for hydration scheduling ([#28765](facebook/react#28765)) //<Josh Story>//
- **[97c90ed88](facebook/react@97c90ed88 )**: [DOM] Shrink ReactDOMCurrentDispatcher method names ([#28770](facebook/react#28770)) //<Josh Story>//
- **[9007fdc8f](facebook/react@9007fdc8f )**: [DOM] Shrink ReactDOMSharedInternals source representation ([#28771](facebook/react#28771)) //<Josh Story>//
- **[14f50ad15](facebook/react@14f50ad15 )**: [Flight] Allow lazily resolving outlined models ([#28780](facebook/react#28780)) //<Sebastian Markbåge>//
- **[4c12339ce](facebook/react@4c12339ce )**: [DOM] move `flushSync` out of the reconciler ([#28500](facebook/react#28500)) //<Josh Story>//
- **[8e1462e8c](facebook/react@8e1462e8c )**: [Fiber] Move updatePriority tracking to renderers ([#28751](facebook/react#28751)) //<Josh Story>//
- **[0b3b8a6a3](facebook/react@0b3b8a6a3 )**: jsx: Remove unnecessary hasOwnProperty check ([#28775](facebook/react#28775)) //<Andrew Clark>//
- **[2acfb7b60](facebook/react@2acfb7b60 )**: [Flight] Support FormData from Server to Client ([#28754](facebook/react#28754)) //<Sebastian Markbåge>//
- **[d1547defe](facebook/react@d1547defe )**: Fast JSX: Don't clone props object ([#28768](facebook/react#28768)) //<Andrew Clark>//
- **[bfd8da807](facebook/react@bfd8da807 )**: Make class prop resolution faster ([#28766](facebook/react#28766)) //<Andrew Clark>//
- **[cbb6f2b54](facebook/react@cbb6f2b54 )**: [Flight] Support Blobs from Server to Client ([#28755](facebook/react#28755)) //<Sebastian Markbåge>//
- **[f33a6b69c](facebook/react@f33a6b69c )**: Track Owner for Server Components in DEV ([#28753](facebook/react#28753)) //<Sebastian Markbåge>//
- **[e3ebcd54b](facebook/react@e3ebcd54b )**: Move string ref coercion to JSX runtime ([#28473](facebook/react#28473)) //<Andrew Clark>//
- **[fd0da3eef](facebook/react@fd0da3eef )**: Remove _owner field from JSX elements in prod if string refs are disabled ([#28739](facebook/react#28739)) //<Sebastian Markbåge>//

Changelog:
[General][Changed] - React Native sync for revisions 48b4ecc...b5e5ce8

jest_e2e[run_all_tests]
bypass-github-export-checks

Reviewed By: kassens

Differential Revision: D56251607

fbshipit-source-id: e16db2fa101fc7ed1e009158c76388206beabd5f
jackpope added a commit that referenced this pull request May 3, 2024
Following #28768, add a path to testing Fast JSX on www.

We want to measure the impact of Fast JSX and enable a path to testing
before string refs are completely removed in www (which is a work in
progress).

Without `disableStringRefs`, we need to copy any object with a `ref` key
so we can pass it through `coerceStringRef()` and copy it into the
object. This de-opt path is what is gated behind
`enableFastJSXWithStringRefs`.

The additional checks should have no perf impact in OSS as the flags
remain true there and the build output is not changed. For www, I've
benchmarked the addition of the boolean checks with values cached at
module scope. There is no significant change observed from our
benchmarks and any latency will apply to test and control branches
evenly. This added experiment complexity is temporary. We should be able
to clean it up, along with the flag checks for `enableRefAsProp` and
`disableStringRefs` shortly.
github-actions bot pushed a commit that referenced this pull request May 3, 2024
Following #28768, add a path to testing Fast JSX on www.

We want to measure the impact of Fast JSX and enable a path to testing
before string refs are completely removed in www (which is a work in
progress).

Without `disableStringRefs`, we need to copy any object with a `ref` key
so we can pass it through `coerceStringRef()` and copy it into the
object. This de-opt path is what is gated behind
`enableFastJSXWithStringRefs`.

The additional checks should have no perf impact in OSS as the flags
remain true there and the build output is not changed. For www, I've
benchmarked the addition of the boolean checks with values cached at
module scope. There is no significant change observed from our
benchmarks and any latency will apply to test and control branches
evenly. This added experiment complexity is temporary. We should be able
to clean it up, along with the flag checks for `enableRefAsProp` and
`disableStringRefs` shortly.

DiffTrain build for [1beb73d](1beb73d)
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