Home Intersection Observer를 활용한 이미지 lazy 로딩
Post
Cancel

Intersection Observer를 활용한 이미지 lazy 로딩

Performance

Intersection Observer를 사용한 이미지 Lazy 로딩은 해당 이미지가 뷰포트에 보여졌을 때 로딩을 하는 방법이다.

예를 들어 어떤 홈페이지의 메인 컨텐츠로 보여야할 동영상이 하나 있고, 그 아래쪽에는 여러 이미지들이 있는 페이지라고 가정해보자

image



메인 컨텐츠가 동영상 이기 때문에 사용자가 가장 먼저 봐야 할 컨텐츠는 동영상이어야 한다. 하지만 아래와 같은 상황 때문에 동영상을 바로 못 볼수도 있다. (이미지를 다운로드 하고 있을 동안 동영상은 대기 중 상태이다)

image



시간이 지나고 이미지 다운로드가 얼추 완료되면 그제서야 동영상이 다운로드 되는 것을 알 수 있다.

image



즉, 화면에 보이지 않는 이미지 때문에 정작 사용자가 메인으로 봐야 할 컨텐츠를 제대로 못 보는 경우가 생길 수도 있다. 그렇기 때문에 이미지가 Viewport에 보일 때 다운로드 함으로써 사용자 경험을 좋게 할 수 있다.

이것이 바로 이미지 Lazy 로딩 기법이다.



사용 방법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const Card = (props) => {
  const imageRef = useRef(null);

  useEffect(() => {
    const options = {};
    const callback = (entries, observer) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          entry.target.src = entry.target.dataset.src;

          // 이미 감지되어서 해당 로직이 실행되었기 때문에 감지를 해제시켜준다.
          observer.unobserve(entry.target);
        }
      });
    };

    const observer = new IntersectionObserver(callback, options);

    observer.observe(imageRef.current);
  }, []);

  return (
    <div>
      <!-- 이미지가 Viewport 들어왔을  src 지정해 줄것이다 -->
      <img data-src={props.image} ref={imageRef} />
    </div>
  );
}

export default Card;

This post is licensed under CC BY 4.0 by the author.

문제해결 패턴 - 슬라이딩 윈도우

이미지 사이즈 최적화