@@ -64,34 +64,51 @@ useComponentSize(ref, { ResizeObserver });
64
64
65
65
If you are using Webpack (or similar) you could use [ dynamic
66
66
imports] ( https://webpack.js.org/api/module-methods/#import ) , to load the
67
- Polyfill only if needed. A basic implementation could look something like this:
67
+ Polyfill only if needed. A basic implementation in your component could look
68
+ something like this:
68
69
69
70
``` js
70
- function getResizeObserver () {
71
- if (
72
- ' ResizeObserver' in global &&
73
- ' ResizeObserverEntry' in global &&
74
- ' contentRect' in ResizeObserverEntry .prototype
75
- ) {
76
- return Promise .resolve (ResizeObserver);
71
+ // GetResizeObserver.js
72
+ // Ponyfill, not polyfill, since we're not chaging the global
73
+ // `window.ResizeObserver` variable
74
+ let ResizeObserverPonyfill;
75
+
76
+ export async function getResizeObserverOrPonyfill () {
77
+ const BuiltinResizeObserver = window .ResizeObserver ;
78
+ if (BuiltinResizeObserver) {
79
+ return BuiltinResizeObserver;
77
80
}
78
- return import (' resize-observer-polyfill' );
81
+ ResizeObserverPonyfill = (await import (" resize-observer-polyfill" )).default ;
82
+ return ResizeObserverPonyfill;
79
83
}
84
+
80
85
```
81
86
82
- And in your component:
83
87
``` js
84
- const [ResizeObserverApi , setResizeObserverApi ] = setState ();
88
+ const [ResizeObserver , setResizeObserver ] = useState (
89
+ window .ResizeObserver );
90
+
85
91
useEffect (() => {
92
+ if (ResizeObserver) {
93
+ return ; // don't need to load the ponyfill
94
+ }
86
95
let cancelled = false ;
87
- getResizeObserver ().then (observer => {
96
+
97
+ // if imported multiple times, should load from browser cache;
98
+ // or you can cache this in a variable
99
+ import (" resize-observer-polyfill" ).then (lib => {
88
100
if (! cancelled) {
89
- setResizeObserverApi (observer);
101
+ // must wrap `lib.default` in a function: `ResizeObserver` is a
102
+ // function itself, so prevent the state hook from interpreting
103
+ // it as a reducer
104
+ setResizeObserver (() => lib .default );
90
105
}
91
106
});
107
+
92
108
return () => {
109
+ // if unmounted before complete, don't call set state
93
110
cancelled = true ;
94
111
}
95
112
}, []);
96
- useComponentSize (ref, { ResizeObserver: ResizeObserverApi });
113
+ useComponentSize (ref, { ResizeObserver });
97
114
```
0 commit comments