issue-tracking

이슈 트래킹 - lazy loading

프론트루나 2024. 9. 17. 16:42
반응형

회사에서 프로모션을 진행하는데, 여러장의 이미지를 순차적으로 불러와서 보여줘야하는데, 디바이스에 따라 로딩 속도가 현저히 느리거나 페이지를 아예 불러오지 못하는 이슈가 발생했다.

대부분의 디바이스에서 정상적으로 불러왔지만, 일부 디바이스에서 불러오지 못하거나 수 초의 버벅임이 발생했다.

첫번째로 해결한 방법은 통이미지를 여러개의 이미지로 크롭해서 올리는 방식이었다.
여기에 조건은 크롭한 이미지들이 1MB이하의 크기였다.
이 방법으로 대부분의 디바이스에서 해결이 되었다. 그러나 아직도 일부 디바이스에서 동일한 현상이 발생했다.

우리 회사의 프로젝트는 Spring boot framework에 vue 를 cdn으로 불러와서 사용하며 여러장의 이미지를 v-html으로 불러온다.

solve1)

파일명만 다른 이미지 엘리먼트를 20여번 불러와야하는데, v-html내의 스크립트 선언이 적용되지 않았다.
스크립트에서 반복문으로 이미지 엘리먼트를 생성해서 div에 append 시키는 방식이었다.

<script>
for(let i = 0; i< 20; i++) {
    const image = document.createElement("img");
    image.setAttribute("src", "${imageurl}");
    ${상위엘리먼트}.appendChild(image);
}
</script>

소스상에 선언되어있는 div에 appendChild로 이미지를 붙여주려고 했으나 동작하지 않음.

solve 1-1)

스크립트가 미작동하는지 확인하기 위해 크롬 콘솔에서 확인해보니 정상적으로 엘리먼트가 생성되었고,
정상적으로 하위 엘리먼트로 생성되어 정상적으로 노출되었다.
그렇다면 스크립트상에는 이상이 없고 v-html에서 작동이 안된다는 결론에 이른다.

solve1 Note

조금만 생각해보면 안되는 이유를 바로 알 수 있었다.
vue가 화면을 그릴때 모든 스크립트가 스코프에 의해 상단에서 렌더링된다.
html 화면을 그리기전 스크립트가 먼저 실행되었고 div 요소가 없었으니 append가 안되었을거다.

solve2)

반응형