Skip to content

Conversation

sebmarkbage
Copy link
Collaborator

@sebmarkbage sebmarkbage commented Jun 27, 2025

Screenshot 2025-06-27 at 1 13 20 PM

We have to be careful with performance in DEV. It can slow down DX since these are ran whether you're currently running a performance trace or not. It can also show up as misleading since these add time to the "Remaining Effects" entry.

I'm not adding all props to the entries. Instead, I'm only adding the changed props after diffing and none for initial mount. I'm trying to as much as possible pick a fast path when possible. I'm also only logging this for the "render" entries and not the effects. If we did something for effects, it would be more like checking with dep changed.

This could still have a negative effect on dev performance since we're now also using the slower performance.measure API when there's a diff.

We limit this to emitting the smallest change and none at all if there's
no change and initial render to keep up performance.
It lines up a bit better with the non-monospaced font used by Chrome.

Also, use figure space for the unchanged case to make it line up.
@github-actions github-actions bot added the React Core Team Opened by a member of the React Core Team label Jun 27, 2025
@react-sizebot
Copy link

Comparing: d92056e...4a46d07

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 +0.05% 1.83 kB 1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js = 530.57 kB 530.57 kB = 93.67 kB 93.67 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.66 kB 651.66 kB = 114.78 kB 114.78 kB
facebook-www/ReactDOM-prod.classic.js = 674.81 kB 674.81 kB = 118.78 kB 118.78 kB
facebook-www/ReactDOM-prod.modern.js = 665.30 kB 665.30 kB = 117.20 kB 117.20 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js = 204.90 kB 200.34 kB = 37.27 kB 36.68 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js = 204.84 kB 200.29 kB = 37.25 kB 36.66 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js = 203.69 kB 199.14 kB = 36.97 kB 36.37 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js = 196.92 kB 192.30 kB = 35.86 kB 35.25 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js = 190.95 kB 186.44 kB = 35.20 kB 34.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js = 184.14 kB 179.59 kB = 33.44 kB 32.90 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js = 184.07 kB 179.52 kB = 33.43 kB 32.89 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js = 180.52 kB 175.97 kB = 33.04 kB 32.47 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js = 183.14 kB 178.52 kB = 33.03 kB 32.48 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js = 183.14 kB 178.52 kB = 33.03 kB 32.48 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js = 183.09 kB 178.47 kB = 33.01 kB 32.46 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js = 183.09 kB 178.47 kB = 33.01 kB 32.46 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js = 179.98 kB 175.43 kB = 32.91 kB 32.33 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js = 181.94 kB 177.32 kB = 32.73 kB 32.18 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js = 181.94 kB 177.32 kB = 32.73 kB 32.18 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js = 176.26 kB 171.64 kB = 32.08 kB 31.50 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js = 175.42 kB 170.80 kB = 31.92 kB 31.35 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js = 175.42 kB 170.80 kB = 31.92 kB 31.35 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js = 175.35 kB 170.74 kB = 31.90 kB 31.33 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js = 175.35 kB 170.74 kB = 31.90 kB 31.33 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js = 175.17 kB 170.48 kB = 31.68 kB 31.09 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js = 175.17 kB 170.48 kB = 31.68 kB 31.09 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js = 172.21 kB 167.59 kB = 31.58 kB 30.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js = 172.16 kB 167.54 kB = 31.48 kB 30.95 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js = 172.16 kB 167.54 kB = 31.48 kB 30.95 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js = 171.62 kB 167.00 kB = 31.36 kB 30.81 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js = 171.62 kB 167.00 kB = 31.36 kB 30.81 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js = 169.20 kB 164.62 kB = 31.02 kB 30.49 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js = 169.20 kB 164.62 kB = 31.02 kB 30.49 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js = 167.54 kB 162.86 kB = 30.57 kB 29.95 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js = 167.54 kB 162.86 kB = 30.57 kB 29.95 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js = 163.84 kB 159.16 kB = 30.02 kB 29.45 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js = 163.84 kB 159.16 kB = 30.02 kB 29.45 kB
oss-experimental/react-server/cjs/react-server-flight.development.js = 131.84 kB 127.30 kB = 23.98 kB 23.37 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js = 123.49 kB 118.89 kB = 22.43 kB 21.88 kB
oss-stable/react-server/cjs/react-server-flight.development.js = 123.49 kB 118.89 kB = 22.43 kB 21.88 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-art/cjs/react-art.development.js +0.62% 682.96 kB 687.18 kB +0.86% 107.77 kB 108.69 kB
facebook-www/ReactART-dev.modern.js +0.58% 727.75 kB 731.97 kB +0.86% 113.20 kB 114.18 kB
react-native/implementations/ReactFabric-dev.fb.js +0.58% 731.16 kB 735.38 kB +0.76% 116.27 kB 117.15 kB
facebook-www/ReactART-dev.classic.js +0.57% 737.24 kB 741.46 kB +0.86% 114.96 kB 115.95 kB
react-native/implementations/ReactNativeRenderer-dev.fb.js +0.57% 742.34 kB 746.56 kB +0.73% 117.89 kB 118.75 kB
oss-experimental/react-reconciler/cjs/react-reconciler.development.js +0.52% 810.61 kB 814.83 kB +0.73% 126.51 kB 127.43 kB
facebook-www/ReactReconciler-dev.modern.js +0.50% 844.53 kB 848.75 kB +0.69% 131.09 kB 131.98 kB
facebook-www/ReactReconciler-dev.classic.js +0.49% 853.73 kB 857.96 kB +0.67% 132.84 kB 133.73 kB
facebook-react-native/react-dom/cjs/ReactDOMClient-dev.js +0.37% 1,101.29 kB 1,105.36 kB +0.49% 182.44 kB 183.34 kB
facebook-react-native/react-dom/cjs/ReactDOMProfiling-dev.js +0.36% 1,117.56 kB 1,121.63 kB +0.50% 185.22 kB 186.16 kB
facebook-www/ReactDOM-dev.modern.js +0.35% 1,224.00 kB 1,228.23 kB +0.45% 202.28 kB 203.19 kB
oss-experimental/react-dom/cjs/react-dom-client.development.js +0.34% 1,182.01 kB 1,186.08 kB +0.48% 197.00 kB 197.94 kB
facebook-www/ReactDOM-dev.classic.js +0.34% 1,233.15 kB 1,237.37 kB +0.45% 204.01 kB 204.93 kB
facebook-www/ReactDOMTesting-dev.modern.js +0.34% 1,240.54 kB 1,244.76 kB +0.43% 205.99 kB 206.88 kB
oss-experimental/react-dom/cjs/react-dom-profiling.development.js +0.34% 1,198.39 kB 1,202.46 kB +0.47% 199.84 kB 200.78 kB
oss-experimental/react-dom/cjs/react-dom-unstable_testing.development.js +0.34% 1,198.55 kB 1,202.62 kB +0.46% 200.70 kB 201.63 kB
facebook-www/ReactDOMTesting-dev.classic.js +0.34% 1,249.68 kB 1,253.90 kB +0.44% 207.66 kB 208.58 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js = 140.74 kB 140.35 kB = 32.95 kB 32.86 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js = 140.72 kB 140.32 kB = 32.92 kB 32.84 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js = 114.70 kB 114.26 kB = 21.23 kB 21.08 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js = 114.70 kB 114.26 kB = 21.23 kB 21.08 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js = 113.37 kB 112.93 kB = 20.98 kB 20.83 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js = 113.37 kB 112.93 kB = 20.98 kB 20.83 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js = 111.01 kB 110.57 kB = 20.75 kB 20.60 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js = 111.01 kB 110.57 kB = 20.75 kB 20.60 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js = 110.02 kB 109.58 kB = 20.64 kB 20.48 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js = 110.02 kB 109.58 kB = 20.64 kB 20.48 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js = 109.93 kB 109.49 kB = 20.60 kB 20.44 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js = 109.93 kB 109.49 kB = 20.60 kB 20.44 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js = 108.09 kB 107.65 kB = 20.25 kB 20.11 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js = 108.09 kB 107.65 kB = 20.25 kB 20.11 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js = 106.83 kB 106.39 kB = 20.12 kB 19.97 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js = 106.83 kB 106.39 kB = 20.12 kB 19.97 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js = 105.54 kB 105.10 kB = 19.80 kB 19.65 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js = 105.54 kB 105.10 kB = 19.80 kB 19.65 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js = 104.29 kB 103.84 kB = 19.63 kB 19.51 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js = 104.24 kB 103.79 kB = 19.61 kB 19.48 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js = 103.73 kB 103.29 kB = 19.49 kB 19.37 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js = 103.68 kB 103.24 kB = 19.47 kB 19.34 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js = 102.65 kB 102.21 kB = 19.12 kB 19.01 kB
oss-stable/react-client/cjs/react-client-flight.development.js = 102.61 kB 102.17 kB = 18.75 kB 18.64 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js = 102.60 kB 102.16 kB = 19.10 kB 18.99 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js = 102.59 kB 102.15 kB = 18.73 kB 18.62 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js = 101.54 kB 101.10 kB = 19.10 kB 18.98 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js = 101.49 kB 101.05 kB = 19.08 kB 18.95 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js = 624.67 kB 619.17 kB = 110.46 kB 109.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js = 204.90 kB 200.34 kB = 37.27 kB 36.68 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js = 204.84 kB 200.29 kB = 37.25 kB 36.66 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js = 203.69 kB 199.14 kB = 36.97 kB 36.37 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js = 196.92 kB 192.30 kB = 35.86 kB 35.25 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js = 190.95 kB 186.44 kB = 35.20 kB 34.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js = 184.14 kB 179.59 kB = 33.44 kB 32.90 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js = 184.07 kB 179.52 kB = 33.43 kB 32.89 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js = 180.52 kB 175.97 kB = 33.04 kB 32.47 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js = 183.14 kB 178.52 kB = 33.03 kB 32.48 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js = 183.14 kB 178.52 kB = 33.03 kB 32.48 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js = 183.09 kB 178.47 kB = 33.01 kB 32.46 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js = 183.09 kB 178.47 kB = 33.01 kB 32.46 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js = 179.98 kB 175.43 kB = 32.91 kB 32.33 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js = 181.94 kB 177.32 kB = 32.73 kB 32.18 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js = 181.94 kB 177.32 kB = 32.73 kB 32.18 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js = 176.26 kB 171.64 kB = 32.08 kB 31.50 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js = 175.42 kB 170.80 kB = 31.92 kB 31.35 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js = 175.42 kB 170.80 kB = 31.92 kB 31.35 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js = 175.35 kB 170.74 kB = 31.90 kB 31.33 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js = 175.35 kB 170.74 kB = 31.90 kB 31.33 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js = 175.17 kB 170.48 kB = 31.68 kB 31.09 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js = 175.17 kB 170.48 kB = 31.68 kB 31.09 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js = 172.21 kB 167.59 kB = 31.58 kB 30.99 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js = 172.16 kB 167.54 kB = 31.48 kB 30.95 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js = 172.16 kB 167.54 kB = 31.48 kB 30.95 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js = 171.62 kB 167.00 kB = 31.36 kB 30.81 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js = 171.62 kB 167.00 kB = 31.36 kB 30.81 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js = 169.20 kB 164.62 kB = 31.02 kB 30.49 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js = 169.20 kB 164.62 kB = 31.02 kB 30.49 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js = 167.54 kB 162.86 kB = 30.57 kB 29.95 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js = 167.54 kB 162.86 kB = 30.57 kB 29.95 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js = 163.84 kB 159.16 kB = 30.02 kB 29.45 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js = 163.84 kB 159.16 kB = 30.02 kB 29.45 kB
oss-experimental/react-server/cjs/react-server-flight.development.js = 131.84 kB 127.30 kB = 23.98 kB 23.37 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js = 123.49 kB 118.89 kB = 22.43 kB 21.88 kB
oss-stable/react-server/cjs/react-server-flight.development.js = 123.49 kB 118.89 kB = 22.43 kB 21.88 kB

Generated by 🚫 dangerJS against 4a46d07

Copy link
Collaborator

@eps1lon eps1lon left a comment

Choose a reason for hiding this comment

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

Didn't notice any slowdown in fixtures/ownerstacks when clicking "toggle highlight".

fixtures/owner stacks has 200/400ms timing logged when you click "toggle highlight" when not profiling. This jumps to 900ms while profiling. These are the same timings you get on main.

If the diffing is an issue, we could tie it to the "Record why each component rendered while profiling." setting in React DevTools

@sebmarkbage sebmarkbage merged commit e104795 into facebook:main Jul 2, 2025
247 checks passed
sebmarkbage added a commit that referenced this pull request Jul 2, 2025
…3659)

Stacked on #33658.

Unfortunately `console.timeStamp` has the same bug that
`performance.measure` used to have where equal start/end times stack in
call order instead of reverse call-order. We rely on that in general so
we should really switch back all.

But there is one case in particular where we always add the same
start/time and that's for the "triggers" -
Mount/Unmount/Reconnect/Disconnect. Switching to `console.timeStamp`
broke this because they now showed below the thing that mounted.

After:

<img width="726" alt="Screenshot 2025-06-27 at 3 31 16 PM"
src="https://github.com/user-attachments/assets/422341c8-bef6-4909-9403-933d76b71508"
/>

Also fixed a bug where clamped update times could end up logging zero
width entries that stacked up on top of each other causing a two row
scheduler lane which should always be one row.
sebmarkbage added a commit that referenced this pull request Jul 2, 2025
…nce Track (#33660)

Stacked on #33658 and #33659.

If we detect that a component is receiving only deeply equal objects,
then we highlight it as potentially problematic and worth looking into.

<img width="1055" alt="Screenshot 2025-06-27 at 4 15 28 PM"
src="https://github.com/user-attachments/assets/e96c6a05-7fff-4fd7-b59a-36ed79f8e609"
/>

It's fairly conservative and can bail out for a number of reasons:

- We only log it on the first parent that triggered this case since
other children could be indirect causes.
- If children has changed then we bail out since this component will
rerender anyway. This means that it won't warn for a lot of cases that
receive plain DOM children since the DOM children won't themselves get
logged.
- If the component's total render time including children is 100ms or
less then we skip warning because rerendering might not be a big deal.
- We don't warn if you have shallow equality but could memoize the JSX
element itself since we don't typically recommend that and React
Compiler doesn't do that. It only warns if you have nested objects too.
- If the depth of the objects is deeper than like the 3 levels that we
print diffs for then we wouldn't warn since we don't know if they were
equal (although we might still warn on a child).
- If the component had any updates scheduled on itself (e.g. setState)
then we don't warn since it would rerender anyway. This should really
consider Context updates too but we don't do that atm. Technically you
should still memoize the incoming props even if you also had unrelated
updates since it could apply to deeper bailouts.
github-actions bot pushed a commit that referenced this pull request Jul 2, 2025
…nce Track (#33660)

Stacked on #33658 and #33659.

If we detect that a component is receiving only deeply equal objects,
then we highlight it as potentially problematic and worth looking into.

<img width="1055" alt="Screenshot 2025-06-27 at 4 15 28 PM"
src="https://github.com/user-attachments/assets/e96c6a05-7fff-4fd7-b59a-36ed79f8e609"
/>

It's fairly conservative and can bail out for a number of reasons:

- We only log it on the first parent that triggered this case since
other children could be indirect causes.
- If children has changed then we bail out since this component will
rerender anyway. This means that it won't warn for a lot of cases that
receive plain DOM children since the DOM children won't themselves get
logged.
- If the component's total render time including children is 100ms or
less then we skip warning because rerendering might not be a big deal.
- We don't warn if you have shallow equality but could memoize the JSX
element itself since we don't typically recommend that and React
Compiler doesn't do that. It only warns if you have nested objects too.
- If the depth of the objects is deeper than like the 3 levels that we
print diffs for then we wouldn't warn since we don't know if they were
equal (although we might still warn on a child).
- If the component had any updates scheduled on itself (e.g. setState)
then we don't warn since it would rerender anyway. This should really
consider Context updates too but we don't do that atm. Technically you
should still memoize the incoming props even if you also had unrelated
updates since it could apply to deeper bailouts.

DiffTrain build for [0b78161](0b78161)
github-actions bot pushed a commit that referenced this pull request Jul 2, 2025
…nce Track (#33660)

Stacked on #33658 and #33659.

If we detect that a component is receiving only deeply equal objects,
then we highlight it as potentially problematic and worth looking into.

<img width="1055" alt="Screenshot 2025-06-27 at 4 15 28 PM"
src="https://github.com/user-attachments/assets/e96c6a05-7fff-4fd7-b59a-36ed79f8e609"
/>

It's fairly conservative and can bail out for a number of reasons:

- We only log it on the first parent that triggered this case since
other children could be indirect causes.
- If children has changed then we bail out since this component will
rerender anyway. This means that it won't warn for a lot of cases that
receive plain DOM children since the DOM children won't themselves get
logged.
- If the component's total render time including children is 100ms or
less then we skip warning because rerendering might not be a big deal.
- We don't warn if you have shallow equality but could memoize the JSX
element itself since we don't typically recommend that and React
Compiler doesn't do that. It only warns if you have nested objects too.
- If the depth of the objects is deeper than like the 3 levels that we
print diffs for then we wouldn't warn since we don't know if they were
equal (although we might still warn on a child).
- If the component had any updates scheduled on itself (e.g. setState)
then we don't warn since it would rerender anyway. This should really
consider Context updates too but we don't do that atm. Technically you
should still memoize the incoming props even if you also had unrelated
updates since it could apply to deeper bailouts.

DiffTrain build for [0b78161](0b78161)
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