현재 화면에 보이지 않는 이미지들을 Lazy loading 처리를 시켜 웹 페이지 초기의 로딩시간을 단축해 웹 성능을 향상 시킬 수 있다.
이미지들의 로딩을 지연시키기 위해 img 태그의 src 속성 대신에 data-src 속성에 이미지 url을 넣는다. 엘리먼트가 뷰포트에 들어간 것을 IO API가 감지 했을 때 isIntersecting 속성을 이용해 url을 data-src 속성에서 src 속성으로 이동시켜 브라우저가 이미지를 로드하도록 한다. 전부 로드되면 lazy 클래스명을 이미지에서 삭제하고 옵저버도 제거한다.
export const useLazyLoading = () => {
const imgs = document.querySelectorAll(".lazy");
const observerCallback = (entries, observer) => {
entries.forEach(({ isIntersecting, intersectionRatio, target }) => {
if (isIntersecting && intersectionRatio > 0) {
target.src = target.dataset.src;
target.classList.remove("lazy");
observer.unobserve(target);
}
});
};
const io = new IntersectionObserver(observerCallback);
imgs.forEach((img) => io.observe(img));
};
[출처]
https://velog.io/@swhan9404/%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EC%B5%9C%EC%A0%81%ED%99%94-image-lazy-loading
https://helloinyong.tistory.com/m/297
https://onlydev.tistory.com/m/104