File tree Expand file tree Collapse file tree 2 files changed +20
-14
lines changed Expand file tree Collapse file tree 2 files changed +20
-14
lines changed Original file line number Diff line number Diff line change 1
1
import type ReactDOM from 'react-dom' ;
2
2
import type { Root } from 'react-dom/client' ;
3
- import { createRoot } from './react-dom-client' ;
3
+ import { getCreateRoot } from './react-dom-client' ;
4
4
5
5
type Renderable = Parameters < ReactDOM . Renderer > [ 0 ] [ number ] ;
6
6
type ReactHTMLElementDOMRoot = Pick < Root , 'render' | 'unmount' > ;
@@ -42,10 +42,10 @@ class ReactHTMLElement extends HTMLElement {
42
42
this . _mountPoint = mount ;
43
43
}
44
44
45
- root ( ) : ReactHTMLElementDOMRoot {
45
+ async root ( ) : Promise < ReactHTMLElementDOMRoot > {
46
46
if ( this . _root ) return this . _root ;
47
47
48
- this . _root = createRoot ( this . mountPoint ) ;
48
+ this . _root = ( await getCreateRoot ( ) ) ( this . mountPoint ) ;
49
49
return this . _root ;
50
50
}
51
51
@@ -55,8 +55,8 @@ class ReactHTMLElement extends HTMLElement {
55
55
void this . renderRoot ( app ) ;
56
56
}
57
57
58
- renderRoot ( app : Renderable ) : void {
59
- const root = this . root ( ) ;
58
+ async renderRoot ( app : Renderable ) : Promise < void > {
59
+ const root = await this . root ( ) ;
60
60
root . render ( app ) ;
61
61
}
62
62
Original file line number Diff line number Diff line change @@ -5,14 +5,6 @@ type ReactDOM18 = ReactDOMOriginal & {
5
5
createRoot ?: CreateRoot ;
6
6
} ;
7
7
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
-
16
8
type CreateRoot = typeof createRootOriginal ;
17
9
type CreateRootParams = Parameters < CreateRoot > ;
18
10
type ReactDOMOriginal = typeof ReactDOM ;
@@ -30,5 +22,19 @@ const createRootFake = (container: CreateRootParams[0]) => {
30
22
return newRoot ;
31
23
} ;
32
24
25
+ let checkedFor18 = false ;
26
+ let MaybeReactDOM18 : ReactDOM18 ;
33
27
// 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
+ } ;
You can’t perform that action at this time.
0 commit comments