Skip to content

Commit 0f05bd8

Browse files
committed
Optimize react-dom/server bundle size
1 parent bab3995 commit 0f05bd8

File tree

4 files changed

+12
-24
lines changed

4 files changed

+12
-24
lines changed

node_package/src/handleError.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as React from 'react';
2-
import { ReactDOMServer } from './reactApis.cts';
2+
import { renderToString } from './reactApis.cts';
33
import type { ErrorOptions } from './types/index.ts';
44

55
function handleRenderFunctionIssue(options: ErrorOptions): string {
@@ -60,8 +60,8 @@ Message: ${e.message}
6060
${e.stack}`;
6161

6262
const reactElement = React.createElement('pre', null, msg);
63-
if (typeof ReactDOMServer.renderToString === 'function') {
64-
return ReactDOMServer.renderToString(reactElement);
63+
if (typeof renderToString === 'function') {
64+
return renderToString(reactElement);
6565
}
6666
return msg;
6767
}

node_package/src/reactApis.cts

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ export const supportsRootApi = reactMajorVersion >= 18;
1010

1111
export const supportsHydrate = supportsRootApi || 'hydrate' in ReactDOM;
1212

13+
// since we're in a .cts file, react-dom/server will work for all React versions
14+
export { renderToPipeableStream, renderToString, type PipeableStream } from 'react-dom/server';
15+
1316
// TODO: once React dependency is updated to >= 18, we can remove this and just
1417
// import ReactDOM from 'react-dom/client';
1518
let reactDomClient: typeof import('react-dom/client');
@@ -26,21 +29,6 @@ if (supportsRootApi) {
2629
}
2730
}
2831

29-
export const ReactDOMServer = /* #__PURE */ (() => {
30-
try {
31-
// in react-dom v18+
32-
return require('react-dom/server') as typeof import('react-dom/server');
33-
} catch (_e) {
34-
try {
35-
// in react-dom v16 or 17
36-
return require('react-dom/server.js') as typeof import('react-dom/server');
37-
} catch (_e2) {
38-
// this should never happen, one of the above requires should succeed
39-
return undefined as unknown as typeof import('react-dom/server');
40-
}
41-
}
42-
})();
43-
4432
type HydrateOrRenderType = (domNode: Element, reactElement: ReactElement) => RenderReturnType;
4533

4634
/* eslint-disable @typescript-eslint/no-deprecated,@typescript-eslint/no-non-null-assertion,react/no-deprecated --

node_package/src/serverRenderReactComponent.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import createReactOutput from './createReactOutput.ts';
66
import { isPromise, isServerRenderHash } from './isServerRenderResult.ts';
77
import buildConsoleReplay from './buildConsoleReplay.ts';
88
import handleError from './handleError.ts';
9-
import { ReactDOMServer } from './reactApis.cts';
9+
import { renderToString } from './reactApis.cts';
1010
import { createResultObject, convertToError, validateComponent } from './serverRenderUtils.ts';
1111
import type {
1212
CreateReactOutputResult,
@@ -47,7 +47,7 @@ function processServerRenderHash(result: ServerRenderResult, options: RenderOpti
4747

4848
function processReactElement(result: ReactElement): string {
4949
try {
50-
return ReactDOMServer.renderToString(result);
50+
return renderToString(result);
5151
} catch (error) {
5252
console.error(`Invalid call to renderToString. Possibly you have a renderFunction, a function that already
5353
calls renderToString, that takes one parameter. You need to add an extra unused parameter to identify this function

node_package/src/streamServerRenderedReactComponent.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import createReactOutput from './createReactOutput.ts';
66
import { isPromise, isServerRenderHash } from './isServerRenderResult.ts';
77
import buildConsoleReplay from './buildConsoleReplay.ts';
88
import handleError from './handleError.ts';
9-
import { ReactDOMServer } from './reactApis.cts';
9+
import { renderToPipeableStream, PipeableStream } from './reactApis.cts';
1010
import { createResultObject, convertToError, validateComponent } from './serverRenderUtils.ts';
1111
import type { RenderParams, StreamRenderState, StreamableComponentResult } from './types/index.ts';
1212

@@ -101,8 +101,8 @@ export const transformRenderStreamChunksToResultObject = (renderState: StreamRen
101101
},
102102
});
103103

104-
let pipedStream: ReactDOMServer.PipeableStream | null = null;
105-
const pipeToTransform = (pipeableStream: ReactDOMServer.PipeableStream) => {
104+
let pipedStream: PipeableStream | null = null;
105+
const pipeToTransform = (pipeableStream: PipeableStream) => {
106106
pipeableStream.pipe(transformStream);
107107
pipedStream = pipeableStream;
108108
};
@@ -164,7 +164,7 @@ const streamRenderReactComponent = (
164164
return;
165165
}
166166

167-
const renderingStream = ReactDOMServer.renderToPipeableStream(reactRenderedElement, {
167+
const renderingStream = renderToPipeableStream(reactRenderedElement, {
168168
onShellError(e) {
169169
sendErrorHtml(convertToError(e));
170170
},

0 commit comments

Comments
 (0)