Skip to content

solbijae/front_5th_chapter4-2_basic

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

15 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

바닐라 JS 프로젝트 성능 개선

성능 개선 보고서

초기 성능

개선 후 성능


개선 세부 내용

이미지 jpg/png → webp

  • cwebp (Google의 공식 WebP 인코더)

    • 가장 안정적이고 널리 사용됨
    • 다양한 품질 설정 옵션
    • 명령줄 인터페이스로 쉬운 사용
  • 사용법

    • brew install webp
    • cd images && for file in *.jpg; do cwebp -q 80 -m 4 "$file" -o "${file%.jpg}.webp"; done
  • 결과

    이미지 변환 전 크기 변환 후 크기 감소 비율
    Hero_Desktop.jpg 1.0MB 188KB 81%
    Hero_Mobile.jpg 405KB 63KB 84%
    Hero_Tablet.jpg 769KB 123KB 84%
    vr1.jpg 52KB 7.4KB 86%
    vr2.jpg 89KB 14KB 84%
    vr3.jpg 75KB 9.5KB 87%

lazy loading 적용

  • 예시

    <picture>
    	<source srcset="images/vr2.webp" type="image/webp">
    	<img src="images/vr2.jpg" alt="product: Noise Cancelling Headphone" loading="lazy">
    </picture>
  • 결과

    1. 화면에 보이지 않는 이미지들은 지연 로딩
    2. 초기 페이지 로딩 시간이 개선
    3. 대역폭 사용량이 줄어듬

LCP 성능 개선

  1. LCP(Largest Contentful Paint)란?

    • 페이지 로드 중에 뷰포트(화면)에 표시되는 가장 큰 콘텐츠 요소가 그려지는 시간
    • 사용자가 페이지의 주요 콘텐츠를 볼 수 있는 시점을 의미
    • 현재 사이트에서는 모바일 Hero 이미지가 LCP 요소로 확인됨
  2. 현재 문제 상황

    • LCP 시간: 5,020ms (목표: 2.5초 이내)
    • 주요 지연 요소:
    • 로드 지연: 2,290ms (46%)
    • 로드 시간: 1,500ms (30%)
    • 렌더링 지연: 480ms (10%)
    • TTFB: 750ms (15%)
  3. 개선 작업

    <!-- 모바일 이미지 (LCP 요소) -->
    <picture>
        <source srcset="images/Hero_Mobile.webp" type="image/webp">
        <img class="mobile" src="images/Hero_Mobile.jpg" fetchpriority="high">
    </picture>
    
    <!-- 데스크톱/태블릿 이미지 -->
    <picture>
        <source srcset="images/Hero_Desktop.webp" type="image/webp">
        <img class="desktop" src="images/Hero_Desktop.jpg" loading="lazy" fetchpriority="low">
    </picture>
    <picture>
        <source srcset="images/Hero_Tablet.webp" type="image/webp">
        <img class="tablet" src="images/Hero_Tablet.jpg" loading="lazy" fetchpriority="low">
    </picture>
  4. 최적화 이유와 방법

    1. 모바일 이미지 최적화
      • 이유: LCP 요소이므로 가장 먼저 로드되어야 함
      • 방법:
      • fetchpriority="high" 추가로 우선 로딩
      • loading="lazy" 제거로 지연 로딩 방지
    2. 데스크톱/태블릿 이미지 최적화
      • 이유: 화면에 보이지 않을 수 있어 우선순위가 낮아도 됨
      • 방법:
      • fetchpriority="low" 추가로 우선순위 낮춤
      • loading="lazy" 유지로 필요할 때 로딩

이미지 크기 적절하게 설정하기

  • 방법

    cwebp -q 80 -m 4 -resize 1440 670 Hero_Desktop.jpg -o Hero_Desktop.webp && cwebp -q 80 -m 4 -resize 960 770 Hero_Tablet.jpg -o Hero_Tablet.webp && cwebp -q 80 -m 4 -resize 576 576 Hero_Mobile.jpg -o Hero_Mobile.webp && cwebp -q 80 -m 4 -resize 500 500 vr1.jpg -o vr1.webp && cwebp -q 80 -m 4 -resize 500 500 vr2.jpg -o vr2.webp && cwebp -q 80 -m 4 -resize 500 500 vr3.jpg -o vr3.webp
  • 결과

    이미지 변환 전 크기 변환 전 크기 감소 비율
    Hero_Desktop.jpg 188KB 113.2KB 38%
    Hero_Mobile.jpg 63KB 37.9KB 40%
    Hero_Tablet.jpg 123KB 74.3KB 38%
    vr1.jpg 7.4KB 4.7KB 36%
    vr2.jpg 14KB 9.0KB 37%
    vr3.jpg 9.5KB 5.7KB 40%

이미지 접근성 개선을 위한 alt 속성 추가

폰트 로딩 최적화

쿠키 동의 배너 스크립트 에러 해결

  • 문제 상황
    • 에러 메시지: Cannot read properties of null (reading 'insertAdjacentElement')
      • 쿠키 동의 배너가 정상적으로 표시되지 않는 문제 발생
  • 원인 분석
    • 쿠키 동의 스크립트가 DOM이 완전히 로드되기 전에 실행되어 발생
    • 스크립트가 head 태그 내에서 실행되어 DOM 요소에 접근할 수 없었음
  • 해결 방법
    1. 쿠키 동의 스크립트를 DOMContentLoaded 이벤트 이후에 실행되도록 수정
    2. 스크립트 위치를 body 태그 끝부분으로 이동
  • 결과
    • 쿠키 동의 배너가 정상적으로 표시됨
    • 스크립트 에러가 해결됨

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • CSS 52.2%
  • HTML 37.9%
  • JavaScript 9.9%