Skip to content

[Flight] Build node-webstreams version of bundled webpack server #33456

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 2 commits into from
Jun 6, 2025

Conversation

sebmarkbage
Copy link
Collaborator

Follow up to #33442. This is the bundled version.

To keep type check passes from exploding and the maintainance of the annoying paths: [] list small, this doesn't add this to flow type checks. We might miss some config but every combination should already be covered by other one passes.

I also don't add any jest tests because to test these double export entry points we need conditional importing to cover builds and non-builds which turns out to be difficult for the Flight builds so these aren't covered by any basic build tests.

This approach is what I'm going for, for the other bundlers too.

@github-actions github-actions bot added the React Core Team Opened by a member of the React Core Team label Jun 6, 2025
@react-sizebot
Copy link

react-sizebot commented Jun 6, 2025

Comparing: dddcae7...e51f035

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.05% 1.83 kB 1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js = 530.07 kB 530.07 kB = 93.57 kB 93.57 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.16 kB 651.16 kB = 114.69 kB 114.69 kB
facebook-www/ReactDOM-prod.classic.js = 676.11 kB 676.11 kB = 118.97 kB 118.97 kB
facebook-www/ReactDOM-prod.modern.js = 666.39 kB 666.39 kB = 117.36 kB 117.36 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node-webstreams.development.js New file 0.00 kB 123.95 kB New file 0.00 kB 23.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node-webstreams.production.js New file 0.00 kB 59.87 kB New file 0.00 kB 12.23 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node-webstreams.development.js New file 0.00 kB 172.96 kB New file 0.00 kB 32.07 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node-webstreams.production.js New file 0.00 kB 99.24 kB New file 0.00 kB 20.24 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node-webstreams.development.js New file 0.00 kB 108.29 kB New file 0.00 kB 20.39 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node-webstreams.production.js New file 0.00 kB 59.32 kB New file 0.00 kB 12.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node-webstreams.development.js New file 0.00 kB 156.17 kB New file 0.00 kB 28.86 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node-webstreams.production.js New file 0.00 kB 94.64 kB New file 0.00 kB 19.39 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node-webstreams.development.js New file 0.00 kB 108.29 kB New file 0.00 kB 20.39 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node-webstreams.production.js New file 0.00 kB 59.32 kB New file 0.00 kB 12.14 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node-webstreams.development.js New file 0.00 kB 156.17 kB New file 0.00 kB 28.86 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node-webstreams.production.js New file 0.00 kB 94.64 kB New file 0.00 kB 19.39 kB
oss-experimental/react-server-dom-webpack/client.node.js +292.34% 0.25 kB 0.97 kB +107.32% 0.16 kB 0.34 kB
oss-stable-semver/react-server-dom-webpack/client.node.js +292.34% 0.25 kB 0.97 kB +107.32% 0.16 kB 0.34 kB
oss-stable/react-server-dom-webpack/client.node.js +292.34% 0.25 kB 0.97 kB +107.32% 0.16 kB 0.34 kB
oss-experimental/react-server-dom-webpack/server.node.js +48.26% 0.72 kB 1.07 kB +18.92% 0.30 kB 0.35 kB
oss-stable-semver/react-server-dom-webpack/server.node.js +48.26% 0.72 kB 1.07 kB +18.92% 0.30 kB 0.35 kB
oss-stable/react-server-dom-webpack/server.node.js +48.26% 0.72 kB 1.07 kB +18.92% 0.30 kB 0.35 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-server-dom-webpack/cjs/react-server-dom-webpack-client.node-webstreams.development.js New file 0.00 kB 123.95 kB New file 0.00 kB 23.29 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node-webstreams.production.js New file 0.00 kB 59.87 kB New file 0.00 kB 12.23 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node-webstreams.development.js New file 0.00 kB 172.96 kB New file 0.00 kB 32.07 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node-webstreams.production.js New file 0.00 kB 99.24 kB New file 0.00 kB 20.24 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node-webstreams.development.js New file 0.00 kB 108.29 kB New file 0.00 kB 20.39 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node-webstreams.production.js New file 0.00 kB 59.32 kB New file 0.00 kB 12.14 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node-webstreams.development.js New file 0.00 kB 156.17 kB New file 0.00 kB 28.86 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node-webstreams.production.js New file 0.00 kB 94.64 kB New file 0.00 kB 19.39 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node-webstreams.development.js New file 0.00 kB 108.29 kB New file 0.00 kB 20.39 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node-webstreams.production.js New file 0.00 kB 59.32 kB New file 0.00 kB 12.14 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node-webstreams.development.js New file 0.00 kB 156.17 kB New file 0.00 kB 28.86 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node-webstreams.production.js New file 0.00 kB 94.64 kB New file 0.00 kB 19.39 kB
oss-experimental/react-server-dom-webpack/client.node.js +292.34% 0.25 kB 0.97 kB +107.32% 0.16 kB 0.34 kB
oss-stable-semver/react-server-dom-webpack/client.node.js +292.34% 0.25 kB 0.97 kB +107.32% 0.16 kB 0.34 kB
oss-stable/react-server-dom-webpack/client.node.js +292.34% 0.25 kB 0.97 kB +107.32% 0.16 kB 0.34 kB
oss-experimental/react-server-dom-webpack/server.node.js +48.26% 0.72 kB 1.07 kB +18.92% 0.30 kB 0.35 kB
oss-stable-semver/react-server-dom-webpack/server.node.js +48.26% 0.72 kB 1.07 kB +18.92% 0.30 kB 0.35 kB
oss-stable/react-server-dom-webpack/server.node.js +48.26% 0.72 kB 1.07 kB +18.92% 0.30 kB 0.35 kB

Generated by 🚫 dangerJS against e51f035

@sebmarkbage sebmarkbage force-pushed the nodewebstreamswebpack branch 3 times, most recently from b6e1c12 to 8c5b422 Compare June 6, 2025 04:39
installedHook.disable();
// We unmount when there's more than two hooks installed.
// We use two because the build of server.node actually installs two hooks.
// One in each build.
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

This reveals that we're actually installing two async_hooks when you import server.node. One in the Node build and one in the Node Web Streams build. 😬 Since it's a side-effect of requiring these.

Basically you have to deep link to make it optimized.

unstubbable
unstubbable previously approved these changes Jun 6, 2025
};
exports.createServerReference = function (i, c, e, d, f) {
return w.registerServerReference(
n.createServerReference(i, c, e, d, f),
Copy link
Collaborator

Choose a reason for hiding this comment

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

I missed this in #33442, but c, e, d, f are all ignored for the edge and node builds, aren't they? The original function with all params only seems be exported in the browser build, if I'm not mistaken.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

They are now but I'm not sure they always will so for now just passing along the fully signature in case we change it.

We really should have one of these builds for SSR and a different one for RSC because they have different constraints. Calling a Server Reference from RSC should maybe be ok.

Also, we should really be passing the DEV only findSourceMapURL and functionName through since they can be useful for DEV features.

So we should really accept all args.

exports.registerServerReference = function (r, i, e) {
return w.registerServerReference(n.registerServerReference(r, i, e), i, e);
};
exports.createServerReference = function (i, c, e, d, f) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Will this wrapper mess with source mapping? I remember you mentioned in the past that module indirection is ok, but wrapper is not, because React doesn't let you customize how many stack frames to pop.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

That only matters on the server entry point and that one isn't wrapped because they are not using module state but instead attaches meta data on the function. I was hoping to change that to be the shared state model as the client but if we do that we'll just also have to hoist that shared state into a separate internal bundle.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

Actually I'm wrong about this. It doesn't matter for registerServerReference but it does matter for createServerReference.

@unstubbable unstubbable self-requested a review June 6, 2025 09:26
@unstubbable unstubbable dismissed their stale review June 6, 2025 09:27

The latest question should be clarified first.

@sebmarkbage sebmarkbage merged commit e8d15fa into facebook:main Jun 6, 2025
242 checks passed
sebmarkbage added a commit that referenced this pull request Jun 6, 2025
sebmarkbage added a commit that referenced this pull request Jun 6, 2025
Reverts #33457, #33456 and #33442.

There are too many issues with wrappers, lazy init, stateful modules,
duplicate instantiation of async_hooks and duplication of code.

Instead, we'll just do a wrapper polyfill that uses Node Streams
internally.

I kept the client indirection files that I added for consistency with
the server though.
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