
최대한 빨리
: CS, JS 없이 HTML만 가지고 최대한 빨리.
단점: 페이지 새 렌더링 필요 > 화면이 뒤틀리거나 깜빡이는 현상 발생 ⇒ UX 저하, 혼란 야기
-> 렌더링에 필수적으로 필요한 거 챙기고 렌더링하기
모든 리소스 준비된 후 렌더링 시작
단점: 사용자는 화면을 보기까지 더 오래 기다려야 함. JS 등 동적 제어 없는 페이지는 모든 리소스 준비되지 않고도 사용 가능함.
⇒ 필요한 것들만 가져와서 사용자에게 혼란 야기하지 않을 정도로 최대한 빨리 렌더링 하자
⇒ CRP (Critical Rendering Path)
: 페이지 렌더링 위한 필수 요소들이 처리되는 흐름
초기 렌더링에 집중
렌더링은 지속적으로 발생(이미지 파일, 폰트, JS 번들이 완료되었을 때 재렌더링 발생)
CRP: 성능 최적화의 핵심!
: HTML, head tag 내에 작성된 CSS, JS
html file 전체
: 다운받으면서 그림. (스트리밍 형태로)
폰트, 이미지
: 나중에 채워넣어지는 부가적 콘텐츠. 초기 렌더링 지연시키지 x
<h1>🍏 apple: 30</h1>
<!-- parser-blocking script -->
<script src="http://localhost:3000/5000/js/sample.js"></script>
<h1>🍏 apple: 31</h1> 30번 출력 후 멈춰있다가(5초지연) sample.js의 내용 출력, 31번 사과 출력 <h1>🍏 apple: 40</h1>
<!-- non-parser-blocking script -->
<script src="http://localhost:3000/10000/js/sample.js" defer></script>
<h1>🍏 apple: 41</h1> defer 달려있기 때문에 코드 마지막(1000번째 사과)까지 다 실행 후 sample.js 의 내용 출력JavaScript: 파서 차단 리소스
DOM, CSSOM을 조작할 수 있기 때문에 HTML 문서의 파싱 작업을 차단하는 리소스로 작동함.
Parser blocking이 필요한 이유
스크립트 코드 어딘가에 DOM에 접근해 HTML 엘리먼트를 조작하거나 CSS를 조작하는 코드가 있을 수 있기 때문
CSS
다운받기 전까지 실행 안 됨
Render blocking이 필요한 이유
렌더링을 차단하는 리소스인 CSS는 CSSOM이 구성될 때까지 브라우저의 렌더링을 차단시키는데, 이를 통해 화면 깜빡임 현상을(FOUC)를 방지 할 수 있기 때문
Js
<h1>🍏 apple: 2</h1>
<h1>🍏 apple: 3</h1>
<link rel="stylesheet" href="http://localhost:3000/6000/css/h1-red.css" />
<!-- parser-blocking css -->
<script src="http://localhost:3000/js/sample.js"></script>
<h1>🍏 apple: 4</h1>
<h1>🍏 apple: 5</h1>
: 원래 JS 는 다운 다되면 실행됨. CSS 때문에 실행이 blocked (CSS 밑에 잇어서)
script의 실행 차단 ⇒ CSS를 script blocking이라 부름
⇒ script-blocking css
JS의 실행을 멈추게 하는 리소스.
css가 먼저 다운되었어도, css가 모두 다운로드되어야 JS 코드가 실행됨.
JS: DOM or CSS를 조작할 수 있는 코드가 있을 수 있다. CSS 다운 중 JS가 조작할 수 있는 파일이 있을 수 있으니 CSS 다 다운 받은 후 실행!
⇒ browser는 < script >를 실행할 때, 그 전에 <link~>로 불러온 CSS가 아직 다운되지 않았을 경우, 해당 CSS가 모두 다운되고 파싱될 때까지 JS의 실행을 지연시킴.
다운받은 JS 가 DOM과 SSOM을 조작할 가능성이 있기 때문에
따라서 < script > 자체는 paaser blocking 리소스지만, 그보다 앞선 CSS 는 script의 실행을 차단시킬 수 있다. (CSS: script blocking)
브라우저 및 구글에서 제공하는 웹 성능 지표(LCP, INP, CLS)
이후 개발/구현하면서 성능지표가 있다는 것을 인지하고, 개선이 필요한 지점이 있으면 개선해보기
웹 바이탈의 기존 지표들 중에서 성능 개선에 실질적으로 도움이 될 지표들만 모은 핵심 지표
이상적: 2.5sec 이내
Loading Performance)와 관련된 성능 지표로,사용자가 페이지에 진입한 후, 컨텐츠가 화면에 렌더링되는데 걸린 시간을 가리킴Interactivity)과 관련된 성능 지표로,마우스 클릭이나 키보드 입력과 같이 사용자가 화면에 입력한 이벤트에 따라 화면이 반응하기까지 걸리는 시간을 가리킴시각적 요소 관련
Visual stability)과 관련된 성능 지표로,화면에 표시된 HTML 요소들의 위치가 예기치 않게 변경됨에 따라 사용자 경험에 얼마나 악영향을 끼치는지를 가리킴: Core Vital 중 대부분이 LCP에서 발생.
url() 함수를 통해 로딩된 배경 이미지block 속성을 가진 HTML 엘리먼트(주로 텍스트 노드)사용자가 페이지 로딩을 시작한 시점부터 브라우저가 서버로 요청한 HTML 문서가 포함된 HTTP 응답의 첫 번째 바이트를 받을 때까지 걸리는 시간
→ client 입장에서 개선하기 가장 어려움.
TTF 이후부터 브라우저가 LCP 리소스(ex. 이미지)를 다운로드하는 작업을 시작하기 전까지 소요된 시간.
start 하기 전까지의 시간!
→ 브라우저가 LCP 리소스를 최대한 빨리 발견할 수 있게 하기
+) 별도의 리소스 다운로드를 필요로 하지 않는 경우. 시간은 0이라고 볼수 있음
ex) 시스템 내 자체 폰트로 렌더링되는 텍스트 노드
⇒ LCP에 소요되는 시간의 대부분은 HTML 문서와 LCP 리소스를 (다운)로드하는 데 소비되어야 함
LCP 전에 HTML 문서나 LCP 리소스 중 하나가 (다운)로드 되지 않는 상황이 개선 가능한 지점이 됨
Resource load delay 줄이기
미리 로딩 시키게 하는 스캐너.
미리 발견 가능한 케이스들
<link rel="preload">를 통해 사전 로딩된 리소스<link rel="preload">를 통해 사전 로딩된 리소스발견 불가 케이스들
<img> 엘리먼트리소스가 미리 발견되지 않은 경우, 스크립트를 실행하거나 스타일 시트를 적용해야 하는데, 이것들은 네트워크 요청을 통해 받아와야 함 > LCP 리소스를 발견하고 로딩하려면 먼저 네트워크 요청이 완료될 때까지 기다려야 함.
⇒ 개선하기 위해서는 HTML 문서에서 LCP 리소스를 발견할 수 있어야 함.
<!-- Load the stylesheet that will reference the LCP image. -->
<link rel="stylesheet" href="/path/to/styles.css">
<!-- Preload the LCP image with a high fetchpriority so it starts loading with the stylesheet. -->
<link rel="preload" fetchpriority="high" as="image" href="/path/to/hero-image.webp" type="image/webp">Element render delay 줄이기
LCP 요소가 로드 완료되었음에도 즉시 렌더링되지 않는 주된 이유는 렌더링이 다음의 이유들로 인해 차단되었기 때문임
<head>에 작성된 스타일시트나 스크립트를 로딩하느라 전체 페이지의 렌더링이 차단된 경우렌더링을 차단하는 스타일 시트(Render blocking resource)를 줄이거나 인라인으로 처리하기
if .css 파일 너무 큼 > LCP 로드하는 시간보다 css 로딩 시간이 오래 걸리면 렌더링 불가.
⇒ html 인라인에 스타일 적용하기 (inline)
⇒ or. .css 분리 후 현재 필요한 css 파일만 갖고오도록 하기.
렌더링을 차단하는 자바스크립트를 defer 혹은 인라인으로 처리하기
서버 사이드 렌더링 사용하기
SSG(Static site generation)
운영 중인 서비스에 사용자를 통한 동적인 처리를 수행하는 기능이 없다는 전제 하에 SSR보다 더 유용할 수 있는 옵션
빌드 과정에서 모든 HTML 마크업을 미리 생성해두고 응답하는 방식
→ 교안 페이지가 SSG 방식
⇒ 서버사이드: 사용자가 요청 할 때마다 동적으로 렌더링함.
빌드할 때 html 미리 만들어둔 후 줌.
build time: 준비 기간(미리 만들어둔 후 줌)
run time: 요청 오면 만들고 줌
LCP 리소스가 최대한 빨리 (다운)로드를 시작하도록 함
→ Resource load delay 줄이기
리소스 로드가 완료될 경우 즉시 LCP 리소스가 페이지에 렌더링될 수 있는지 확인
→ Element render delay 줄이기
LCP 리소스의 다운로드 시간을 줄이기
→ Resource load duration 줄이기
초기 HTML 문서를 최대한 빨리 전송받기
→ Time to First Byte 줄이기