브라우저가 html,css, 자바스크립트로 작성된 텍스트 문서를 어떻게 파싱하여 브라우저에 렌더링 하는지 살펴보자

브라우저 핵심 기능은 필요한 리소스를 서버에 요청하고 서버로부터 응답받아 브라우저에 시각적으로 렌더링함
브라우저의 주소창에 url 입력하고 엔터를 누르면 url의 호스트 이름이 dns 통해 ip 주소로 변환되고 이 ip 주소를 갖는 서버에게 요청 전송

HTTP는 웹에서 브라우저와 서버가 통신하기 위한 프로토콜
HTTP 1.1
기본적으로 커넥션당 하나의 요청과 응답만 처리
즉, 여러 개의 요청을 한 번에 전송 x
다중 요청/ 응답 불가능하지만 http/2.0은 여러 리소스의 동시 전송 가능해 1.1에 비해 페이지 로드 속도가 약 50% 빠르다고 알려져있음
순수한 텍스트인 html 문서를 브라우저에 시각적인 픽셀로 렌더링 하려면 HTML 문서를 브라우저가 이해할 수 있는 자료구조(객체)로 변환하며 메모리에 저장해야 함
브라우저의 렌더링 엔진은 응답받은 HTML 문서를 파싱하여 브라우저가 이해할 수 있는 자료구조인 DOM 생성

렌더링 엔진은 HTML을 순차적으로 파싱하여 DOM 생성해 나가다가 CSS 로드하는 link태그나 style 태그 만나면 DOM 생성 일시 정지하고 CSSOM 생성
이후 CSS 파싱 완료하면 중단된 지점부터 다시 DOM 생성 재개
렌더링 엔진은 서버로부터 응답된 HTMl과 CSS 파싱하여 각각 DOM과 CSSOM 생성되고 렌더링을 위해 렌더트리로 결합됨
렌더트리
렌더링을 위한 트리 구조의 자료구조

이후 완성된 렌더 트리는 각 HTML 요소 레이아웃 계산하는데 사용되며 브라우저 화면에 픽셀을 렌더링하는 페인팅 처리에 입력

브라우저의 렌더링 과정은 반복해서 실행될 수 있음
레이아웃 계산과 페인팅을 다시 실행하는 리렌더링은 비용이 많이 드는, 즉 성능에 악영향을 줌
가급적 리렌더링이 빈번하게 발생하지 않도록 주의
HTML 문서를 파싱한 결과물로서 생성된 DOM은 DOM API 제공함
css 파싱과 마찬가지로 script태그를 만나면 DOM 생성 일시 중단
자바스크립트 엔진은 자바스크립트 해석하여 AST(추상적 구문 트리)생성
DOM이나 CSSOM을 변경하는 DOM API 사용된 경우 DOM이나 CSSOM이 변경됨
이때 변경된 DOM과 CSSOM은 다시 렌더트리로 결합되고 브라우저 화면에 다시 렌더링됨
이를 리플로우, 리페인트라고 함
브라우저는 동기적으로 파싱하고 실행함
따라서 script 태그 위치 중요
파싱에 의한 DOM 생성이 중단 되는 문제를 해결하기 위해 추가됨
비동기적으로 진행됨
async 어트리뷰트
HTML 파싱과 외부 자바스크립트 파일의 로드가 비동기적으로 동시에 진행됨
단, 자바스크립트의 파싱과 실행은 자바스크립트 파일의 로드가 완료된 직후 진행되며, 이때 HTML 파싱 중단

defer 어트리뷰트
async와 마찬가지로 비동기적으로 동시에 진행됨
단, 자바스크립트의 파싱과 실행은 HTMl 파싱이 완료된 직후, 즉 DOM 생성이 완료된 직후 진행
따라서 DOM 생성이 완료된 이후 실행되어야할 자바스크립트에 유용
defer은 IE10 이상에서 지원

문서의 계층적 구조와 정보를 표현하며 이를 제어할 수 있는 API, 즉 프로퍼티와 메서드를 제공하는 트리 자료 구조


(사진 출처: https://yung-developer.tistory.com/74)
노드 객체들로 구성된 트리 자료 구조를 DOM 이라고 함