최적화란❓
: 주어진 조건으로 최대 효율을 낼 수 있도록 하는 것
- 컴퓨터 공학에서의 최적화
: 가능한 적은 리소스를 소모하면서 가능한 한 빠르게 원하는 결과를 얻을 수 있도록 하는 것
- 웹 개발에서의 최적화
: 주어진 조건 아래에서 최대한 빠르게 화면을 표시하도록 만드는 것
최적화의 필요성 및 효과
🚀 HTML, CSS 코드 최적화하기
🚀 리소스 로딩 최적화하기
<head>
요소 안에서 불러오기<body>
요소 닫히기 직전에 불러오기🚀 브라우저 이미지 최적화하기
background-position
속성을 사용해 이미지 일정 부분만 클래스 등으로 구분하여 사용하는 방법width
, height
, background-position
속성을 주어 아이콘 생성<head>
요소에 넣어준 뒤 원하는 아이콘을 찾아 사용 환경에 맞는 코드를 복사&붙여넣기<picture>
태그를 이용하여 브라우서 호환에 맞게 분기<picture>
: img 요소의 다중 이미지 리소스를 위한 컨테이너 정의 시 사용하는 태그<source>
태그 내 srcset
에 정의한 포맷을 지원하지 않는다면 <source>
태그는 무시🚀 CDN 사용하기
캐시(Cache)🗄
: 다운로드 받은 데이터나 값을 미리 복사해놓은 임시 장소
- 서버에서 응답 시 헤더에
Cache-Control
을 작성해 전송
Cache-Control: max-age=60
: 해당 파일이 60초 동안 유효하다는 의미- 캐시 유효 시간 동안 같은 데이터를 반복해 받아올 필요❌
- 브라우저 캐시 활용 시 효과
- 캐시 유효 시간 동안 네트워크 리소스 절약 가능
- 브라우저 로딩 속도 개선
- 빠른 사용자 경험 제공 가능
💡 캐시 검증 헤더와 조건부 요청 헤더
: 캐시 유효 시간 종료 후 같은 파일을 받아오는 경우 캐시 파일과 서버 파일을 비교 후 동일할 경우 재사용할 수 있도록 돕는 HTTP 헤더
Last-Modified
: 데이터가 마지막으로 수정된 시점을 의미하는 응답 헤더로 조건부 요청 헤더인 If-Modified-Since
와 함께 사용ETag
: 데이터의 버전을 의미하는 응답 헤더로 조건부 요청 헤더인 If-None-Match
와 함께 사용If-Modified-Since
: 캐시된 리소스의 Last-Modified
값 이후 서버 리소스 수정 여부 확인 뒤 수정되지 않았다면 캐시된 리소스 사용If-None-Match
: 캐시된 리소스의 ETag
값과 현재 서버의 ETag
값의 일치 여부 확인 후 동일할 경우 캐시된 리소스 사용트리쉐이킹(Tree Shaking)🌳
: 나무를 흔들어 잔가지를 털어내듯 불필요한 코드를 제거하는 것
- JavaScript 트리쉐이킹의 필요성
- JavaScript 파일의 크기 증대
- 웹 사이트의 인터랙션↑ → JavaScript의 비중↑
- JavaScript 파일 요청 횟수 역시 증가
- JavaScript 파일 실행 시간 증가
- JavaScript 파일 실행 과정
: 다운로드 후 압축 해제 → JavaScript 코드 파싱 → DOM 트리 생성 → 컴파일 → 코드 실행- JavaScript 파일 실행은 CPU에 크게 영향 받음
- 모바일 환경에서 그 영향이 크게 부각(사양이 각기 다르므로)
JavaScript 트리쉐이킹
: 웹팩 4버전 이상 사용 시 ES6 모듈(import
, export
)을 대상으로 기본적인 트리쉐이킹 제공
JavaScript 트리쉐이킹 수행 방법
import
지원❌, commonJS 문법의 require
로 변경require
는 export
되는 모든 모듈을 불러옴modules
값을 false
로 설정 시 ES5로 변환하는 것을 방지sideEffects
를 false
로 설정해 사이트 이펙트가 생기지 않을 것이므로 웹팩에서 이 코드를 제외시켜도 된다는 것을 알려줌import
하여 사용 가능Lighthouse🏠
: 구글에서 개발한 오픈소스로 사이트를 검사하여 성능 측정을 할 수 있는 도구이자 웹 페이지의 품질을 개선할 수 있는 자동화 툴
- 다양한 지표를 이용하여 웹 페이지의 성능 검사 뿐만 아니라 개선책도 제공
Lighthouse 시작하기
🚀 Chrome 개발자 도구에서 실행하기
🚀 Node CLI에서 실행하기
-g
옵션을 사용하여 Lighthouse를 전역 모듈로 설치 권장npm install -g lighthouse
lighthouse <url>
lighthouse --help
Lighthouse 분석 결과 항목
Lighthouse의 Performance 측정 메트릭
First Contentful Paint: 성능 지표를 추적하는 메트릭
Largest Contentful Paint
뷰포트를 차지하는 가장 큰 콘텐츠의 렌더 시간 측정
LCP 점수 해석
LCP time(in seconds) | Color-coding |
---|---|
0-2.5 | Green(fast) |
2.5-4 | Orange(moderate) |
Over 4 | Red(slow) |
Speed Index: 성능 지표를 추적하는 메트릭
페이지를 로드하는 동안 얼마나 빨리 컨텐츠가 시각적으로 표시되는지 측정
Lighthouse의 Speed Index 측정 과정
: 브라우저 페이지 로딩과정을 각 프레임마다 캡쳐
→ 프레임 간 화면에 보이는 요소들을 계산
→ Speedline Node.js module을 이용하여 Speed index 점수를 그래프의 형태로 나타냄
Speed Index 점수 해석
Speed Index(in seconds) | Color-coding |
---|---|
0-3.4 | Green(fast) |
3.4-5.8 | Orange(moderate) |
Over 5.8 | Red(slow) |
Time to interactive
페이지가 로드되는 시점부터 사용자와의 상호작용이 가능한 시점까지의 시간 측정
TTI 점수 해석
TTI metric(in seconds) | Color-coding |
---|---|
0-3.8 | Green(fast) |
3.9-7.3 | Orange(moderate) |
Over 7.3 | Red(slow) |
Total Blocking Time
Cumulative Layout Shift
💡 개선 방향 잡기