(출처 : https://d2.naver.com/helloworld/59361 )
- 사용자 인터페이스 : 페이지를 보여주는 창을 제외한 모든 부분 (주소 표시줄, 이전/다음 버튼, 북마크 메뉴 등)
- 브라우저 엔진 : 사용자 인터페이스와 렌더링 엔진 사이의 동작을 제어
- 렌더링 엔진 : 요청한 콘텐츠를 표시하는 엔진(html과 css를 파싱)
- 통신 : HTTP 요청과 같은 네트워크 호출
- UI 백엔드 : select, input 등 기본적인 위젯을 그리는 인터페이스. OS 인터페이스 체계를 사용
- 자바스크립트 해석기
- 자료 저장소 : 웹 데이터 베이스(ex- Local Storage, cookie)
(출처: https://poiemaweb.com/js-browser)
- 요청으로 받아온 HTML을 파싱하여 DOM 트리를 빌드한다.
- HTML에서 CSS file을 로드해오고, CSS를 파싱해서 CSSOM 트리를 빌드한다. (렌더링 엔진)
- DOM과 CSSOM을 결합하여 렌더 트리(Render Tree)를 형성한다. (렌더링 엔진)
- 렌더 트리를 기반으로 브라우저는 웹페이지를 보여준다. (렌더링 엔진)
- 스크립트를 만나면 DOM 생성을 중단하고(DOM 생성이 다 안됬을 경우) 자바스크립트를 로드하고 실행한다. (자바스크립트 엔진)
HTML 문서와 이미지를 화면에 표시.
파이어 폭스는 Gecko, 사파리/크롬은 Webkit이라는 렌더링 엔진을 사용
통신으로부터 문서의 내용(ex - HTML)을 얻는 것으로 시작하는데 문서의 내용은 보통 8KB 단위로 전송된다.
DOM 트리 구축을 위한 파싱 => 렌더 트리 구축 => 렌더 트리 배치 => 렌더 트리 그리기
의 순서로 동작한다.
렌더링 엔진은 HTML과 CSS만을 처리하며, 자바스크립트는 자바스크립트 엔진이 따로 처리한다.
HTML 마크업을 파싱 트리로 변환
HTML은 유연한 문법 체계로 되어 있어서 시작, 종료 태그를 생략해도 파싱이 가능하다.
즉 개발자의 실수를 파서가 수정해준다. (XML 대신 HTML이 쓰이는 이유)
파싱 트리는 DOM 노드와 속성 노드의 트리로 구성된다.
<html>
<body>
<p>Hello World</p>
<div><img src="example.png" /></div>
</body>
</html>
위 HTML은 다음과 같은 트리로 파싱된다.
브라우저는 HTML에서 css 파일을 참조하는 링크태그를 접하면 즉시 리소스에 대한 요청을 보낸다.
그 요청의 결과(CSS)를 받아 렌더링 엔진은 CSSOM 트리를 구성한다. (DOM과 CSSOM은 독립적인 구조)
CSS는 HTML과 다르게 문법이 정해져있다(문맥 자유 문법)
DOM과 CSSOM이 다 구성되면 렌더링 엔진은 이를 합쳐서 렌더 트리(렌더링 트리)를 만든다.
렌더링 트리를 그리면 레이아웃 단계를 진행한다.
visibility: "hidden"
인 요소는 렌더링 트리에 포함된다. 즉 요소가 보이지 않지만 레이아웃에서 공간을 차지한다.
display: "none"
인 요소는 렌더링 트리에 포함되지 않는다. 즉 요소가 보이지 않으며 레리아웃에도 포함되지 않는다.
브라우저는 동기적으로 HTML, CSS, JS를 처리한다.
따라서 HTML 파서가 script 태그를 만나면 DOM 생성 프로세스를 멈추고 자바스크립트 엔진으로 권한을 넘긴다.
이때 발생할 수 있는 문제는
- 자바스크립트 로딩으로 인한 DOM 생성 지연
- DOM이 완성되지 않은 상태에서 DOM 조작의 에러
이다.
이 문제를 막기 위해 일반적으로 html body의 맨 끝에 script 태그를 삽입한다.
HTML5에서는 스크립트에 defer
옵션을 통해 스크립트 로딩을 비동기로 처리할 수 있다.
HTML 파싱을 중단하지 않고 스크립트를 받아오는 동시에 HTML 파싱이 완료되면 스크립트를 실행할 수 있게 된다.
- https://d2.naver.com/helloworld/59361
- https://poiemaweb.com/js-browser
- https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-tree-construction?hl=ko
- https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-tree-construction?hl=ko
- https://flaviocopes.com/javascript-async-defer/