웹 브라우저 마다 구조는 상이하나 공통 구조는 아래와 같다.
요청한 페이지를 제외한 모든 부분으로 주소 표시 줄, 뒤로/앞으로 버튼, 북마크 메뉴 등이 있다.
UI와 렌더링 엔진 사이의 동작을 제어한다.
HTML과 CSS등을 파싱하여 요청한 페이지를 화면에 표시한다.
Blink
(크롬 개발)Gecko
(모질라 개발)WebKit
(애플 개발)HTTP 요청과 같은 네트워크 호출을 처리한다.
기본적인 위젯을 그린다. (콤보박스, 인풋 등)
JS 코드를 해석하고 실행한다.
쿠키, 로컬/ 세션 스토리지 등의 데이터를 브라우저 메모리를 활용해 저장하는 영역이다.
CRP는 Critical Rendering Path의 약자로 렌더링 엔진의 동작 과정을 말한다.
브라우저는 HTML 문서를 파싱해 DOM 트리를 생성한다.
변환: 서버로 부터 바이트 형태의 HTML 문서를 응답받는다.
1-2 지정된 인코딩 방식(UTF-8)에 따라 문자열로 변환한다.
토큰화: 변환된 문자열을 의미있는 단위(시작/ 종료 태그
, 문자
)로 나누고 토큰으로 변환한다.
렉싱: 토큰을 해당 속성 및 규칙을 정의한 객체(노드)로 변환한다.
DOM구성: 노드들을 트리구조로 구성하여 DOM 트리를 생성한다.
CSS 문서를 파싱해 CSSOM 트리를 생성한다. 파싱 과정은 HTML과 동일하다.
CSS 문서를 연결한 <link>
/ <style>
태그를 만나면 HTML 파싱을 중단하고 CSS문서를 파싱한다.
계단식 특성으로 나중에 정의된 스타일이 먼저 정의된 스타일을 덮어씌운다. 또 파싱되기 전까지 렌더링을 차단한다.
HTML 파싱 중 <script>
태그를 만나면 파싱을 중단하고 JS파싱, 실행이 끝나면 다시 HTML을 파싱한다.
<script>
태그의 위치에 따른 차이점들이 존재한다.
head
JS 파싱이 끝날 때 까지 HTML 파싱이 중단된다.
body 끝
HTML 파싱 완료 후 진행된다.
head + async
HTML 파싱, 스크립트 파일 다운을 동시에 진행하며 스크립트 파일이 다운되면 HTML 파싱을 중단하고 스크립트 파일을 실행한다.
head + defer (Best)
HTML 파싱 중 JS파일을 다운받아 HTML 파싱이 완료되면 JS파일을 실행한다.
DOM 트리와 CSSOM 트리를 결합하여 렌더 트리를 생성한다.
DOM 트리의 노드를 순회해 각 노드에 일치하는 CSSOM 규칙을 찾아 적용하면서 브라우저가 실제로 렌더링하는 노드만을 렌더 트리에 포함한다.
<script>
,<meta>
, display:none
등은 포함❌ visibility:hidden
은 포함✅ (공간 차지)렌더 트리를 기반으로 장치의 뷰포트 내에서 노드의 크기와 위치를 계산하여 브라우저 창에 표시될 최종 레이아웃을 결정한다. %
, em
과 같은 상대적 단위는 뷰포드에 맞게 절대적 단위인 px로 변환된다.
렌더 트리, 레이아웃 정보를 사용해 각 노드를 px로 변환하여 화면에 표시한다.
리플로우, 리페인트 최소화하여 렌더링 최적화가 가능하다.
레이아웃 변경 작업 시 발생한다.
레이아웃의 수치를 변화시키지 않는 작업시 리페인트만 발생한다.
background-color
, visibility
, opacity
와 같은 레이아웃에 영향을 주지 않는 스타일 속성이 변경되었을 때는 리페인트만 발생한다.아래의 속성을 피해 리플로우를 최소화 시킬 수 있다.
width | height | float | text-align |
padding | margin | overflow-y | font-weight |
display | border-width | overflow | left |
border | top | font-family | line-height |
position | font-size | vertical-align | right |
bottom | min-height | clear | white-space |
color | border-style | outline-color | outline |
visibility | background | outline-style | border-radius |
text-decoration | background-image | outline-width | box-shadow |
background-position | background-repeat | background-size |
[MDN] 중요 렌더링 경로
[일리야 그리고릭] Render-tree Construction, Layout, and Paint
[일리야 그리고릭] Constructing the Object Model
[wonism] Critical Rendering Path란?
[Seungwon Go] 브라우저의 렌더링 과정
[TCP School] 노드
[모던 자바스크립트] defer, async 스크립트
[jhyun_k] 내 화면에 네이버가 켜질 때까지 - 브라우저 렌더링 과정