🔎 브라우저란
인터넷에서 웹 서버의 모든 정보를 볼 수 있도록 하고 문서 검색을 도와주는 응용 프로그램
Chrome, Safari, Firefox, Opera, Internet Explorer(현재 지원 종료)
🔎 렌더링이란,
서버로부터 자원을 받고, 브라우저를 통해 받은 자원을 볼 수 있도록 하는 것
서버에서 HTML, CSS, JS 파일 등 필요한 리소스를 다운로드 합니다.
그러나 자원을 한 번에 모든 걸 다운로드 하지 않아요. 일단 HTML만 먼저 받고 시작합니다.
이 외에도 이미지 파일, 폰트 파일, 비디오 및 오디오 파일 등을 다운받을 수 있어요.
브라우저의 읽기를 담당하는 로더가 받아온 HTML을 읽으면서 파싱 작업을 진행합니다.
파싱의 결과로 HTML은 DOM 트리를, CSS는 CSSOM 트리를 생성하게 됩니다.
🔎 파싱이란,
일련의 문자열로 이루어진 입력을 토큰(Token)이나 트리(Tree)와 같은 구조로 변환하는 과정
즉, 브라우저가 코드를 이해하고 사용할 수 있는 구조로 변환해주는 과정
파싱을 통해서 이렇게 변환됩니다!
그렇지만 여전히 DOM은 뭐고 CSSOM은 뭔지 모르겠으니 좀 더 알아보죠!
🔎 DOM(Document Object Model)이란,
HTML이나 XML 문서의 구조를 객체의 형태로 나타낸 것 ⇒ 브라우저가 이해할 수 있는 구조
DOM은 어떤 구조의 객체인지 궁금해서 GPT에게 예시를 달라고 요청했어요.
(내용이 길어요.. 눈 감아)
const dom = {
document: {
nodeType: 9, // Document 노드
documentElement: {
tagName: "html",
attributes: {},
children: [
{
tagName: "head",
attributes: {},
children: [
{
tagName: "title",
attributes: {},
children: [
{
nodeType: 3, // Text 노드
textContent: "Sample Page"
}
]
}
]
},
{
tagName: "body",
attributes: {},
children: [
{
tagName: "h1",
attributes: { id: "main-title" },
children: [
{
nodeType: 3, // Text 노드
textContent: "Hello, World!"
}
]
},
{
tagName: "p",
attributes: { class: "description" },
children: [
{
nodeType: 3, // Text 노드
textContent: "This is a sample paragraph."
}
]
},
{
tagName: "ul",
attributes: {},
children: [
{
tagName: "li",
attributes: {},
children: [
{
nodeType: 3, // Text 노드
textContent: "Item 1"
}
]
},
{
tagName: "li",
attributes: {},
children: [
{
nodeType: 3, // Text 노드
textContent: "Item 2"
}
]
},
]
}
]
}
]
}
}
};
HTML을 파싱하면 다음과 같이 트리 구조로 변환해줍니다! 이것이 바로 DOM (tree)입니다.
🔎 CSSOM(CSS Object Model)이란,
DOM처럼 CSS 문서의 구조를 객체의 형태로 나타낸 것 ⇒ 브라우저가 이해할 수 있는 구조
<link rel="stylesheet" href="styles.css">
<link>
발견 즉시, CSS 파일 다운로드 → 파싱 진행 (HTML 파싱과 병렬 진행) → CSSOM 완성~!<style> ~~ </style>
<style>
발견 즉시, 파싱 진행 (HTML 파싱과 병렬 진행) → CSSOM 완성~!화면에 보여지는 요소들로만 구성된 Render 트리를 생성하여 화면을 그릴 준비를 합니다.
🔎 Render 트리란,
DOM과 CSSOM이 합쳐진 결과물(객체)로, 화면에 보이지 않는 필요없는 요소를 필터링하여 생성
html
및 body
태그들을 처리하면서 Render 트리 루트를 구성합니다.Render 트리를 화면에 어떻게 배치해야 하는지 각 요소의 정확한 위치와 크기를 계산합니다.
이 단계에서는 픽셀 단위로 레이아웃 정보를 생성합니다.
계산 과정에서는 필요에 따라 부모 요소의 크기와 스타일을 참고합니다.
이 과정에서 브라우저의 뷰포트 크기와 CSS 규칙에 따라 달라질 수 있습니다.
width: 50%
)vw
단위의 경우 현재 뷰포트 크기 반영 / 미디어 쿼리🔎 Reflow란,
Layout이 변경되었을 때, Render 트리와 각 요소들의 크기와 위치를 다시 계산해주는 과정
어떤 요소의 크기나 위치가 변경되면, 해당 요소 + 자식 요소와 형제 요소들의 레이아웃을 다시 계산합니다.
주로, 사용자와 상호작용 하는 과정에서 발생합니다.
브라우저는 각 요소를 순차적으로 처리하면서 계산된 정보를 바탕으로 실제 화면에 요소를 그립니다.
그리는 과정에서 디자인도 반영하여 그립니다. (단!! 그린다고 해서 바로 화면에 보여지는 건 아닙니다.)
🔎 Repaint란,
요소의 시각적 표현이 변경될 때 발생하는 과정. Reflow 발생 시, 무조건 Repaint도 발생
주로 레이아웃 변화가 없고 색상, 글꼴 변경 시 발생합니다.
Repaint는 변경된 부분만 다시 그립니다. 화면 전체를 다시 그리지 않아요.
Reflow는 상대적으로 비용이 많이 드는 작업인 반면, Repaint는 가벼운 작업입니다.
레이어가 여러 개일 경우, 최종 화면에 표시될 이미지를 만들기 위해 레이어를 조합합니다.
레이어가 분리되지 않았다면, Composite 단계는 발생하지 않습니다
성능 최적화를 위해 브라우저는 GPU를 활용합니다.
레이어가 여러개? 언제 여러 개 생성된거지?
⇒ 레이어는 특정 조건에서 분리되어 별도의 렌더링 단위로 처리된다고 합니다. (주로 Paint 단계에서 분리!)
다음과 같은 경우 레이어가 분리됩니다.
transform
/ opacity
/ filter
/ will-chage
등의 속성을 사용하는 경우z-index
를 사용하는 경우display: none;
이나 meta tag
같은 화면에 보이지 않는 것들은 포함X