@@ -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+ const [ResizeObserver , setResizeObserver ] = useState (
89+ window .ResizeObserver );
90+
8591useEffect (() => {
92+ if (ResizeObserver) {
93+ return ; // don't need to load the ponyfill
94+ }
8695 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 => {
88100 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 );
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