위 그림에서 보여주듯이 스크립트를 가져와서 실행하기 위해 HTML 구문 분석이 일시 중지되므로 HTML이 화면에 출력되는 시간이 길어진다. 만약 모든 자바스크립트 파일을 브라우저에서 한 번에 로딩하게 된다면 그만큼 HTML이 화면에 출력되는 것이 늦어지므로 스크립트 파일이 다 로드 될 때까지 아무것도 볼 수 없는 유저의 입장에서는 해당 페이지에 오류가 있다고 판단하여 페이지를 이탈할 가능성이 생기게 된다.
<script src="script.js">
스크립트가 로드 되고 실행되는 동안 브라우저가 DOM을 그리지 못하게 블럭하기 때문에 화면 뷰가 늦게 보여진다.
상기 스크립트 로드 방식의 문제점을 해결하기 위해 async와 defer 키워드가 등장했다.
<script async src="script.js">
<script defer src="script.js">
두 가지 방식 모두 브라우저가 DOM을 먼저 그리게 한다.
기존 방식
브라우저가 스크립트를 만나면 스크립트를 다운 받고 난후 실행까지 연속적으로 수행한다. 이 동안에 브라우저는 DOM을 그리지 않는다.
async 방식
브라우저가 스크립트를 만나면 DOM을 그림과 동시에 스크립트를 다운받는다. 스크립트를 다운받고 난 후 바로 스크립트를 실행하는데, 실행하는 동안에는 DOM을 그리지 않는다.
defer 방식
브라우저가 스크립트를 만나면 DOM을 그림과 동시에 스크립트를 다운받는다. 스크립트를 전부 다운로드 받더라도 스크립트를 바로 실행하지 않고 DOM이 전부 그려질 동안 기다렸다가 스크립트가 실행된다.
https://zzossig.io/posts/javascript/script_load_dynamically/