웹 브라우저는 동기(Synchronous)적으로 (HTML + CSS), Javascript 언어를 해석하여 내용을 화면에 보여주는 응용 소프트웨어
사용자가 선택한 자원*을 서버에 요청하고 브라우저에 표시하는 것
일련의 과정들이 점진적으로 진행된다.
렌더링 엔진은 좀 더 나은 사용자 경험을 위해 가능하면 빠르게 내용을 표시한다.
모든 HTML을 파싱할 때까지 기다리지 않고 배치와 그리기 과정을 시작
네트워크로부터 나머지 내용이 전송되기를 기다리는 동시에 받은 내용의 일부를 먼저 화면에 표시
▼ 웹킷
▼ 모질라의 게코
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width,initial-scale=1">
<link href="style.css" rel="stylesheet">
<title>Critical Path</title>
</head>
<body>
<p>Hello <span>web performance</span> students!</p>
<div><img src="awesome-photo.jpg"></div>
</body>
</html>
HTML 페이지는 위 사진과 같은 과정을 거치게 된다.
📌 바이트를 문자로 변환 → 토큰화 → 노드로 변환 → DOM 트리 생성
DOM 트리는 렌더링 될 때 어떻게 표시 할지는 알려주지 않는데, 그 정보는 CSSOM이 알려주게 된다.
브라우저가 DOM을 생성하는 동안 <head>
섹션에서 style.css를 참조하는 문서의 링크 태그를 만나게 된다. 브라우저는 이 리소스에 대한 처리를 요청하고 요청의 결과는 아래와 같다.
body { font-size: 16px }
p { font-weight: bold }
span { color: red }
p span { display: none }
img { float: right }
CSS도 HTML과 같이 아래와 같은 과정을 거치게 된다.
📌 바이트를 문자로 변환 → 토큰화 → 노드로 변환 → CSSOM 트리 구축
CSSOM이 트리 구조를 갖는 이유
위 트리는 완전한 CSSOM 트리가 아니다.
'user agent styles'(브라우저가 기본적으로 제공)에서 스타일 시트가 재정의 하도록 결정한 스타일만 표시
<script>
, <meta>
등)display: none
속성을 갖는 노드마지막으로, 렌더링 트리의 각 노드를 화면에서의 실제 픽셀로 변환한다.
렌더링 엔진이 아닌 자바스크립트 엔진이 처리
HTML 파서는 script 태그를 만나면 js 코드를 실행하기 위해
DOM 생성 프로세스 중지 & JS 엔진으로 제어 권한 넘김
JS 엔진(제어 권한을 넘겨 받은)은 script 태그 내의 js 코드 또는 script 태그의 src 속성에 정의된 js 파일을 로드하고 파싱하여 실행
js 실행이 완료되면 다시 HTML 파서로 제어 권한을 넘겨서 브라우저가 중지했던 시점부터 DOM 생성 재개
이처럼 브라우저는 동기(Synchronous)적으로 HTML, CSS, Javascript를 처리함
이것은 script 태그의 위치에 따라 블로킹이 발생하여 DOM 생성의 지연이 가능하다는 것을 의미한다.
⇒ script
태그 위치의 중요성
Javascript 위치: body 요소 가장 아래
가 좋은 이유
페이지 로딩 시간이 단축
HTML 요소들이 스크립트 로딩 지연으로 인해 렌더링에 지장 받는 일이 발생하지 않아서
DOM이 완성되지 않은 상태에서 Javascript
가 DOM 조작하면 에러 발생