우리는 HTML / CSS / Javascript 로 코드를 써서 웹페이지를 만든다.
웹 브라우저는 이 코드를 가지고 웹 페이지를 그려주게 된다.
이 때, 브라우저에서는 어떤 일이 일어날까?
사용자 인터페이스 : 주소 표시줄, 이전/다음/새로고침 버튼 등
웹 페이지를 제외하고 사용자와 상호작용 하는 사용자 인터페이스
렌더링 엔진 : HTML & CSS를 파싱하여 요청한 웹 페이지를 표시하는 렌더링 엔진
브라우저 엔진 : 사용자 인터페이스와 렌더링 엔진을 연결하는 브라우저 엔진
통신(Networking) : HTTP 요청과 같은 각종 네트워크 요청을 수행하는 네트워킹 파트
UI 백엔드 : 체크박스 or 버튼과 같은 기본적인 위젯을 그려주는 UI 백엔드 파트
자료 저장소 : localStorage나 Cookie와 같이 보조 기억장치에 데이터를 저장하는 파트
자바스크립트 해석기(엔진) : 자바스크립트 코드를 해석하고 실행하는 해석기(인터프리터) (크롬의 경우 V8 엔진 사용)
모든 렌더링엔진이 약간 기본적으로 웹표준을 준수하면서도 엔진마다 조금씩 다르게 동작하는 부분이 있다.
-> 위에서 말한 업데이트 란?
사용자 동작으로 인해 입력이 발생
,스크롤 발생
,애니메이션 동작
,비동기요청으로 인한 데이터로딩
등 개발자도구를 켜서 performance를 눌러 Layout, painting, composite를 확인해 볼 수 있다.
위와 같은 목표를 위해서 렌더링 엔진은 크게 다음의 과정을 거쳐서 동작하는데 이를 Critical Rendering Path
라고 한다.
<!DOCTYPE html>
<html>
<head>
<title>hyo blog</title>
<link rel='stylesheet' href='style.css'/>
<meta charset='utf-8'/>
</head>
<body>
<h1>렌더링 과정</h1>
<p>hello</p>
<span>world</span>
<div>
<img src='image.jpeg' alt='이미지' />
</div>
</body>
</html>
토큰을 해당 속성 및 규칙을 정의한 객체(Nodes)로 변환!
렉싱 과정을 거쳐 변환된 노드들이 서로 연관성을 가질 수 있도록 DOM Tree 생성!
HTML을 DOM Tree로 만드는 과정과 비슷하게, CSS로는 CSSOM Tree가 생성된다.
DOM이 어떻게 화면에 표시될 지를 알려주는 역할을 한다.
CSS도 위에서 아래로 스타일 규칙이 정해지기 때문에 이 또한 Tree구조를 가지고 있다. ->
-> 예를 들어 스타일시트에서 body태그에 text-align이라는 속성을 정해뒀다면
자식태그들에게도 적용되는 것.
렌더링 엔진이 DOM Tree 와 CSSOM Tree를 합쳐서 Render Tree 라는 것을 만들게 된다.
렌더트리는 화면에 표시되어야 할 모든 노드의 컨텐츠, 스타일 정보를 포함하고 있는 트리이다.
렌더트리 그림은 많이 간소화되어 있기 때문에, 렌더트리가 실제로는 더 많은 데이터를 가지고 있고, 브라우저마다 조금씩 다르게 생성된다는 것을 알고 있자.
Render Tree가 생성되었다면 Layout이라는 과정을 거친다.
ViewPort 내에서 요소들의 정확한 위치와 크기를 계산하는 과정이다.
박스모델에 따라서 텍스트나 요소의 박스가 화면에서 차지하는 영역이나 여백 그리고 이외의 스타일 속성이 계산된다.
이 때, CSS에서 %나 em,vh,vw 와 같은 상대적인 단위를 사용했을때는 이게 뷰포트에 맞춰서 픽셀(px)단위로 변환된다.
레이아웃 과정에서 렌더링 엔진이 각 요소들이 어떻게 생겼고 이를 어떻게 보여 줄지 알게 되면 마지막으로 화면에 실제 픽셀로 그려지도록 변환하는 과정을 거치는데 이것이 바로 페인트 과정이다.
Browser Rendering의 마지막 과정으로 Render Tree에 포함 된 요소들이나 텍스트 , 이미지들이 실제 픽셀로 그려진다.
이러한 과정을 거쳐서 브라우저 화면에 UI가 나타나게 된다.