Skip to content

Commit 1d20575

Browse files
committed
update readme example for lazy loading
1 parent 192df28 commit 1d20575

File tree

1 file changed

+30
-14
lines changed

1 file changed

+30
-14
lines changed

README.md

+30-14
Original file line numberDiff line numberDiff line change
@@ -64,34 +64,50 @@ useComponentSize(ref, { ResizeObserver });
6464

6565
If you are using Webpack (or similar) you could use [dynamic
6666
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:
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+
8591
useEffect(() => {
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

Comments
 (0)