์น ํ์ด์ง ์ ์ฒด๋ฅผ ๋ถ๋ฌ์์ ํ ๋ฒ์ ์ฌ์ฉ์์๊ฒ ๋ ๋๋งํ๋ ๋์ , ํ์ํ ๋ถ๋ถ๋ง ๋ถ๋ฌ์ค๊ณ ๋๋จธ์ง ๋ถ๋ถ์ ์ฌ์ฉ์๊ฐ ํ์ํ ๋ ๋ถ๋ฌ์ค๋ ๊ธฐ๋ฒ์ด๋ค.
ํ์ํ ์นํ์ด์ง ์ค ์ผ๋ถ๋ง ๋จผ์ ๋ก๋๋๊ธฐ ๋๋ฌธ์ ๋ก๋ฉ ์๊ฐ์ด ๋จ์ถ๋์ด ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๋ฆฌํ๊ณ ์ ์ฅ๊ณต๊ฐ์ด ์ ์ฝ๋๋ค.
์์ง ๋ก๋๋์ง ์์ ์ปจํ ์ธ ์ ๋ถ์ ์ ํ ์ธ๋ฑ์ฑ์ผ๋ก ๊ฒ์ ์์ง์์ ์น์ฌ์ดํธ์ ์์์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
์ฌ์ง์ด๋ ์์์ฒ๋ผ ํฌ๊ธฐ๊ฐ ํฌ๊ฑฐ๋ ์ฌ์ฉ์์๊ฒ ๋ฐ๋ก ๋ณด์ฌ์ง์ง ์๋ ํ์ด์ง ๋ฑ ์ค์๋๊ฐ ๋ฎ์ ์์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
| img, iframe ํ๊ทธ์ loading ์์ฑ
img, iframe ํ๊ทธ์ loading ์์ฑ์ lazy๋ฅผ ์ฌ์ฉํด์ ๊ตฌํํ ์ ์๋ค.
<img src="..." loading="lazy" alt="..." />
<iframe src="..." loading="lazy" />| IntersectionObserver
IntersectionObserver๋ฅผ ์ด์ฉํด์ ํน์ ์์๊ฐ ํ๋ฉด์ ๋ ธ์ถ๋์์ ๋ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ๋๋ก ๊ตฌํํ ์ ์๋ค.
const config = {
rootMargin: "0px 0px 50px 0px",
threshold: 0,
};
let observer = new intersectionObserver(function (entries, self) {
entries.forEach(entry => {
if (entry.isIntersecting) {
preloadImage(entry.target);
self.unobserve(entry.target);
}
});
}, config);
const imgs = document.querySelectorAll("[data-src]");
imgs.forEach(img => {
observer.observe(img);
});| React lazy, Suspense
ํฐ ๊ท๋ชจ์ React ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ์ฒซ ํ์ด์ง๋ฅผ ๋ก๋ํ๋ ์ฆ์ ๋๊ท๋ชจ ๋จ์ผ JavaScript ๋ฒ๋ค์ด ์ฌ์ฉ์์๊ฒ ์ ์ก๋์ด ํ์ด์ง ์ฑ๋ฅ์ ์ ํํ ์ ์๋ค.
React์์ ์ ๊ณตํ๋ lazy ๋ฉ์๋์ Suspense ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ ์ ์๋ค.
import { Suspense, lazy } from "react";
import Loading from "./Loading.js";
const LazyComponent = lazy(() => import("./LazyComponent.js"));
export default function MyComponent() {
return (
<Suspense fallback={<Loading />}>
<LazyComponent />
</Suspense>
);
}