Skip to content

Conversation

@lubieowoce
Copy link
Contributor

@lubieowoce lubieowoce commented Jan 14, 2026

Currently, when we're re-encoding a lazy chunk that came from a flight stream, we wait for the chunk to resolve, and then forward the debug info. This unnecessarily delays debug info that's already available while the chunk is still pending, like stack info. This PR attempts to make it so that we emit whatever debug info we have before initializing the lazy chunk (which may suspend), and then emit the rest after.

When a debug info array is partially emitted, we save the entries we already emitted in a WeakSet request.earlyDebugInfoEntries. That way, when we emit it again later, we know which entries to skip.

Notably, we need to track individual entries, because they might get transferred from the lazy chunk onto the inner element (i.e. moved to a different array):

// If the lazy node is initialized, we move its debug info to the inner
// value.
if (lazyNode._payload.status === INITIALIZED && lazyNode._debugInfo) {
const debugInfo = lazyNode._debugInfo.splice(0);
if (element._debugInfo) {
// $FlowFixMe[method-unbinding]
element._debugInfo.unshift.apply(element._debugInfo, debugInfo);
} else {
Object.defineProperty(element, '_debugInfo', {
configurable: false,
enumerable: false,
writable: true,
value: debugInfo,
});
}
}
}

(Originally, i had a WeakMap that tracked a "emitted entries count" per debug info array, but this didn't account for moving entries into a different array)

Most debug infos are not partially emitted -- we currently only do this for lazy elements -- so to avoid the overhead of tracking each entry we only do this if it's emitted using forwardDebugInfoOnce.

@meta-cla meta-cla bot added the CLA Signed label Jan 14, 2026
@react-sizebot
Copy link

react-sizebot commented Jan 14, 2026

Comparing: b546603...49046be

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.67 kB 608.67 kB = 107.63 kB 107.63 kB
oss-experimental/react-dom/cjs/react-dom.production.js = 6.84 kB 6.84 kB = 1.88 kB 1.88 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js = 674.60 kB 674.60 kB = 118.58 kB 118.58 kB
facebook-www/ReactDOM-prod.classic.js = 694.04 kB 694.04 kB = 122.01 kB 122.01 kB
facebook-www/ReactDOM-prod.modern.js = 684.43 kB 684.43 kB = 120.40 kB 120.40 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-flight.development.js +0.56% 143.70 kB 144.50 kB +0.64% 25.64 kB 25.81 kB
oss-stable/react-server/cjs/react-server-flight.development.js +0.56% 143.70 kB 144.50 kB +0.64% 25.64 kB 25.81 kB
oss-experimental/react-server/cjs/react-server-flight.development.js +0.55% 145.79 kB 146.59 kB +0.74% 26.10 kB 26.29 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js +0.41% 196.96 kB 197.76 kB +0.50% 35.59 kB 35.77 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js +0.41% 196.96 kB 197.76 kB +0.50% 35.59 kB 35.77 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js +0.40% 199.07 kB 199.87 kB +0.44% 36.03 kB 36.19 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js +0.40% 200.66 kB 201.46 kB +0.45% 36.09 kB 36.25 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js +0.40% 200.66 kB 201.46 kB +0.45% 36.09 kB 36.25 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js +0.40% 202.75 kB 203.55 kB +0.43% 36.52 kB 36.68 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +0.39% 204.75 kB 205.55 kB +0.45% 36.90 kB 37.07 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +0.39% 204.75 kB 205.55 kB +0.45% 36.90 kB 37.07 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.39% 205.22 kB 206.02 kB +0.45% 37.01 kB 37.18 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.39% 205.22 kB 206.02 kB +0.45% 37.01 kB 37.18 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +0.39% 206.85 kB 207.65 kB +0.40% 37.34 kB 37.49 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.39% 207.33 kB 208.13 kB +0.41% 37.45 kB 37.60 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.38% 208.48 kB 209.28 kB +0.43% 37.40 kB 37.55 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.38% 208.48 kB 209.28 kB +0.43% 37.40 kB 37.55 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +0.38% 208.48 kB 209.28 kB +0.42% 37.40 kB 37.56 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +0.38% 208.48 kB 209.28 kB +0.42% 37.40 kB 37.56 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.38% 210.57 kB 211.37 kB +0.42% 37.82 kB 37.98 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +0.38% 210.57 kB 211.37 kB +0.40% 37.83 kB 37.98 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +0.37% 223.52 kB 224.35 kB +0.36% 40.47 kB 40.62 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +0.37% 223.52 kB 224.35 kB +0.36% 40.47 kB 40.62 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +0.36% 225.61 kB 226.44 kB +0.37% 40.92 kB 41.08 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js +0.36% 230.04 kB 230.86 kB +0.37% 41.07 kB 41.22 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js +0.36% 230.04 kB 230.86 kB +0.37% 41.07 kB 41.22 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js +0.35% 232.13 kB 232.95 kB +0.36% 41.53 kB 41.68 kB
oss-stable-semver/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.development.js +0.35% 236.70 kB 237.52 kB +0.39% 42.13 kB 42.29 kB
oss-stable/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.development.js +0.35% 236.70 kB 237.52 kB +0.39% 42.13 kB 42.29 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.35% 237.90 kB 238.72 kB +0.37% 42.44 kB 42.60 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.35% 237.90 kB 238.72 kB +0.37% 42.44 kB 42.60 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +0.35% 237.95 kB 238.77 kB +0.37% 42.43 kB 42.58 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +0.35% 237.95 kB 238.77 kB +0.37% 42.43 kB 42.58 kB
oss-experimental/react-server-dom-unbundled/cjs/react-server-dom-unbundled-server.node.development.js +0.34% 238.79 kB 239.61 kB +0.37% 42.60 kB 42.76 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.34% 239.99 kB 240.81 kB +0.35% 42.91 kB 43.06 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +0.34% 240.04 kB 240.86 kB +0.35% 42.91 kB 43.06 kB

Generated by 🚫 dangerJS against 49046be

@lubieowoce lubieowoce changed the title WIP: Forward early debug info for lazy chunks Forward early debug info for lazy chunks [WIP] Jan 14, 2026
@lubieowoce lubieowoce force-pushed the reencode-debug-info branch 7 times, most recently from 8363558 to f4651dc Compare January 20, 2026 17:12
@lubieowoce lubieowoce marked this pull request as ready for review January 21, 2026 15:35
@lubieowoce lubieowoce changed the title Forward early debug info for lazy chunks [WIP] Forward early debug info for lazy chunks Jan 21, 2026
@unstubbable unstubbable changed the title Forward early debug info for lazy chunks [Flight] Forward early debug info for lazy chunks Jan 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants