Skip to content

Commit af9bd4a

Browse files
committed
Fix ESM issue with React 19
1 parent e45c669 commit af9bd4a

File tree

1 file changed

+14
-8
lines changed

1 file changed

+14
-8
lines changed

node_package/src/reactHydrateOrRender.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
/* eslint-disable global-require,@typescript-eslint/no-require-imports */
12
import type { ReactElement } from 'react';
2-
import * as ReactDOM from 'react-dom';
33
import type { RenderReturnType } from './_types.ts';
44
import { supportsRootApi } from './reactApis.ts';
55

@@ -8,26 +8,33 @@ type HydrateOrRenderType = (domNode: Element, reactElement: ReactElement) => Ren
88
// TODO: once React dependency is updated to >= 18, we can remove this and just
99
// import ReactDOM from 'react-dom/client';
1010
let reactDomClient: typeof import('react-dom/client');
11+
// Can't just import react-dom because that breaks ESM under React 19
12+
let reactDom: typeof import('react-dom');
1113
if (supportsRootApi) {
1214
// This will never throw an exception, but it's the way to tell Webpack the dependency is optional
1315
// https://github.com/webpack/webpack/issues/339#issuecomment-47739112
1416
// Unfortunately, it only converts the error to a warning.
1517
try {
16-
// eslint-disable-next-line global-require,@typescript-eslint/no-require-imports
1718
reactDomClient = require('react-dom/client') as typeof import('react-dom/client');
1819
} catch (_e) {
1920
// We should never get here, but if we do, we'll just use the default ReactDOM
2021
// and live with the warning.
21-
reactDomClient = ReactDOM as unknown as typeof import('react-dom/client');
22+
reactDomClient = require('react-dom') as unknown as typeof import('react-dom/client');
23+
}
24+
} else {
25+
try {
26+
reactDom = require('react-dom') as typeof import('react-dom');
27+
} catch (_e) {
28+
// Also should never happen
2229
}
2330
}
2431

25-
/* eslint-disable react/no-deprecated,@typescript-eslint/no-deprecated,@typescript-eslint/no-non-null-assertion --
32+
/* eslint-disable @typescript-eslint/no-deprecated,@typescript-eslint/no-non-null-assertion --
2633
* while we need to support React 16
2734
*/
2835
const reactHydrate: HydrateOrRenderType = supportsRootApi
2936
? reactDomClient!.hydrateRoot
30-
: (domNode, reactElement) => ReactDOM.hydrate(reactElement, domNode);
37+
: (domNode, reactElement) => reactDom!.hydrate(reactElement, domNode);
3138

3239
function reactRender(domNode: Element, reactElement: ReactElement): RenderReturnType {
3340
if (supportsRootApi) {
@@ -36,10 +43,9 @@ function reactRender(domNode: Element, reactElement: ReactElement): RenderReturn
3643
return root;
3744
}
3845

39-
// eslint-disable-next-line react/no-render-return-value
40-
return ReactDOM.render(reactElement, domNode);
46+
return reactDom!.render(reactElement, domNode);
4147
}
42-
/* eslint-enable react/no-deprecated,@typescript-eslint/no-deprecated,@typescript-eslint/no-non-null-assertion */
48+
/* eslint-enable @typescript-eslint/no-deprecated,@typescript-eslint/no-non-null-assertion */
4349

4450
export default function reactHydrateOrRender(
4551
domNode: Element,

0 commit comments

Comments
 (0)