Skip to content

Commit 18421b6

Browse files
committed
Fix: awaiting potential react-dom promise
1 parent 2376cae commit 18421b6

File tree

2 files changed

+20
-14
lines changed

2 files changed

+20
-14
lines changed

src/ReactHTMLElement.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type ReactDOM from 'react-dom';
22
import type { Root } from 'react-dom/client';
3-
import { createRoot } from './react-dom-client';
3+
import { getCreateRoot } from './react-dom-client';
44

55
type Renderable = Parameters<ReactDOM.Renderer>[0][number];
66
type ReactHTMLElementDOMRoot = Pick<Root, 'render' | 'unmount'>;
@@ -42,10 +42,10 @@ class ReactHTMLElement extends HTMLElement {
4242
this._mountPoint = mount;
4343
}
4444

45-
root(): ReactHTMLElementDOMRoot {
45+
async root(): Promise<ReactHTMLElementDOMRoot> {
4646
if (this._root) return this._root;
4747

48-
this._root = createRoot(this.mountPoint);
48+
this._root = (await getCreateRoot())(this.mountPoint);
4949
return this._root;
5050
}
5151

@@ -55,8 +55,8 @@ class ReactHTMLElement extends HTMLElement {
5555
void this.renderRoot(app);
5656
}
5757

58-
renderRoot(app: Renderable): void {
59-
const root = this.root();
58+
async renderRoot(app: Renderable): Promise<void> {
59+
const root = await this.root();
6060
root.render(app);
6161
}
6262

src/react-dom-client.ts

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,6 @@ type ReactDOM18 = ReactDOMOriginal & {
55
createRoot?: CreateRoot;
66
};
77

8-
let MaybeReactDOM18: ReactDOM18;
9-
try {
10-
// eslint-disable-next-line global-require,@typescript-eslint/no-var-requires
11-
MaybeReactDOM18 = require('react-dom/client') as ReactDOM18;
12-
} catch {
13-
MaybeReactDOM18 = ReactDOM as ReactDOM18;
14-
}
15-
168
type CreateRoot = typeof createRootOriginal;
179
type CreateRootParams = Parameters<CreateRoot>;
1810
type ReactDOMOriginal = typeof ReactDOM;
@@ -30,5 +22,19 @@ const createRootFake = (container: CreateRootParams[0]) => {
3022
return newRoot;
3123
};
3224

25+
let checkedFor18 = false;
26+
let MaybeReactDOM18: ReactDOM18;
3327
// eslint-disable-next-line import/prefer-default-export
34-
export const { createRoot = createRootFake } = MaybeReactDOM18;
28+
export const getCreateRoot = async () => {
29+
if (!checkedFor18) {
30+
try {
31+
// eslint-disable-next-line global-require,@typescript-eslint/no-var-requires
32+
MaybeReactDOM18 = (await require('react-dom/client')) as ReactDOM18;
33+
} catch {
34+
MaybeReactDOM18 = ReactDOM as ReactDOM18;
35+
}
36+
checkedFor18 = true;
37+
}
38+
const { createRoot = createRootFake } = MaybeReactDOM18;
39+
return createRoot;
40+
};

0 commit comments

Comments
 (0)