Skip to content

[Fizz] Hoist hoistables to each row and transfer the dependencies to future rows #33312

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

Merged
merged 4 commits into from
May 20, 2025

Conversation

sebmarkbage
Copy link
Collaborator

Stacked on #33311.

When a row contains Suspense boundaries that themselves depend on CSS, they will not resolve until the CSS has loaded on the client. We need future rows in a list to be blocked until this happens. We could do something in the runtime but a simpler approach is to just add those CSS dependencies to all those boundaries as well.

To do this, we first hoist the HoistableState from a completed boundary onto its parent row. Then when the row finishes do we hoist it onto the next row and onto any boundaries within that row.

@sebmarkbage sebmarkbage requested review from gnoff and eps1lon May 20, 2025 02:44
@github-actions github-actions bot added the React Core Team Opened by a member of the React Core Team label May 20, 2025
@react-sizebot
Copy link

react-sizebot commented May 20, 2025

Comparing: 99aa685...8cf6f47

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 = 529.83 kB 529.83 kB = 93.51 kB 93.52 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.57 kB 651.57 kB = 114.78 kB 114.78 kB
facebook-www/ReactDOM-prod.classic.js = 675.81 kB 675.81 kB = 118.87 kB 118.87 kB
facebook-www/ReactDOM-prod.modern.js = 666.09 kB 666.09 kB = 117.26 kB 117.26 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 +0.75% 129.99 kB 130.97 kB +0.68% 22.82 kB 22.97 kB
oss-stable/react-server/cjs/react-server.production.js +0.75% 129.99 kB 130.97 kB +0.68% 22.82 kB 22.97 kB
oss-experimental/react-server/cjs/react-server.production.js +0.66% 148.24 kB 149.22 kB +0.74% 25.50 kB 25.69 kB
oss-stable-semver/react-server/cjs/react-server.development.js +0.56% 188.11 kB 189.16 kB +0.47% 33.45 kB 33.61 kB
oss-stable/react-server/cjs/react-server.development.js +0.56% 188.11 kB 189.16 kB +0.47% 33.45 kB 33.61 kB
oss-experimental/react-server/cjs/react-server.development.js +0.51% 208.03 kB 209.08 kB +0.42% 36.05 kB 36.20 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.browser.production.js +0.36% 226.17 kB 226.97 kB +0.40% 40.96 kB 41.13 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.browser.production.js +0.36% 226.19 kB 227.00 kB +0.40% 40.99 kB 41.15 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.node.production.js +0.35% 230.68 kB 231.49 kB +0.37% 42.73 kB 42.89 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.node.production.js +0.35% 230.71 kB 231.51 kB +0.37% 42.76 kB 42.91 kB
oss-stable-semver/react-dom/cjs/react-dom-server.bun.production.js +0.34% 232.63 kB 233.42 kB +0.36% 42.47 kB 42.62 kB
oss-stable/react-dom/cjs/react-dom-server.bun.production.js +0.34% 232.70 kB 233.50 kB +0.36% 42.50 kB 42.65 kB
facebook-www/ReactDOMServer-prod.modern.js +0.34% 239.22 kB 240.02 kB +0.41% 42.74 kB 42.92 kB
oss-experimental/react-markup/cjs/react-markup.production.js +0.33% 241.21 kB 242.02 kB +0.34% 43.84 kB 43.99 kB
facebook-www/ReactDOMServer-prod.classic.js +0.33% 244.66 kB 245.46 kB +0.39% 43.48 kB 43.65 kB
oss-stable-semver/react-dom/cjs/react-dom-server.browser.production.js +0.32% 246.74 kB 247.53 kB +0.33% 44.16 kB 44.31 kB
oss-stable/react-dom/cjs/react-dom-server.browser.production.js +0.32% 246.81 kB 247.61 kB +0.33% 44.18 kB 44.33 kB
oss-stable-semver/react-dom/cjs/react-dom-server.node.production.js +0.32% 248.53 kB 249.33 kB +0.31% 45.15 kB 45.29 kB
oss-stable/react-dom/cjs/react-dom-server.node.production.js +0.32% 248.61 kB 249.41 kB +0.31% 45.18 kB 45.32 kB
facebook-www/ReactDOMServerStreaming-prod.modern.js +0.32% 250.49 kB 251.29 kB +0.33% 45.49 kB 45.64 kB
oss-stable-semver/react-dom/cjs/react-dom-server.edge.production.js +0.32% 251.94 kB 252.74 kB +0.30% 46.11 kB 46.25 kB
oss-stable/react-dom/cjs/react-dom-server.edge.production.js +0.32% 252.01 kB 252.81 kB +0.30% 46.14 kB 46.28 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.production.js +0.32% 254.57 kB 255.37 kB +0.33% 44.90 kB 45.05 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.production.js +0.31% 259.65 kB 260.45 kB +0.29% 46.81 kB 46.94 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.production.js +0.30% 264.99 kB 265.79 kB +0.37% 47.03 kB 47.20 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.production.js +0.28% 285.79 kB 286.59 kB +0.28% 49.34 kB 49.48 kB
oss-experimental/react-dom/cjs/react-dom-server.node.production.js +0.28% 287.71 kB 288.51 kB +0.32% 50.54 kB 50.70 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.production.js +0.27% 291.74 kB 292.54 kB +0.29% 51.52 kB 51.67 kB
oss-experimental/react-markup/cjs/react-markup.development.js +0.24% 383.18 kB 384.11 kB +0.24% 68.56 kB 68.72 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.node.development.js +0.24% 379.47 kB 380.40 kB +0.22% 68.77 kB 68.92 kB
oss-stable-semver/react-dom/cjs/react-dom-server-legacy.browser.development.js +0.24% 379.48 kB 380.40 kB +0.22% 68.77 kB 68.92 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.node.development.js +0.24% 379.50 kB 380.42 kB +0.22% 68.80 kB 68.95 kB
oss-stable/react-dom/cjs/react-dom-server-legacy.browser.development.js +0.24% 379.50 kB 380.42 kB +0.22% 68.80 kB 68.95 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js +0.24% 342.26 kB 343.06 kB +0.28% 63.14 kB 63.31 kB
oss-stable-semver/react-dom/cjs/react-dom-server.bun.development.js +0.24% 339.90 kB 340.70 kB +0.20% 66.00 kB 66.14 kB
oss-stable/react-dom/cjs/react-dom-server.bun.development.js +0.24% 339.98 kB 340.78 kB +0.20% 66.03 kB 66.16 kB
facebook-www/ReactDOMServer-dev.modern.js +0.23% 398.23 kB 399.15 kB +0.22% 71.12 kB 71.28 kB
facebook-www/ReactDOMServer-dev.classic.js +0.23% 401.69 kB 402.61 kB +0.21% 71.68 kB 71.83 kB
facebook-www/ReactDOMServerStreaming-dev.modern.js +0.23% 394.01 kB 394.91 kB +0.23% 70.39 kB 70.55 kB
oss-stable-semver/react-dom/cjs/react-dom-server.node.development.js +0.23% 394.40 kB 395.30 kB +0.20% 70.78 kB 70.92 kB
oss-stable/react-dom/cjs/react-dom-server.node.development.js +0.23% 394.47 kB 395.37 kB +0.20% 70.83 kB 70.97 kB
oss-stable-semver/react-dom/cjs/react-dom-server.browser.development.js +0.23% 397.83 kB 398.73 kB +0.19% 71.41 kB 71.55 kB
oss-stable/react-dom/cjs/react-dom-server.browser.development.js +0.23% 397.91 kB 398.81 kB +0.20% 71.46 kB 71.60 kB
oss-stable-semver/react-dom/cjs/react-dom-server.edge.development.js +0.23% 398.61 kB 399.51 kB +0.20% 71.56 kB 71.70 kB
oss-stable/react-dom/cjs/react-dom-server.edge.development.js +0.23% 398.69 kB 399.59 kB +0.20% 71.61 kB 71.75 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.node.development.js +0.22% 413.67 kB 414.59 kB +0.23% 73.05 kB 73.22 kB
oss-experimental/react-dom/cjs/react-dom-server-legacy.browser.development.js +0.22% 413.67 kB 414.59 kB +0.23% 73.05 kB 73.22 kB
oss-experimental/react-dom/cjs/react-dom-server.bun.development.js +0.21% 373.88 kB 374.68 kB +0.21% 70.97 kB 71.11 kB
oss-experimental/react-dom/cjs/react-dom-server.node.development.js +0.20% 439.80 kB 440.70 kB +0.19% 76.43 kB 76.58 kB
oss-experimental/react-dom/cjs/react-dom-server.browser.development.js +0.20% 443.81 kB 444.71 kB +0.18% 77.07 kB 77.22 kB
oss-experimental/react-dom/cjs/react-dom-server.edge.development.js +0.20% 444.81 kB 445.71 kB +0.18% 77.28 kB 77.42 kB

Generated by 🚫 dangerJS against 8cf6f47

Copy link
Collaborator

@gnoff gnoff left a comment

Choose a reason for hiding this comment

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

It might be worth optimizing the serialization of the href dependencies for link stylesheets. At the moment we include the href for each boundary reveal. With the accumulation of all preceding hrefs when unblocking rows we might be repeated the same href many times. This is true before in a way but only if each boundary actually depended on that link. In this case we can have unbounded growth of hrefs by the number of rows.

Maybe we track which hrefs are emitted in which order and just start encoding a number

@sebmarkbage sebmarkbage force-pushed the fizzsupenselistcss branch from 1d7164f to 8bea435 Compare May 20, 2025 18:40
@sebmarkbage sebmarkbage force-pushed the fizzsupenselistcss branch from 8bea435 to 8cf6f47 Compare May 20, 2025 18:42
@sebmarkbage sebmarkbage merged commit 50389e1 into facebook:main May 20, 2025
240 checks passed
github-actions bot pushed a commit that referenced this pull request May 20, 2025
…future rows (#33312)

Stacked on #33311.

When a row contains Suspense boundaries that themselves depend on CSS,
they will not resolve until the CSS has loaded on the client. We need
future rows in a list to be blocked until this happens. We could do
something in the runtime but a simpler approach is to just add those CSS
dependencies to all those boundaries as well.

To do this, we first hoist the HoistableState from a completed boundary
onto its parent row. Then when the row finishes do we hoist it onto the
next row and onto any boundaries within that row.

DiffTrain build for [50389e1](50389e1)
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.

5 participants