컴퓨터는 사람이 작성한 HTML, CSS, JS 코드를 이해하지 못한다
이를 컴퓨터가 이해할 수 있는 언어로 번역하는 과정이 파싱이다
번역과정을 통해 구조화된 데이터 - DOM, CSSOM으로 변환한다
브라우저는 필요한 리소스를 서버에 요청하고 응답을 받아 화면에 그려내는 역할을 한다
서버에 요청을 하기위해 브라우저의 주소창을 제공한다주소창을 제공한다

index.html 을 응답한다link, script 태그를 만나면 html파싱을 중단하고 해당 파일을 서버로 요청하기 때문이다🎈 1. HTML 파싱 + DOM 트리 생성
<html>
<head></head>
<body>
<h1>Heading</h1>
</body>
</html>
// 위 코드를 DOM으로 그림
├── html
│ ├── head
│ └── body
│ └── h1
└── #text: "Heading"🎈 2. CSS 파싱 + CSSOM 트리 생성
CSS 파일을 읽어서 새로운 CSS OBJECT MODEL 트리 구조를 만듬
이 과정에서 HTML에 스타일을 적용시킴
HTML 파싱 중 link style태그를 만나면 DOM 생성을 중단하고, CSSOM 생성 시작
CSSOM 생성이 완료되면 다시 DOM 생성 재개
h1 {
color: red,
font-size: 20px,
}
// 위 코드를 CCSOM으로 그림
Stylesheet
└── Rule
├── Selector: h1
└── Declarations
├── Property: color
│ └── Value: red
├── Property: font-size
│ └── Value: 20px🎈 3. DOM트리와 CSSOM트리를 합쳐서 렌더 트리를 생성
화면에 그릴 요소와 스타일만으로 렌더트리를 만든다
(제외되는 요소 : meta태그, script태그, display: none)
완성된 DOM트리와 CSSOM트리는 렌더링을 위한 렌더트리로 결합됨
RenderRoot
└── RenderBlock (html)
└── RenderBlock (body)
└── RenderBlock (h1)
├── color: red
├── font-size: 20px
└── text: "Heading"🎈 4. 레이아웃 결정
🎈 5. 페인팅
🎈 6. 합성
HTML 파싱과정 중 script 태그를 만나면
DOM 생성을 일시 중단하고 자바스크립트 코드 파싱을 위해 제어권을 자바스크립트 엔진에게 넘긴다
이후 자바스크립트 파싱과 실행이 완료되면
다시 제어권을 렌더링 엔진에게 넘겨 DOM 생성을 재개한다
HTML을 파싱한 결과인 DOM트리는 DOM API 를 제공한다
DOM API는 이미 생성된 DOM트리를 조작할수 있다 => document.getElementID
DOM API에 의해 DOM트리나 CSSOM트리가 변경되면
변경된 트리를 다시 결합하고
렌더링을 다시 한다
이때
레이아웃을 다시 계산하는게 리플로우
(HTML 요소의 크기, 위치, 너비, 높이 등이 변경되었을 때
-> 창크기 조절, css 속성 변경 - width, margin)
새로운 렌더트리를 페인트하는게 리페인트이다
(요소의 스타일만 변경
-> css 속성 변경 - color, bgColor)
리플로우의 비용은 크기 때문에 성능 최적화를 생각한다면 조심해야 하는 부분이다
번역하여토큰들로 분해한다바이트코드로 변환되고 실행된다HTML을 파싱 할 때는
순차적으로 = 동기적으로 파싱되고 실행된다
그러면서 link태그를 만나면 CSSOM 트리를 생성하고
script태그를 만나면 js파일을 파싱하고 실행한다 (AST?)
이때
html이 파싱이 완료가 안된 상태에서
js코드 중 DOM을 조작하는 DOM API 코드가 있으면
문제가 발생한다
순차적으로 실행한다<script defer src="파일1">
<script defer src="파일2">
// html 파싱 완료 => 파일1 실행 => 파일2 실행<script async src="파일1">
<script async src="파일2">
// html 파싱 중 => 완료된 순으로 파일 실행