🙄파싱이 뭔가요?
파싱이란 프로그래밍 언어의 문법에 맞게 작성된 텍스트 문서를 읽어들여 실행하기 위해
텍스트 문서의 문자열을 토큰으로 분해하고 토큰에 문법적 의미와 구조를 반영하여
트리구조의 자료구조인 파스트리를 생성하는 일련의 과정을 말합니다.
일반적으로 파싱이 완료된 이후에는 파스 트리를 기반으로 중간언어인 바이트 코드를 생성하고 실행합니다.
🙄브라우저가 렌더링 하는 과정
1. 브라우저는 html, css, 자바스크립트, 이미지, 폰트파일 등 렌더링에 필요한 리소스를 요청하며
서버로부터 응답을 받습니다.
2. 브라우저의 렌더링 엔진은 서버로부터 응답된 자바스크립트를 파싱하여
DOM과 CSSOM을 생성하고 이들을 결합하여 렌더 트리를 생성합니다.
3. 브라우저의 자바스크립트 엔진은 서버로부터 응답된 자바스크립트를 파싱하여
AST(Abstract Syntax Tree)를 생성하고 바이트코드로 변환하여 실행합니다.
이때 자바스크립트는 DOM API를 통해 DOM이나 CSSOM을 변경할 수 있습니다.
변경된 DOM과 CSSOM은 다시 렌더트리로 결합됩니다.
4. 렌더 트리를 기반으로 HTML 요소의 레이아웃을 계산하고 브라우저 화면에 HTML 요소를 페인팅합니다.
🙄브라우저의 핵심기능이 뭐라고 생각하시나요?
브라우저의 핵심 기능은 필요한 리소스를 서버에 요청하고 서버로부터 응답을 받아
브라우저에 시각적으로 렌더링하는 것입니다.
렌더링에 필요한 리소스는 모두 서버에 존재하므로 필요한 리소스를 서버에 요청하고
서버가 응답한 리소스를 파싱하여 렌더링 하는것입니다.
이렇듯 서버에 요청을 전송하기 위해서 브라우저는 주소창을 제공합니다.
브라우저의 주소창에 URL을 입력하면 DNS를 통해 URL의 호스트이름은 IP 주소로 변환되고
이 IP 주소를 갖는 서버에게 요청을 전송합니다.
URI URL URN https:/ /www.mydomain.com :80/ docs/search? category=javascriptlang=ko #intro Scheme
(protocol)Host
(Domain)port path Query
(Query String)Fragment
1. 스킴과 호스트 만으로 구성된 URI 요청이 먼저 서버로 전송됩니다. 이를 루트요청이라합니다.
2. 루트 요청에는 리소스를 요청하는 내용이 없지만 서버는 암묵적으로 index.html을 응답합니다.
3. 서버는 루트 요청에 대해 서버의 루트폴더에 있는 index.html을 클라이언트로 응답합니다.
** 자바스크립트를 통해 동적으로 서버에 정적/동적 데이터를 요청하는 것도 가능합니다.
🙄HTTP1.1 과 HTTP 2.0
HTTP는 웹에서 브라우저와 서버가 통신하기 위한 프로토콜입니다.
HTTP1.1은 기본적으로
1. 커넥션 당 하나의 요청과 응답반 처리합니다. (여러개의 요청을 한번에 전송,응답 할 수 없음)
2. 리소스의 동시 전송이 불가능한 구조이므로 요청할 리소스가 많아질 수록 응답 시간도 증가함
이라는 문제점이 있습니다.
하지만 HTTP 2.0의 경우
커넥션당 여러개의 요청과 응답이 가능하므로 비약적인 성능 향상을 기대할 수 있습니다.
🙄DOM의 생성 과정
DOM은 HTML 문서를 파싱한 결과물이라고 할 수 있습니다.
브라우저의 렌더링 엔진은 HTML 문서를 파싱하여 브라우저가 이해할 수 있는 자료구조인 DOM을 만듭니다.
1. 서버에 존재하던 HTML 파일이 브라우저의 요청에 의해 응답됨 이때 서버는 브라우저가 요청한
HTML 파일을 읽어 들여 메모리에 저장한 다음 메모리에 저장된 바이트를 인터넷을 경유하여 응답함
2. 브라우저는 서버가 응답한 HTML 문서를 2진수 형태로 응답받음
그리고 2진수 형태로 된 HTML 문서는 meta 태그의 charset 어트리뷰트에 의해
지정된 인코딩 방식을 기준으로 문자열로 변환됨
3. 문자열로 변환된 HTML 문서를 읽어 들여 토큰으로 분해함
**토큰 ? -> 문법적 의미를 갖는 코드의 최소 단위
4. 각 토큰들을 객체로 변환하여 노드들을 생성함 노드는 DOM을 구성하는 기본 요소가 됨
5. HTML 문서는 HTML 요소들의 집합으로 이루어지며 HTML 요소는 중첩 관계를 가짐
HTML 요소의 컨텐츠 영역에는 텍스트 뿐만 아니라 다른 HTML 요소도 포함될 수 있음
이때 HTML 요소 간에는 중첩 관계에 의해 부자관계가 형성되고
모든 노드들은 트리 자료구조로 구성하게 되며 이것을 DOM이라고 부릅니다.
과정 요약
바이트 -> 문자 -> 토큰 -> 노드 -> DOM
🙄CSS 파싱과 CSSOM 생성
브라우저의 렌더링 엔진은 HTML을 순차적으로 파싱하면서 DOM을 생성합니다.
그러나 렌더링 엔진은 CSS를 로드하는 link 태그나 style 태그를 만나면 DOM 생성을 일시 중지하고
link 태그의 href 어트리뷰트에 지정된 css 파일을 서버에 요청합니다.
css 파일은 HTML과 동일한 파싱 과정을 거쳐 해석하여 CSSOM을 생성합니다.
CSSOM은 CSS의 상속을 반영하여 생성된다는 특징이 있습니다.
🙄렌더트리의 생성
렌더링 엔진은 서버로부터 응답된 HTML과 CSS를 파싱하여 각각 DOM과 CSSOM을 생성합니다.
그리고 DOM과 CSSOM은 렌더링을 위해 렌더 트리로 결합됩니다.
렌더트리는 렌더링을 위한 트리구조의 자료구조이며 따라서 브라우저 화면에 렌더링 되지 않는 노드나
CSS에 의해 비표시 되는 노드들을 포함하지 않습니다.
(display : none , meta태그 script 태그 등)
렌더트리는 각 HTML 요소의 레이아웃을 계산하는데 사용되며
브라우저 화면에 픽셀을 렌더링하는 페인팅 처리에 입력됩니다.
브라우저의 렌더링 과정은 반복해서 실행될 수 있으며
HTML DOM Tree Render Tree Layout Paint CSS CSSOM Tree
자바스크립트에 의한 노드 추가,삭제 혹은 뷰포트 크기 변경 등의 상황이 발생시
레이아웃 계산과 페인팅이 재차 실행됩니다.
이러한 리렌더링(페인팅을 다시 하는 것)은 비용이 많이 드는 작업이므로
리렌더링은 빈번하게 발생하지 않도록 하는 것이 좋습니다.
🙄자바스크립트의 파싱과 실행
DOM은 HTML문서의 구조와 정보를 담고있지만 뿐만 아니라
HTML요소와 스타일을 변경할 수 있는 프로그래밍 인터페이스 DOM API를 제공합니다.
그래서 우리는 자바스크립트 코드에서 DOM API를 통해 DOM을 동적으로 조작할 수 있습니다.
script 태그의 src 어트리뷰트에 정의된 자바스크립트 파일을 서버에 요청하여 로드한 자바스크립트 파일을
파싱시키기 위해서 렌더링 엔진은 자바스크립트 엔진에 제어권을 넘깁니다.
즉 자바스크립트 코드의 파싱과 실행은 자바스크립트 엔진이 처리하며
자바스크립트 엔진은 자바스크립트 코드를 파싱하여 low-level language로 변환하고 실행합니다.
그리고 HTML과 CSS가 그렇듯이 자바스크립트 엔진은 자바스크립트를 해석하여
AST(Abstract Syntax Tree)(추상적구문트리)를 생성한 뒤 AST를 기반으로 바이트 코드를 생성해 실행합니다.
**바이트코드?
인터프리터가 실행할 수 있는 중간 코드(Intermediate code)를 뜻합니다.
🙄토크나이징? 이 뭐에요
토크나이징은 소스코드를 코드의 최소 단위인 토큰으로 분해하는 과정을 말합니다.
즉 자바스크립트 소스코드를 어휘 분석하여 문법적 의미를 갖는 코드의 최소 단위로 분해하는 과정입니다.
🙄파싱
토큰들의 집합을 구문 분석하여 AST를 생성합니다.
AST는 토큰에 문법적 의미와 구조를 반영한 트리 구조이며
AST를 통해 TypeScript, Babel, Prettier 와 같은 트랜스 파일러를 구현할 수 있다네요
🙄리플로우와 리페인트
리플로우는 레이아웃 계산을 다시하는 것을 말하며 레이아웃에 영향을 주는 변경
(노드 추가,삭제 / 요소의 크기,위치변경 / 윈도우 리사이징 등)
이 발생한 경우 실행됩니다.
따라서 레이아웃에 영향이 없는 변경은 리플로우 없이 리페인트만 실행됩니다.
🙄script 태그에 async/defer 어트리뷰트
DOM 생성은 직렬적으로 일어납니다. 따라서 이 문제를 해결하기 위해 async, defer 가 추가되었습니다.
위 두 어트리뷰트는 src 어트리뷰트가 없는 인라인 자바스크립트에는 사용할 수 없습니다.
<script async src = "~~.js></script> <script defer src = "~~.js></script>
이런식으로 사용하는 거군요 위 어트리뷰트를 사용하면
HTMl 파싱과 외부 자바스크립트 파일의 로드가 비동기적으로 동시에 진행됩니다.
asynce 어트리뷰트
HTML 파싱과 외부 자바스크립트 파일의 로드가 비동기적으로 동시에 진행됩니다.
단 자바스크립트의 파싱과 실행은 자바스크립트 파일의 로드가 완료된 직후 진행되며
이때 HTML 파싱이 중단됩니다.
또한 여러개의 script 태그에 async 어트리뷰트를 지정하면 로드가 완료된 자바스크립트부터 먼저 실행되어
순서가 보장되지 않기 때문에 순서 보장이 필요할 땐 async를 사용해선 안됩니다.
자바스크립트 로드 자바스크립트 실행 HTML파싱 멈춤 DOMcontentLoaded 이벤트
defer 어트리뷰트
defer 어트리뷰트의 경우엔 자바스크립트의 파싱과 실행이 HTML 파싱이 완료된 직후에
발생한다는 특징이 있습니다.
따라서 defer는 DOM 생성이 완료된 이후에 실행되어야 할 자바스크립트에 유용한 어트리뷰트입니다.
자바스크립트 로드 자바스크립트 실행 HTML파싱 DOMcontentLoaded 이벤트
그것이.. 브라우저니까..
반응형
'javascript' 카테고리의 다른 글
요약 정리는 못 참지 않을까요? (15) 비동기 프로그래밍 (0) | 2023.01.20 |
---|---|
요약 정리는 못 참지 않을까요? (14) DOM (0) | 2023.01.17 |
요약 정리는 못 참지 않을까요? (12) 이터러블 (0) | 2023.01.17 |
요약 정리는 못 참지 않을까요? (11) RegExp (1) | 2023.01.17 |
요약 정리는 못 참지 않을까요? (10) 배열 (0) | 2023.01.16 |