CH 38. 브라우저의 렌더링 과정
렌더링?
- HTML, CSS, JS로 작성된 문서를 파싱하여 브라우저에 시각적으로 출력하는 것
38.1 요청과 응답
- 브라우저의 핵심 기능
: 필요한 리소스(HTML, CSS 등)를 서버에 요청하고 서버로부터 응답 받아 브라우저에 시각적으로 렌더링하는 것
- 브라우저의 주소창에 URL을 입력하고 엔터를 누르면 URL의 호스트 이름이 DNS를 통해 IP주소로 변환
- 이 IP 주소를 갖는 서버에게 요청을 전송
38.2 HTTP 1.1과 HTTP 2.0
- HTTP는 웹에서 브라우저와 서버가 통신하기 위한 프로토콜(규약)
HTTP1.1
- 기본적으로 커넥션 당 하나의 요청과 응답만 처리
- 리소스의 동시 전송이 불가능한 구조
- 요청할 리소스의 개수에 비례하여 응답 시간도 증가하는 단점
HTTP 2.0
- 커넥션 당 여러 개의 요청과 응답이 가능
- 여러 리소스 동시 전송이 가능
- HTTP 1.1에 비해 페이지 로드 속도가 약 50% 빠름
38.3 HTML 파싱과 DOM 생성
- 브라우저 요청에 의해 서버가 응답한 HTML문서는 순수한 텍스트
- 이를 시각적 픽셀로 렌더링하려면 HTML 문서를 브라우저가 이해할 수 있는 자료구조(DOM)로 변환해 저장해야 함
- DOM은 HTML 문서를 파싱한 결과물
38.4 CSS 파싱과 CSSOM 생성
- 렌더링 엔진은 DOM을 생성해나가다가 CSS를 로드하는 태그를 만나면 DOM 생성을 일시 중단함
- CSS 파일의 태그를 HTML과 동일한 파싱 과정(바이트->문자->토큰->노드->CSSOM)을 거쳐 해석해 CSSOM생성함
- CSSOM은 CSS의 상속을 반영하여 생성됨
38.5 렌더 트리 생성
- DOM과 CSSOM은 렌더링을 위해 렌더 트리로 결합됨
- 렌더 트리는 브라우저 화면에 렌더링되는 노드만으로 구성됨
- 렌더링 과정은 반복해서 실행될 수 있음
38.6 자바스크립트 파싱과 실행
- 자바스크립트 파싱과 실행은 자바스크립트 엔진이 처리함
- CPU가 이해할 수 있는 저수준 언어로 변환하고 실행하는 역할
- A ST(추상적 구문 트리) 생성
: AST를 기반으로 인터프리터가 실행할 수 있는 중간 코드인 바이트코드를 생성하여 실행함
38.7 리플로우와 리페인트
- 만약 자바스크립트 코드에 DOM이나 CSSOM을 변경하는 DOM API가 사용된 경우 DOM이나 CSSOM이 변경됨
- 이때 변경된 DOM과 CSSOM은 다시 렌더 트리로 결합되고,
변경된 렌더 트리를 기반으로 레이아웃과 페인트 과정을 거쳐 브라우저의 화면에 다시 렌더링 함
: 리플로우 - 레이아웃 계산을 다시 하는 것
: 리페인트 - 재결합된 렌더 트리를 기반으로 다시 페인트 하는 것
- 레이아웃에 영향이 없는 변경은 리플로우 없이 리페인트만 실행됨
38.8 자바스크립트 파싱에 의한 HTML 파싱 중단
- 병렬적 파싱이 아닌, 직렬적으로 파싱 수행
- body 요소의 가장 아래에 자바스크립트 위치 시키기
: DOM이 완성되지 않은 상태에서 자바스크립트가 DOM을 조작하는 에러가 발생할 우려 없음
: 자바스크립트가 실행되기 이전에 DOM 생성이 완료되어 렌더링되므로 레이지 로딩 시간이 단축되는 이점
38.9 script 태그의 async/defer 어트리뷰트
- DOM에 의해 생성이 중단되는 문제를 근본적으로 해결하기 위해 추가됨
- src 어트리뷰트를 통해 외부 자바스크립트 파일을 로드하는 경우에만 사용 가능
async
- 자바스크립트의 파싱과 실행은 자바스크립트 파일의 로드가 완료된 직후 진행
- 이때 HTML 파싱 중단
defer
- 자바스크립트의 파싱과 실행은 HTML 파싱이 완료된 직후 진행
'2022-2 웹개발 스터디' 카테고리의 다른 글
[모던 JS] CH 34. 이터러블, CH 35. 스프레드 문법, CH 36. 디스트럭처링 할당 # 20 (0) | 2022.11.13 |
---|---|
[모던 JS] CH 39. DOM (1) | 2022.11.13 |
[모던 JS] CH 32. String, CH33. 7번째 데이터 타입 Symbol (1) | 2022.11.08 |
[모던 JS] CH 28. Number, CH 29. Math, CH 30. Date, CH 31. RegExp (#16) (0) | 2022.11.05 |
[모던 JS] CH27. 배열 (#15) (0) | 2022.11.05 |