@@ -64,34 +64,51 @@ useComponentSize(ref, { ResizeObserver });
6464
6565If you are using Webpack (or similar) you could use [ dynamic
6666imports] ( 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:
6869
6970``` 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;
7780 }
78- return import (' resize-observer-polyfill' );
81+ ResizeObserverPonyfill = (await import (" resize-observer-polyfill" )).default ;
82+ return ResizeObserverPonyfill;
7983}
84+
8085```
8186
82- And in your component:
8387``` js
84- const [ResizeObserverApi , setResizeObserverApi ] = setState ();
88+ // Your component
89+ const [ResizeObserver , setResizeObserver ] = useState (
90+ window .ResizeObserver );
91+
8592useEffect (() => {
93+ if (ResizeObserver) {
94+ return ; // don't need to load the ponyfill
95+ }
8696 let cancelled = false ;
87- getResizeObserver ().then (observer => {
97+
98+ // if imported multiple times, should load from browser cache;
99+ // or you can cache this in a variable
100+ getResizeObserverOrPonyfill ().then (lib => {
88101 if (! cancelled) {
89- setResizeObserverApi (observer);
102+ // must wrap `lib` in a function: `ResizeObserver` is a function
103+ // itself, so prevent the state hook from interpreting as a reducer
104+ setResizeObserver (() => lib);
90105 }
91106 });
107+
92108 return () => {
109+ // if unmounted before complete, don't call set state
93110 cancelled = true ;
94111 }
95112}, []);
96- useComponentSize (ref, { ResizeObserver: ResizeObserverApi });
113+ useComponentSize (ref, { ResizeObserver });
97114```
0 commit comments