렌더링 엔진은 HTML 문서를 파싱하고 "콘텐츠 트리" 내부에서 태그를 DOM 노드로 변환한다. 그 다음 외부 CSS 파일과 함께 포함된 스타일 요소도 파싱한다.
렌더링 엔진이 DOM Tree와 CSSOM Tree를 합쳐서 렌더트리 생성.
화면에 표시되어야 할 모든 노드의 콘텐츠,스타일 정보를 포함하는 트리.
document 객체부터 각 노드를 순회하면서 각각에 맞는 CSSOM을 찾아서 규칙을 적용. 그러면서 렌더와 관련된 요소들을 렌더 트리에 포함시킴.
이 때, meta, display:none과 같은 요소들은 렌더와 관련이 없기 때문에 렌더트리에 포함되지 않음.
Layout과정. 뷰포트내에서 요소들의 정확한 위치와 크기를 계산하는 것. 각 노드가 화면의 정확한 위치에 표시되는 것
Paint과정. 렌더트리에 포함된 요소들이나 text,이미지들이 실제 픽셀로 그려짐.
정리 : 렌더링 엔진은 HTML 문서를 파싱해 DOM 노드로 변환하여 DOM 트리를 구축합니다.그 다음 외부 CSS 파일과 함께 포함된 스타일 요소도 파싱합니다. 이러한 DOM Tree와 CSSOM Tree을 합쳐 '렌더 트리'라는 새로운 트리를 생성한다. 렌더 트리의 생성이 끝나면 Layout 과정을 통해 각 노드가 화면의 정확한 위치에 표시되고 렌더링 엔진은 렌더 트리를 순회하면서 화면에 Paint해 최초 렌더링을 마친다.
자바스크립트로 DOM을 변형할 수 있기 때문에 우선 자바스크립트를 파싱해서 실행 완료 후에 DOM생성을 이어나간다. JS 엔진과 렌더링 엔진은 직렬적으로 실행된다. 만약 파싱이 중단되지 않으면 렌더트리가 다 구성되지 않았을 때 JS 엔진이 DOM 트리 변경시킬 수도 있고 아직 그려지지 않은 DOM 트리의 노드에 접근한다면 오류가 날 수 있다.
HTML 파싱 블로킹현상을 근본적으로 해결하기 위해 HTML5부터 async와 defer 추가됨. async와 defer는 HTML파싱과 외부 자바스크립트 파일의 로드가 비동기적으로 동시에 진행되도록 만들어줌.
emotion은 css-in-js이기 때문에 자바스크립트로 동작한다. 그렇기에 DOM 생성이 완료된 시점에 자바스크립트가 실행될 때 같이 실행된다.
출처
[Naver D2] 브라우저는 어떻게 동작하는가?
[10분 테코톡] 브라우저 렌더링
브라우저 렌더링 동작과정을 짧게 설명해보세요.
JavaScript 실행되면 html 파싱 중단되는 이유