사용자가 HTML 파일을 다운 받았을 때, 브라우저
렌더링 엔진
은 한 줄씩 순차적으로 파싱하면서 DOM을 생성해 나가다가 script 태그를 만나면 DOM 생성을 일시 중단한다.
script 태그 내의 자바스크립트 코드를 파싱하기 위해 Node.js의 V8과 같은 자바스크립트 엔진이 파싱과 실행을 하게된다.
자바스크립트 엔진은 코드를 파싱하여 CPU가 이해할 수 있는 low level language로 변환하고 실행한다.
렌더링 엔진 ->
자바스크립트 엔진이 제어권을 넘겨 받고 JS 코드를 파싱하기 시작한다. ->
자바스크립트 엔진은 JS코드를 해석한다. ->
AST 추상적 구문 트리 라는 것을 생성한다. ->
이것을 기반으로 인터프리터가 실행할 수있는 중간코드인 바이트코드를 생성해서 실행한다.
브라우저는 동기적으로 HTML, CSS JS를 파싱하고 실행한다. <script>
태그 위치에 따라 HTML 파싱이 blocking 되어 DOM 생성이 지연될 수 있다.
<script>
태그를 <head>
태그나 <body>
안에 추가할 수 있는데, <head>
에 위치시키는 것은 좋은 방법이 아니다.
<script>
태그를 <head>
태그에 넣지 말아야 하는 이유<script>
태그를 <body>
요소의 가장 아래에 위치 시키는 것이 바람직하다.HTML 파싱과 JS 파일 로드가 비동기적으로 동시에 진행된다.
JS 파일 로드는 HTML이 파싱되는 동안에도 진행하지만, JS 실행은 HTML이 파싱된 이후에 실행되고, 이때는 HTML 파싱이 중단된다.
async 어트리뷰트와 같이 HTML 파싱을 하다가 script 태그를 만나면 JS 로드를 하지만, JS 실행은 HTML 파싱이 모두 완료된 후 (DOM 생성이 완료된 직후)에 진행된다.
자바스크립트 Deep Dive