Skip to content

Commit 8e85731

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

File tree

1 file changed

+31
-14
lines changed

1 file changed

+31
-14
lines changed

README.md

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -64,34 +64,51 @@ 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+
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

Comments
 (0)