브라우저가 html 문서를 파싱하다 script 태그를 만나면, 파싱을 중단하고 javascript 파일을 로드, 실행한다. 과정이 완료되면 그 후에 HTML 파싱을 계속한다.
script 태그의 위치에 따른 차이점에 대해 정리해보자.
script태그는 html 파일 내부 어디든 위치할 수 있지만, 크게 head내부와 body태그의 마지막으로 나눌 수 있다.
body 태그 내부를 파싱해 DOM트리를 생성하기전에 먼저 script를 로드하고 실행한다.
문제점
해결방안
html 파싱이 끝난 다음 script를 다운로드하고, 실행한다.
장점- script를 다운로드하기 전 html 코드를 파싱하기 때문에 사용자가 화면을 빨리 볼 수 있다.
문제점
해결방안 - async, defer 속성을 사용한다.
async는 html파일을 파싱하다 script 태그를 만나면 html를 파싱하는 동시에 script를 로드한다. 이후 실행시키는데, 실행시키는 동안에는 html파싱이 멈추게 된다. 실행이 완료된 이후 나머지 html을 파싱한다.
장점 - body 태그의 끝에 위치시켰을 때와 달리 script의 로드가 html파싱과 병렬적으로 이루어지기 때문에 다운로드 시간을 단축시킬 수 있다.
문제점
따라서 async 스크립트는 DOM에 직접 접근하지 않거나, 다른 스크립트에 의존적이지 않은 스크립트들을 독립적으로 실행해야 할 때 효과적이다. ex) google analytics
defer는 HTML을 파싱하다 script 태그를 만나면 async와 마찬가지로 html을 파싱하면서 script를 로드한다. 다만 이를 바로 실행시키는 async와 달리 html파싱이 모두 완료된 이후 스크립트를 실행한다.
장점
무조건 defer가 좋은것은 아니다.
DOM이나 다른 스크립트에 의존성이 없고, 실행 순서가 중요하지 않은 경우라면 async
DOM이나 다른 스크립트에 의존성이 있고, 실행 순서가 중요한 경우라면 defer