@@ -64,34 +64,50 @@ 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+ getResizeObserverOrPonyfill ().then (lib => {
88100 if (! cancelled) {
89- setResizeObserverApi (observer);
101+ // must wrap `lib` in a function: `ResizeObserver` is a function
102+ // itself, so prevent the state hook from interpreting as a reducer
103+ setResizeObserver (() => lib);
90104 }
91105 });
106+
92107 return () => {
108+ // if unmounted before complete, don't call set state
93109 cancelled = true ;
94110 }
95111}, []);
96- useComponentSize (ref, { ResizeObserver: ResizeObserverApi });
112+ useComponentSize (ref, { ResizeObserver });
97113```
0 commit comments