Skip to content

Conversation

sebmarkbage
Copy link
Collaborator

@sebmarkbage sebmarkbage commented Jun 27, 2025

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:

Screenshot 2025-06-27 at 3 31 16 PM

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.

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.
If they get clamped, they can end up being equal and stack into two rows.
@sebmarkbage sebmarkbage requested a review from eps1lon June 27, 2025 19:56
@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...b3f67f9

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.11% 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 +0.05% 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.79 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.67% 682.96 kB 687.53 kB +0.90% 107.77 kB 108.74 kB
facebook-www/ReactART-dev.modern.js +0.63% 727.75 kB 732.35 kB +0.89% 113.20 kB 114.21 kB
react-native/implementations/ReactFabric-dev.fb.js +0.63% 731.16 kB 735.76 kB +0.82% 116.27 kB 117.23 kB
facebook-www/ReactART-dev.classic.js +0.62% 737.24 kB 741.85 kB +0.88% 114.96 kB 115.98 kB
react-native/implementations/ReactNativeRenderer-dev.fb.js +0.62% 742.34 kB 746.95 kB +0.80% 117.89 kB 118.83 kB
oss-experimental/react-reconciler/cjs/react-reconciler.development.js +0.56% 810.61 kB 815.18 kB +0.76% 126.51 kB 127.47 kB
facebook-www/ReactReconciler-dev.modern.js +0.55% 844.53 kB 849.14 kB +0.70% 131.09 kB 132.00 kB
facebook-www/ReactReconciler-dev.classic.js +0.54% 853.73 kB 858.34 kB +0.69% 132.84 kB 133.76 kB
facebook-react-native/react-dom/cjs/ReactDOMClient-dev.js +0.41% 1,101.29 kB 1,105.75 kB +0.51% 182.44 kB 183.37 kB
facebook-react-native/react-dom/cjs/ReactDOMProfiling-dev.js +0.40% 1,117.56 kB 1,122.02 kB +0.52% 185.22 kB 186.18 kB
facebook-www/ReactDOM-dev.modern.js +0.38% 1,224.00 kB 1,228.61 kB +0.46% 202.28 kB 203.21 kB
oss-experimental/react-dom/cjs/react-dom-client.development.js +0.37% 1,182.01 kB 1,186.43 kB +0.49% 197.00 kB 197.97 kB
facebook-www/ReactDOM-dev.classic.js +0.37% 1,233.15 kB 1,237.75 kB +0.46% 204.01 kB 204.95 kB
facebook-www/ReactDOMTesting-dev.modern.js +0.37% 1,240.54 kB 1,245.15 kB +0.44% 205.99 kB 206.90 kB
oss-experimental/react-dom/cjs/react-dom-profiling.development.js +0.37% 1,198.39 kB 1,202.82 kB +0.48% 199.84 kB 200.81 kB
oss-experimental/react-dom/cjs/react-dom-unstable_testing.development.js +0.37% 1,198.55 kB 1,202.98 kB +0.48% 200.70 kB 201.66 kB
facebook-www/ReactDOMTesting-dev.classic.js +0.37% 1,249.68 kB 1,254.29 kB +0.45% 207.66 kB 208.59 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 b3f67f9

@sebmarkbage
Copy link
Collaborator Author

Chrome is tracking bug here https://issues.chromium.org/issues/428939519

Can revert once fixed.

@sebmarkbage sebmarkbage merged commit 508f7aa into facebook:main Jul 2, 2025
247 checks passed
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