[JS] async VS defer

[ html에서 자바스크립트 파일을 불러오는 방법 ]

1. head 태그 안에 스크립트를 포함할 경우

parsing HTML > blocked(fetching js, executing js) > parsing HTML > page is ready

1) 브라우저는 html코드를 한 줄 한 줄씩 분석하다가 css와 병합해서 dom요소로 변환한다. 2) 한 줄 씩 읽어 나가다가 스크립트 태그를 만나면 이 자바스크립트 파일을 다운받아야 하네? 라고 인식하고, html 파싱하는것을 잠시 멈추고 필요한 자바스크립트 파일을 서버에서 다운받아서 이것을 실행한 다음에 다시 파싱하게 된다.


2. body 안 제일 끝부분에 스크립트 추가할 경우

parsing HTML > page is ready > fetching js > executing js

브라우저가 html을 다운받아서 쭉 parsing 해서 페이지가 준비가 된 다음에 스크립트 태그를 만나서 스크립트 파일을 서버에서 받아오고(fetching) 실행(executing)하게 된다.

이렇게 하게 되면, 페이지가 사용자들에게 js받기전에도 이미 준비가 되서 사용자가 페이지 컨텐츠를 볼 수 있다.


3. head + async

parsing HTML / fetching js > parsing HTML > executing js > parsing HTM > page is ready

head 태그안에 스크립트 태그를 이용하되, asyn 속성값을 사용한다 asyn은 boolean타입의 속성값이기 때문에 선언만해줘도 true로 설정이 된다. 브라우저가 html을 다운로드 받아서 parsing하다가 asyn를 만나면 병렬로 ‘js파일을 다운로드 받자’ 라고 명령만 해놓고, 다시 파싱하다가 js파일이 다운로드가 완료되면 parsing하는것을 멈추고 다운로드 된 js파일을 실행(executing)하게 된다. 그 다음 나머지 html을 parsing하게 된다.


4. head + defer

parsing HTML / fetching js > page is ready > executing js

head 태그안에 스크립트 태그를 이용하되, defer 속성값을 사용한다 브라우저가 html을 다운로드 받아서 parsing하다가 defer를 만나면 ‘js파일을 다운로드 받자’ 라고 명령만 해놓고, 나머지 html을 끝까지 parsing하게 된다. 그리고 마지막에 다운로드 되어진 js파일을 실행하게 된다.


5. async과 defer 차이점

async 옵션으로 다수의 자바스크립트 파일을 다운로드 받게 되면, 먼저 다운로드가 완료된 파일부터 실행하게 된다. 즉, 정의된 스크립트 순서에 상관없이 다운로드가 완료된 순서대로 실행되기 때문에 만약 스크립트 작성 순서에 의존적인 페이지라면 문제가 있다.

defer의 경우 html 파싱하는 동안 필요한 자바스크립트 파일을 다운로드 받은 다음에, 정의된 순서대로 실행하기 때문에 원하는대로 스크립트가 실행이 된다.


출처 : youtube