1)렌더링 엔진이 HTML 파싱 하며 돔을 만들어 나가다가
CSS파일 로드하는 style이나 link파일 만나면 DOM생성 중단하는 것처럼,
렌더링 엔진이 HTML 파싱 하며 돔을 만들어 나가다가JS파일을 로드하는 <script>
를 만나게 된다면, DOM 생성 중지.
2)<script>
안의 src attribute에 정의된 JS파일을 서버에 요청해 로드한 JS파일 or JS코드를 파싱하기 위해 자바스크립트 엔진에 제어권을 넘긴다.
=> JS파일은 렌더링 엔진이 아닌 자바스크립트 엔진이 처리.
3)JS파일 파싱 실행, 종료 후 다시 렌더링 엔진으로 제어권이 넘어감. html 파싱 중단된 지점부터 다시 파싱시작해 DOM 생성 재개.
4) html DOM / CSS CSSOM 생성하듯이 JS파일은 AST 생성
<script>
위치에 따라 HTML파싱 중단, 돔 생성 지연. <script>
tag 위치에 의해 블로킹이 발생할 수도 있으니 <script>
태그 위치 중요.👉 head tag안에 script tag 포함하는 경우
script tag 만나는 순간 html파싱 멈추고, js파일 서버에서 다운&실행 후 다시 html파싱 시작.
단점 : js파일이 크면 시간이 많이 소요된다.
👉 body tag안 제일 밑에 script tag 추가하는 경우
html 파싱 완료하고 페이지 준비한 다음 js파일 다운, 실행. 로드된 html파일을 빨리 볼 수 있다는 장점이 있다.
단점 : 웹페이지가 js에 의존적이라면, 즉 사용자가 의미있는 컨텐츠를 보기 위해서는 js파일이 필요하다면.. 실행시간이 오래걸림
<script>
안 async, defer 추가 <script async src = "main.js"></script>
<script defer src = "main.js"></script>
👉 async
장점 : 처음 html 파싱시작하고 js파일을 병렬적으로 fetching하기에 다운로드 받는 시간을 바디끝에 사용하는 것보다 줄일 수 있다.
단점 : 그러나 html 파싱이 되기 전 js파일이 실행되기 때문에 제이쿼리 등으로 조작하려는 시점에 html에 우리가 원하는 요소가 정의되어있지 않을 수도있다.
여전히 사용자가 보는데 시간이 걸린다는 단점이 있다.
또한 async 옵션으로 다수의 파일을 다운할 경우,정의된 순서 상관없이 먼저 다운로드 되는 순서대로 파일을 실행하기 때문에 만약 JS파일이 순서에 의존적이라면 async는 문제가 있다.
👉 defer
html 파싱 중 >> js파일 페칭 명령만 시켜놓고 >> 병렬적으로 나머지 html을 파싱 >> js실행.
즉 사용자에게 페이지를 보여준 다음 , 바로 자바스크립트를 실행.
필요한 자바스크립트 파일 다운 후 순서대로 작동하기 때문에 우리가 원하는 대로 스크립트가 실행될 수 있다. 제일 효율적, 안전.
사진출처 및 참고자료