Skip to content

Commit 189f70e

Browse files
sebmarkbagegaearon
andauthored
Create a bunch of custom webpack vs unbundled node bundles (#26172)
We currently have an awkward set up because the server can be used in two ways. Either you can have the server code prebundled using Webpack (what Next.js does in practice) or you can use an unbundled Node.js server (what the reference implementation does). The `/client` part of RSC is actually also available on the server when it's used as a consumer for SSR. This should also be specialized depending on if that server is Node or Edge and if it's bundled or unbundled. Currently we still assume Edge will always be bundled since we don't have an interceptor for modules there. I don't think we'll want to support this many combinations of setups for every bundler but this might be ok for the reference implementation. This PR doesn't actually change anything yet. It just updates the plumbing and the entry points that are built and exposed. In follow ups I'll fork the implementation and add more features. --------- Co-authored-by: dan <dan.abramov@me.com>
1 parent fbf3bc3 commit 189f70e

30 files changed

+257
-33
lines changed

fixtures/flight-browser/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ <h1>Flight Example</h1>
2020
<script src="../../build/node_modules/react-dom/umd/react-dom.development.js"></script>
2121
<script src="../../build/node_modules/react-dom/umd/react-dom-server.browser.development.js"></script>
2222
<script src="../../build/node_modules/react-server-dom-webpack/umd/react-server-dom-webpack-server.browser.development.js"></script>
23-
<script src="../../build/node_modules/react-server-dom-webpack/umd/react-server-dom-webpack-client.development.js"></script>
23+
<script src="../../build/node_modules/react-server-dom-webpack/umd/react-server-dom-webpack-client.browser.development.js"></script>
2424
<script src="https://unpkg.com/babel-standalone@6/babel.js"></script>
2525
<script type="text/babel">
2626
let Suspense = React.Suspense;

packages/react-client/src/forks/ReactFlightClientHostConfig.dom-bun.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,11 @@
99

1010
export * from 'react-client/src/ReactFlightClientHostConfigBrowser';
1111
export * from 'react-client/src/ReactFlightClientHostConfigStream';
12-
export * from 'react-server-dom-webpack/src/ReactFlightClientWebpackBundlerConfig';
12+
13+
export type Response = any;
14+
export opaque type BundlerConfig = mixed;
15+
export opaque type ClientReferenceMetadata = mixed;
16+
export opaque type ClientReference<T> = mixed; // eslint-disable-line no-unused-vars
17+
export const resolveClientReference: any = null;
18+
export const preloadModule: any = null;
19+
export const requireModule: any = null;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
export * from 'react-client/src/ReactFlightClientHostConfigBrowser';
11+
export * from 'react-client/src/ReactFlightClientHostConfigStream';
12+
export * from 'react-server-dom-webpack/src/ReactFlightClientWebpackBundlerConfig';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
export * from 'react-dom-bindings/src/client/ReactDOMHostConfig';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
export * from './src/ReactFlightDOMClient';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
export * from './src/ReactFlightDOMClient';

packages/react-server-dom-webpack/client.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@
77
* @flow
88
*/
99

10-
export * from './src/ReactFlightDOMClient';
10+
export * from './client.browser';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
export * from './src/ReactFlightDOMClient';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
export * from './src/ReactFlightDOMClient';
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
if (process.env.NODE_ENV === 'production') {
4+
module.exports = require('./cjs/react-server-dom-webpack-client.browser.production.min.js');
5+
} else {
6+
module.exports = require('./cjs/react-server-dom-webpack-client.browser.development.js');
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
if (process.env.NODE_ENV === 'production') {
4+
module.exports = require('./cjs/react-server-dom-webpack-client.edge.production.min.js');
5+
} else {
6+
module.exports = require('./cjs/react-server-dom-webpack-client.edge.development.js');
7+
}
Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
11
'use strict';
22

3-
if (process.env.NODE_ENV === 'production') {
4-
module.exports = require('./cjs/react-server-dom-webpack-client.production.min.js');
5-
} else {
6-
module.exports = require('./cjs/react-server-dom-webpack-client.development.js');
7-
}
3+
module.exports = require('./client.browser');
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
if (process.env.NODE_ENV === 'production') {
4+
module.exports = require('./cjs/react-server-dom-webpack-client.node.production.min.js');
5+
} else {
6+
module.exports = require('./cjs/react-server-dom-webpack-client.node.development.js');
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
if (process.env.NODE_ENV === 'production') {
4+
module.exports = require('./cjs/react-server-dom-webpack-client.node.unbundled.production.min.js');
5+
} else {
6+
module.exports = require('./cjs/react-server-dom-webpack-client.node.unbundled.development.js');
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
'use strict';
2+
3+
if (process.env.NODE_ENV === 'production') {
4+
module.exports = require('./cjs/react-server-dom-webpack-server.node.unbundled.production.min.js');
5+
} else {
6+
module.exports = require('./cjs/react-server-dom-webpack-server.node.unbundled.development.js');
7+
}

packages/react-server-dom-webpack/package.json

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,15 @@
1414
"index.js",
1515
"plugin.js",
1616
"client.js",
17+
"client.browser.js",
18+
"client.edge.js",
19+
"client.node.js",
20+
"client.node.unbundled.js",
1721
"server.js",
1822
"server.browser.js",
1923
"server.edge.js",
2024
"server.node.js",
25+
"server.node.unbundled.js",
2126
"node-register.js",
2227
"cjs/",
2328
"umd/",
@@ -26,20 +31,39 @@
2631
"exports": {
2732
".": "./index.js",
2833
"./plugin": "./plugin.js",
29-
"./client": "./client.js",
34+
"./client": {
35+
"workerd": "./client.edge.js",
36+
"edge-light": "./client.edge.js",
37+
"deno": "./client.edge.js",
38+
"worker": "./client.edge.js",
39+
"node": {
40+
"webpack": "./client.node.js",
41+
"default": "./client.node.unbundled.js"
42+
},
43+
"browser": "./client.browser.js",
44+
"default": "./client.browser.js"
45+
},
46+
"./client.browser": "./client.browser.js",
47+
"./client.edge": "./client.edge.js",
48+
"./client.node": "./client.node.js",
49+
"./client.node.unbundled": "./client.node.unbundled.js",
3050
"./server": {
3151
"react-server": {
32-
"edge-light": "./server.edge.js",
3352
"workerd": "./server.edge.js",
53+
"edge-light": "./server.edge.js",
3454
"deno": "./server.browser.js",
35-
"node": "./server.node.js",
55+
"node": {
56+
"webpack": "./server.node.js",
57+
"default": "./server.node.unbundled.js"
58+
},
3659
"browser": "./server.browser.js"
3760
},
3861
"default": "./server.js"
3962
},
4063
"./server.browser": "./server.browser.js",
4164
"./server.edge": "./server.edge.js",
4265
"./server.node": "./server.node.js",
66+
"./server.node.unbundled": "./server.node.unbundled.js",
4367
"./node-loader": "./esm/react-server-dom-webpack-node-loader.js",
4468
"./node-register": "./node-register.js",
4569
"./src/*": "./src/*",
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
export * from './src/ReactFlightDOMServerNode';

packages/react-server-dom-webpack/src/ReactFlightWebpackPlugin.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class ClientReferenceDependency extends ModuleDependency {
4040
// without the client runtime so it's the first time in the loading sequence
4141
// you might want them.
4242
const clientImportName = 'react-server-dom-webpack/client';
43-
const clientFileName = require.resolve('../client');
43+
const clientFileName = require.resolve('../client.browser.js');
4444

4545
type ClientReferenceSearchPath = {
4646
directory: string,

packages/react-server-dom-webpack/src/__tests__/ReactFlightDOM-test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ describe('ReactFlightDOM', () => {
4545
use = React.use;
4646
Suspense = React.Suspense;
4747
ReactDOMClient = require('react-dom/client');
48-
ReactServerDOMWriter = require('react-server-dom-webpack/server.node');
48+
ReactServerDOMWriter = require('react-server-dom-webpack/server.node.unbundled');
4949
ReactServerDOMReader = require('react-server-dom-webpack/client');
5050

5151
ErrorBoundary = class extends React.Component {

packages/react-server/src/forks/ReactFlightServerConfig.dom-bun.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88
*/
99

1010
export * from '../ReactFlightServerConfigStream';
11-
export * from 'react-server-dom-webpack/src/ReactFlightServerWebpackBundlerConfig';
11+
export * from '../ReactFlightServerBundlerConfigCustom';
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
export * from '../ReactFlightServerConfigStream';
11+
export * from 'react-server-dom-webpack/src/ReactFlightServerWebpackBundlerConfig';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
export * from 'react-dom-bindings/src/server/ReactDOMServerFormatConfig';
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/**
2+
* Copyright (c) Meta Platforms, Inc. and affiliates.
3+
*
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*
7+
* @flow
8+
*/
9+
10+
export * from '../ReactServerStreamConfigNode';

scripts/rollup/bundles.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,15 @@ const bundles = [
357357
wrapWithModuleBoundaries: false,
358358
externals: ['react', 'util', 'async_hooks', 'react-dom'],
359359
},
360+
{
361+
bundleTypes: [NODE_DEV, NODE_PROD],
362+
moduleType: RENDERER,
363+
entry: 'react-server-dom-webpack/server.node.unbundled',
364+
global: 'ReactServerDOMServer',
365+
minifyWithProdErrorCodes: false,
366+
wrapWithModuleBoundaries: false,
367+
externals: ['react', 'util', 'async_hooks', 'react-dom'],
368+
},
360369
{
361370
bundleTypes: [NODE_DEV, NODE_PROD],
362371
moduleType: RENDERER,
@@ -371,7 +380,34 @@ const bundles = [
371380
{
372381
bundleTypes: [NODE_DEV, NODE_PROD, UMD_DEV, UMD_PROD],
373382
moduleType: RENDERER,
374-
entry: 'react-server-dom-webpack/client',
383+
entry: 'react-server-dom-webpack/client.browser',
384+
global: 'ReactServerDOMClient',
385+
minifyWithProdErrorCodes: false,
386+
wrapWithModuleBoundaries: false,
387+
externals: ['react'],
388+
},
389+
{
390+
bundleTypes: [NODE_DEV, NODE_PROD],
391+
moduleType: RENDERER,
392+
entry: 'react-server-dom-webpack/client.node',
393+
global: 'ReactServerDOMClient',
394+
minifyWithProdErrorCodes: false,
395+
wrapWithModuleBoundaries: false,
396+
externals: ['react'],
397+
},
398+
{
399+
bundleTypes: [NODE_DEV, NODE_PROD],
400+
moduleType: RENDERER,
401+
entry: 'react-server-dom-webpack/client.node.unbundled',
402+
global: 'ReactServerDOMClient',
403+
minifyWithProdErrorCodes: false,
404+
wrapWithModuleBoundaries: false,
405+
externals: ['react'],
406+
},
407+
{
408+
bundleTypes: [NODE_DEV, NODE_PROD],
409+
moduleType: RENDERER,
410+
entry: 'react-server-dom-webpack/client.edge',
375411
global: 'ReactServerDOMClient',
376412
minifyWithProdErrorCodes: false,
377413
wrapWithModuleBoundaries: false,

0 commit comments

Comments
 (0)