Skip to content

Conversation

@sebmarkbage
Copy link
Collaborator

This adds a special list marker around the SuspenseList in these modes and wraps each row in an implicit Suspense boundary nested in each other. We can use this implicit boundary to keep track of whether that row has fully loaded and to hide the content of that row when previous ones block it from appearing.

This currently can't land by itself because it emits comment nodes for the Suspense boundaries which the client doesn't expect.

Next I'm going to remove those nodes and build a special runtime for appending instead of replacing these to make it more optimal to render many items.

This will be used to keep track of a list that need rows added to it.

It's also used as a marker on the SuspenseBoundary if the boundary is an
implicit boundary added around each row in a tail hidden/collapsed.
This will allow us to skip past a SuspenseList's rows when hydrating it
if we don't yet have all the rows satisfied.
Assuming we didn't emit comments around every row.
The complex part about this mode is that we can't release the previous row
until we have a loading state for the next row.

So we make the implicit boundary of the next row block the preceeding row.
But since that also blocks the next implicit boundary, there's a cycle
that needs special handling.
@sebmarkbage sebmarkbage requested a review from gnoff November 22, 2025 00:13
@meta-cla meta-cla bot added the CLA Signed label Nov 22, 2025
@github-actions github-actions bot added the React Core Team Opened by a member of the React Core Team label Nov 22, 2025
@react-sizebot
Copy link

Comparing: fd524fe...a811d2b

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.84 kB 6.84 kB = 1.88 kB 1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js = 608.36 kB 608.36 kB = 107.68 kB 107.68 kB
oss-experimental/react-dom/cjs/react-dom.production.js = 6.84 kB 6.84 kB +0.05% 1.88 kB 1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js = 667.47 kB 667.47 kB = 117.57 kB 117.57 kB
facebook-www/ReactDOM-prod.classic.js = 693.67 kB 693.67 kB = 122.06 kB 122.06 kB
facebook-www/ReactDOM-prod.modern.js = 684.10 kB 684.10 kB = 120.45 kB 120.45 kB
oss-stable-semver/react-server/cjs/react-server.production.js +4.48% 145.28 kB 151.79 kB +4.05% 25.49 kB 26.52 kB
oss-stable/react-server/cjs/react-server.production.js +4.48% 145.28 kB 151.79 kB +4.05% 25.49 kB 26.52 kB
oss-experimental/react-server/cjs/react-server.production.js +4.40% 148.76 kB 155.31 kB +3.89% 26.28 kB 27.30 kB
oss-stable-semver/react-server/cjs/react-server.development.js +3.47% 205.20 kB 212.33 kB +2.99% 36.17 kB 37.25 kB
oss-stable/react-server/cjs/react-server.development.js +3.47% 205.20 kB 212.33 kB +2.99% 36.17 kB 37.25 kB
oss-experimental/react-server/cjs/react-server.development.js +3.41% 209.99 kB 217.16 kB +2.89% 37.10 kB 38.17 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-server.production.js +3.13% 6.65 kB 6.86 kB +1.00% 1.60 kB 1.62 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-server.production.js +3.13% 6.65 kB 6.86 kB +1.00% 1.60 kB 1.62 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-server.production.js +3.13% 6.65 kB 6.86 kB +1.00% 1.60 kB 1.62 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-server.development.js +3.04% 8.02 kB 8.27 kB +1.13% 1.69 kB 1.70 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-server.development.js +3.04% 8.02 kB 8.27 kB +1.13% 1.69 kB 1.70 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-server.development.js +3.04% 8.02 kB 8.27 kB +1.13% 1.69 kB 1.70 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.browser.production.js +2.41% 250.03 kB 256.07 kB +2.08% 45.12 kB 46.06 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.browser.production.js +2.41% 250.06 kB 256.09 kB +2.08% 45.14 kB 46.08 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.node.production.js +2.37% 254.95 kB 260.99 kB +2.03% 46.99 kB 47.94 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.node.production.js +2.37% 254.98 kB 261.02 kB +2.02% 47.01 kB 47.97 kB
facebook-www/ReactDOMServer-prod.modern.js +2.35% 256.79 kB 262.82 kB +2.10% 45.95 kB 46.91 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.production.js +2.33% 259.82 kB 265.88 kB +2.10% 46.54 kB 47.52 kB
facebook-www/ReactDOMServer-prod.classic.js +2.33% 259.12 kB 265.16 kB +2.16% 46.30 kB 47.30 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.production.js +2.29% 265.32 kB 271.38 kB +1.99% 48.64 kB 49.61 kB
oss-experimental/react-markup/cjs/react-markup.production.js +2.24% 246.87 kB 252.40 kB +2.06% 45.79 kB 46.73 kB
oss-stable-semver/react-dom/cjs/react-dom-server.browser.production.js +2.19% 277.35 kB 283.42 kB +2.05% 49.41 kB 50.43 kB
oss-stable/react-dom/cjs/react-dom-server.browser.production.js +2.19% 277.42 kB 283.49 kB +2.06% 49.43 kB 50.45 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js +2.18% 266.61 kB 272.43 kB +2.00% 48.76 kB 49.74 kB
oss-stable-semver/react-dom/cjs/react-dom-server.edge.production.js +2.15% 282.97 kB 289.04 kB +1.99% 51.50 kB 52.53 kB
oss-stable/react-dom/cjs/react-dom-server.edge.production.js +2.14% 283.04 kB 289.12 kB +1.99% 51.53 kB 52.55 kB
oss-stable-semver/react-dom/cjs/react-dom-server.bun.production.js +2.14% 278.25 kB 284.21 kB +2.03% 49.06 kB 50.06 kB
oss-stable/react-dom/cjs/react-dom-server.bun.production.js +2.14% 278.32 kB 284.28 kB +2.02% 49.09 kB 50.08 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.production.js +2.11% 288.76 kB 294.86 kB +1.96% 51.06 kB 52.06 kB
oss-stable-semver/react-dom/cjs/react-dom-server.node.production.js +2.09% 291.03 kB 297.10 kB +1.99% 51.37 kB 52.39 kB
oss-stable/react-dom/cjs/react-dom-server.node.production.js +2.09% 291.11 kB 297.18 kB +1.99% 51.39 kB 52.41 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.production.js +2.07% 289.51 kB 295.50 kB +1.91% 50.85 kB 51.82 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.production.js +2.07% 295.06 kB 301.16 kB +1.90% 53.40 kB 54.41 kB
oss-experimental/react-dom/cjs/react-dom-server.node.production.js +2.02% 302.78 kB 308.88 kB +1.94% 53.25 kB 54.28 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable-semver/react-server/cjs/react-server.production.js +4.48% 145.28 kB 151.79 kB +4.05% 25.49 kB 26.52 kB
oss-stable/react-server/cjs/react-server.production.js +4.48% 145.28 kB 151.79 kB +4.05% 25.49 kB 26.52 kB
oss-experimental/react-server/cjs/react-server.production.js +4.40% 148.76 kB 155.31 kB +3.89% 26.28 kB 27.30 kB
oss-stable-semver/react-server/cjs/react-server.development.js +3.47% 205.20 kB 212.33 kB +2.99% 36.17 kB 37.25 kB
oss-stable/react-server/cjs/react-server.development.js +3.47% 205.20 kB 212.33 kB +2.99% 36.17 kB 37.25 kB
oss-experimental/react-server/cjs/react-server.development.js +3.41% 209.99 kB 217.16 kB +2.89% 37.10 kB 38.17 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-server.production.js +3.13% 6.65 kB 6.86 kB +1.00% 1.60 kB 1.62 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-server.production.js +3.13% 6.65 kB 6.86 kB +1.00% 1.60 kB 1.62 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-server.production.js +3.13% 6.65 kB 6.86 kB +1.00% 1.60 kB 1.62 kB
oss-experimental/react-noop-renderer/cjs/react-noop-renderer-server.development.js +3.04% 8.02 kB 8.27 kB +1.13% 1.69 kB 1.70 kB
oss-stable-semver/react-noop-renderer/cjs/react-noop-renderer-server.development.js +3.04% 8.02 kB 8.27 kB +1.13% 1.69 kB 1.70 kB
oss-stable/react-noop-renderer/cjs/react-noop-renderer-server.development.js +3.04% 8.02 kB 8.27 kB +1.13% 1.69 kB 1.70 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.browser.production.js +2.41% 250.03 kB 256.07 kB +2.08% 45.12 kB 46.06 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.browser.production.js +2.41% 250.06 kB 256.09 kB +2.08% 45.14 kB 46.08 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.node.production.js +2.37% 254.95 kB 260.99 kB +2.03% 46.99 kB 47.94 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.node.production.js +2.37% 254.98 kB 261.02 kB +2.02% 47.01 kB 47.97 kB
facebook-www/ReactDOMServer-prod.modern.js +2.35% 256.79 kB 262.82 kB +2.10% 45.95 kB 46.91 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.production.js +2.33% 259.82 kB 265.88 kB +2.10% 46.54 kB 47.52 kB
facebook-www/ReactDOMServer-prod.classic.js +2.33% 259.12 kB 265.16 kB +2.16% 46.30 kB 47.30 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.production.js +2.29% 265.32 kB 271.38 kB +1.99% 48.64 kB 49.61 kB
oss-experimental/react-markup/cjs/react-markup.production.js +2.24% 246.87 kB 252.40 kB +2.06% 45.79 kB 46.73 kB
oss-stable-semver/react-dom/cjs/react-dom-server.browser.production.js +2.19% 277.35 kB 283.42 kB +2.05% 49.41 kB 50.43 kB
oss-stable/react-dom/cjs/react-dom-server.browser.production.js +2.19% 277.42 kB 283.49 kB +2.06% 49.43 kB 50.45 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js +2.18% 266.61 kB 272.43 kB +2.00% 48.76 kB 49.74 kB
oss-stable-semver/react-dom/cjs/react-dom-server.edge.production.js +2.15% 282.97 kB 289.04 kB +1.99% 51.50 kB 52.53 kB
oss-stable/react-dom/cjs/react-dom-server.edge.production.js +2.14% 283.04 kB 289.12 kB +1.99% 51.53 kB 52.55 kB
oss-stable-semver/react-dom/cjs/react-dom-server.bun.production.js +2.14% 278.25 kB 284.21 kB +2.03% 49.06 kB 50.06 kB
oss-stable/react-dom/cjs/react-dom-server.bun.production.js +2.14% 278.32 kB 284.28 kB +2.02% 49.09 kB 50.08 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.production.js +2.11% 288.76 kB 294.86 kB +1.96% 51.06 kB 52.06 kB
oss-stable-semver/react-dom/cjs/react-dom-server.node.production.js +2.09% 291.03 kB 297.10 kB +1.99% 51.37 kB 52.39 kB
oss-stable/react-dom/cjs/react-dom-server.node.production.js +2.09% 291.11 kB 297.18 kB +1.99% 51.39 kB 52.41 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.production.js +2.07% 289.51 kB 295.50 kB +1.91% 50.85 kB 51.82 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.production.js +2.07% 295.06 kB 301.16 kB +1.90% 53.40 kB 54.41 kB
oss-experimental/react-dom/cjs/react-dom-server.node.production.js +2.02% 302.78 kB 308.88 kB +1.94% 53.25 kB 54.28 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.node.development.js +1.76% 404.15 kB 411.28 kB +1.48% 73.12 kB 74.20 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.browser.development.js +1.76% 404.15 kB 411.28 kB +1.48% 73.12 kB 74.20 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.node.development.js +1.76% 404.17 kB 411.31 kB +1.48% 73.14 kB 74.23 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.browser.development.js +1.76% 404.18 kB 411.31 kB +1.48% 73.14 kB 74.23 kB
facebook-www/ReactDOMServer-dev.modern.js +1.72% 415.05 kB 422.18 kB +1.45% 74.50 kB 75.58 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.development.js +1.71% 419.47 kB 426.63 kB +1.42% 75.37 kB 76.43 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.development.js +1.71% 419.47 kB 426.63 kB +1.41% 75.37 kB 76.43 kB
facebook-www/ReactDOMServer-dev.classic.js +1.70% 418.49 kB 425.62 kB +1.44% 75.10 kB 76.18 kB
oss-stable-semver/react-dom/cjs/react-dom-server.browser.development.js +1.67% 433.50 kB 440.74 kB +1.46% 77.24 kB 78.37 kB
oss-stable/react-dom/cjs/react-dom-server.browser.development.js +1.67% 433.57 kB 440.82 kB +1.46% 77.29 kB 78.42 kB
oss-stable-semver/react-dom/cjs/react-dom-server.edge.development.js +1.67% 434.28 kB 441.52 kB +1.46% 77.41 kB 78.54 kB
oss-stable/react-dom/cjs/react-dom-server.edge.development.js +1.67% 434.35 kB 441.60 kB +1.45% 77.46 kB 78.59 kB
oss-experimental/react-markup/cjs/react-markup.development.js +1.66% 391.32 kB 397.81 kB +1.38% 71.12 kB 72.10 kB
oss-stable-semver/react-dom/cjs/react-dom-server.bun.development.js +1.65% 383.97 kB 390.31 kB +1.43% 72.83 kB 73.87 kB
oss-stable/react-dom/cjs/react-dom-server.bun.development.js +1.65% 384.05 kB 390.39 kB +1.43% 72.85 kB 73.90 kB
facebook-www/ReactDOMServerStreaming-dev.modern.js +1.65% 413.56 kB 420.36 kB +1.37% 74.09 kB 75.11 kB
oss-stable-semver/react-dom/cjs/react-dom-server.node.development.js +1.64% 440.53 kB 447.78 kB +1.47% 77.20 kB 78.33 kB
oss-stable/react-dom/cjs/react-dom-server.node.development.js +1.64% 440.61 kB 447.86 kB +1.47% 77.25 kB 78.39 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.development.js +1.62% 449.86 kB 457.14 kB +1.42% 79.55 kB 80.68 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.development.js +1.62% 450.86 kB 458.14 kB +1.42% 79.78 kB 80.90 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.development.js +1.60% 398.20 kB 404.57 kB +1.41% 75.14 kB 76.21 kB
oss-experimental/react-dom/cjs/react-dom-server.node.development.js +1.59% 456.62 kB 463.90 kB +1.43% 79.54 kB 80.67 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js +1.56% 356.38 kB 361.92 kB +1.43% 66.30 kB 67.25 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js +0.97% 667.16 kB 673.66 kB +0.89% 118.28 kB 119.33 kB
oss-experimental/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js = 2,198.78 kB 2,160.70 kB = 316.15 kB 310.78 kB
oss-stable-semver/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js = 2,198.78 kB 2,160.70 kB = 316.15 kB 310.78 kB
oss-stable/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.development.js = 2,198.78 kB 2,160.70 kB = 316.15 kB 310.78 kB
oss-experimental/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.production.js = 2,194.31 kB 2,156.23 kB = 315.14 kB 309.78 kB
oss-stable-semver/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.production.js = 2,194.31 kB 2,156.23 kB = 315.14 kB 309.78 kB
oss-stable/eslint-plugin-react-hooks/cjs/eslint-plugin-react-hooks.production.js = 2,194.31 kB 2,156.23 kB = 315.14 kB 309.78 kB

Generated by 🚫 dangerJS against a811d2b

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.

2 participants