Skip to content

[Fizz] model fb bundle's external work scheduling explicitly#36576

Open
gnoff wants to merge 1 commit into
facebook:mainfrom
gnoff:jstory/explicit-pull-based-fizz
Open

[Fizz] model fb bundle's external work scheduling explicitly#36576
gnoff wants to merge 1 commit into
facebook:mainfrom
gnoff:jstory/explicit-pull-based-fizz

Conversation

@gnoff
Copy link
Copy Markdown
Collaborator

@gnoff gnoff commented May 30, 2026

There are parts of Fizz that need to schedule work regardless of whether the primary rendering pathway is drive externally through performWork. Historically scheduleWork and later s cheduleMicrotask were noops in this bundle but it makes it hard to reason about the code because you cannot be assured that calling scheduleWork will actually result in the function
ever executing. Now we model this explicitly through config. For builds that drive work through external calls to performaWork we simply omit any work scheduling in startWork or pi
ngTask. Now that this is modeled explicitly we can implement scheduleMicrotask and scheduleWork to actually provide a guarantee that the callbacks will get invoked.

For now I've implemented these two for the fb build as synchronous however it is likely that queueMicrotask and setTimeout or similar are preferred.

@gnoff gnoff requested a review from eps1lon May 30, 2026 04:15
@meta-cla meta-cla Bot added the CLA Signed label May 30, 2026
@github-actions github-actions Bot added the React Core Team Opened by a member of the React Core Team label May 30, 2026
@react-sizebot
Copy link
Copy Markdown

react-sizebot commented May 30, 2026

Comparing: f0dfee3...a550180

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 +0.11% 1.88 kB 1.88 kB
oss-stable/react-dom/cjs/react-dom-client.production.js = 614.26 kB 614.17 kB = 108.57 kB 108.52 kB
oss-experimental/react-dom/cjs/react-dom.production.js = 6.84 kB 6.84 kB +0.11% 1.88 kB 1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js = 680.19 kB 680.11 kB = 119.51 kB 119.48 kB
facebook-www/ReactDOM-prod.classic.js = 700.61 kB 700.53 kB = 123.09 kB 123.05 kB
facebook-www/ReactDOM-prod.modern.js = 690.93 kB 690.84 kB = 121.48 kB 121.44 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
facebook-www/ReactDOMServerStreaming-dev.modern.js +1.17% 419.53 kB 424.42 kB +1.31% 75.19 kB 76.18 kB
oss-experimental/react-markup/cjs/react-markup.react-server.production.js = 361.78 kB 360.40 kB = 67.31 kB 66.82 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js = 685.74 kB 683.03 kB = 121.73 kB 121.17 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.js = 116.90 kB 115.96 kB = 22.71 kB 22.48 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.js = 116.54 kB 115.61 kB = 22.62 kB 22.38 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.js = 115.10 kB 114.17 kB = 22.35 kB 22.11 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.production.js = 115.10 kB 114.17 kB = 22.35 kB 22.11 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.js = 114.75 kB 113.81 kB = 22.25 kB 22.02 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.production.js = 114.75 kB 113.81 kB = 22.25 kB 22.02 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.production.js = 111.03 kB 110.09 kB = 21.70 kB 21.46 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.production.js = 109.24 kB 108.30 kB = 21.34 kB 21.10 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.production.js = 109.24 kB 108.30 kB = 21.34 kB 21.10 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js = 130.43 kB 129.29 kB = 26.04 kB 25.69 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js = 130.42 kB 129.28 kB = 26.05 kB 25.70 kB
oss-experimental/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js = 129.37 kB 128.23 kB = 25.83 kB 25.47 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js = 128.63 kB 127.50 kB = 25.68 kB 25.32 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.production.js = 128.63 kB 127.50 kB = 25.68 kB 25.32 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js = 128.62 kB 127.48 kB = 25.68 kB 25.33 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.production.js = 128.62 kB 127.48 kB = 25.68 kB 25.33 kB
oss-stable-semver/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js = 127.57 kB 126.44 kB = 25.46 kB 25.09 kB
oss-stable/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.production.js = 127.57 kB 126.44 kB = 25.46 kB 25.09 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js = 123.50 kB 122.36 kB = 24.89 kB 24.52 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js = 121.71 kB 120.57 kB = 24.52 kB 24.16 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.production.js = 121.71 kB 120.57 kB = 24.52 kB 24.16 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js = 119.43 kB 118.30 kB = 24.32 kB 23.95 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js = 117.64 kB 116.50 kB = 23.94 kB 23.58 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.production.js = 117.64 kB 116.50 kB = 23.94 kB 23.58 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js = 122.46 kB 121.21 kB = 24.68 kB 24.33 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js = 122.46 kB 121.21 kB = 24.69 kB 24.34 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js = 120.66 kB 119.42 kB = 24.32 kB 23.96 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.production.js = 120.66 kB 119.42 kB = 24.32 kB 23.96 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js = 120.66 kB 119.42 kB = 24.33 kB 23.97 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.production.js = 120.66 kB 119.42 kB = 24.33 kB 23.97 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js = 115.52 kB 114.28 kB = 23.56 kB 23.19 kB
facebook-www/ReactFlightServer-prod.classic.js = 104.45 kB 103.32 kB = 21.32 kB 20.95 kB
facebook-www/ReactFlightServer-prod.modern.js = 104.45 kB 103.32 kB = 21.32 kB 20.95 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js = 113.73 kB 112.48 kB = 23.18 kB 22.80 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.production.js = 113.73 kB 112.48 kB = 23.18 kB 22.80 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js = 256.85 kB 253.87 kB = 46.13 kB 45.65 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js = 256.84 kB 253.86 kB = 46.13 kB 45.64 kB
oss-experimental/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.development.js = 255.64 kB 252.66 kB = 45.81 kB 45.33 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js = 254.76 kB 251.78 kB = 45.70 kB 45.22 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js = 254.76 kB 251.78 kB = 45.70 kB 45.22 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js = 254.75 kB 251.77 kB = 45.70 kB 45.21 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js = 254.75 kB 251.77 kB = 45.70 kB 45.21 kB
oss-stable-semver/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.development.js = 253.55 kB 250.57 kB = 45.38 kB 44.90 kB
oss-stable/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.development.js = 253.55 kB 250.57 kB = 45.38 kB 44.90 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js = 249.12 kB 246.14 kB = 44.74 kB 44.25 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js = 247.03 kB 244.05 kB = 44.32 kB 43.82 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js = 247.03 kB 244.05 kB = 44.32 kB 43.82 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js = 242.35 kB 239.37 kB = 44.10 kB 43.61 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js = 240.26 kB 237.28 kB = 43.67 kB 43.17 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js = 240.26 kB 237.28 kB = 43.67 kB 43.17 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js = 224.98 kB 222.00 kB = 40.51 kB 40.04 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js = 224.98 kB 222.00 kB = 40.52 kB 40.04 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js = 222.89 kB 219.91 kB = 40.09 kB 39.62 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js = 222.89 kB 219.91 kB = 40.09 kB 39.62 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js = 222.89 kB 219.91 kB = 40.09 kB 39.62 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js = 222.89 kB 219.91 kB = 40.09 kB 39.62 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js = 221.34 kB 218.36 kB = 40.03 kB 39.55 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js = 220.86 kB 217.88 kB = 39.92 kB 39.44 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js = 219.23 kB 216.25 kB = 39.61 kB 39.12 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js = 219.23 kB 216.25 kB = 39.61 kB 39.12 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js = 218.76 kB 215.78 kB = 39.51 kB 39.01 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js = 218.76 kB 215.78 kB = 39.51 kB 39.01 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js = 217.26 kB 214.28 kB = 39.21 kB 38.73 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js = 215.17 kB 212.19 kB = 38.78 kB 38.32 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js = 215.17 kB 212.19 kB = 38.78 kB 38.32 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js = 213.25 kB 210.27 kB = 38.60 kB 38.14 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js = 211.15 kB 208.17 kB = 38.19 kB 37.72 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js = 211.15 kB 208.17 kB = 38.19 kB 37.72 kB
facebook-www/ReactFlightServer-dev.classic.js = 202.43 kB 199.45 kB = 36.64 kB 36.14 kB
facebook-www/ReactFlightServer-dev.modern.js = 202.43 kB 199.45 kB = 36.64 kB 36.14 kB
oss-experimental/react-server/cjs/react-server-flight.development.js = 150.86 kB 148.48 kB = 27.10 kB 26.69 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js = 148.77 kB 146.39 kB = 26.64 kB 26.23 kB
oss-stable/react-server/cjs/react-server-flight.development.js = 148.77 kB 146.39 kB = 26.64 kB 26.23 kB
oss-experimental/react-server/cjs/react-server-flight.production.js = 69.20 kB 68.05 kB = 13.86 kB 13.49 kB
oss-stable-semver/react-server/cjs/react-server-flight.production.js = 67.39 kB 66.24 kB = 13.45 kB 13.08 kB
oss-stable/react-server/cjs/react-server-flight.production.js = 67.39 kB 66.24 kB = 13.45 kB 13.08 kB

Generated by 🚫 dangerJS against a550180

There are parts of Fizz that need to schedule work regardless of whether the primary rendering pathway is drive externally through performWork. Historically scheduleWork and later s
cheduleMicrotask were noops in this bundle but it makes it hard to reason about the code because you cannot be assured that calling scheduleWork will actually result in the function
 ever executing. Now we model this explicitly through config. For builds that drive work through external calls to performaWork we simply omit any work scheduling in startWork or pi
ngTask. Now that this is modeled explicitly we can implement scheduleMicrotask and scheduleWork to actually provide a guarantee that the callbacks will get invoked.

For now I've implemented these two for the fb build as synchronous however it is likely that queueMicrotask and setTimeout or similar are preferred.
@gnoff gnoff force-pushed the jstory/explicit-pull-based-fizz branch from f2b7882 to a550180 Compare May 30, 2026 04:38
@gnoff gnoff requested review from rickhanlonii and unstubbable May 30, 2026 04:38

export function scheduleMicrotask(callback: () => void) {
// We don't schedule work in this model, and instead expect performWork to always be called repeatedly.
callback();
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Should we leave a TODO here, as you mentioned the following in the PR description?

For now I've implemented these two for the fb build as synchronous however it is likely that queueMicrotask and setTimeout or similar are preferred.

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