본문 바로가기

WEB/JavaScript

[JavaScript] script async와 defer의 차이점

🌈 <head> 안에 옵션 스크립트 추가

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script src="main.js"></script>
</head>
<body>
</body>
</html>

로드 순서 : HTML 파싱 ⇨ <script> 태그 발견 ⇨ HTML 파싱 중단 ⇨ JS 다운 ⇨ JS 실행 ⇨ 다시 HTML 파싱

단점: JS파일이 엄청 크고 인터넷도 느리면 사용자가 웹사이트를 보기까지 오래 걸린다. 그래서 스크립트를 헤드에 포함하는 것은 좋지 않다.

🌈 <body> 안쪽 끝부분 스크립트 추가

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<script src="main.js"></script>
</body>
</html>

 

로드 순서 : <body> 태그 끝까지 HTML 파싱 ⇨ <script> 발견 ⇨ JS 다운 ⇨ JS 실행

장점: HTML 컨텐츠를 빠르게 본다.

단점: 의미있는 컨텐츠가 JS파일에 의존적이면 사용자가 기다려야 한다.

🌈 <head>안의 <script async....><script>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script async src="main.js"></script>
</head>
<body>
</body>
</html>

로드 순서 : HTML 파싱 ⇨ <script async> 발견 ⇨ 병렬로 JS 다운 명령 ⇨ 다시 HTML 파싱 ⇨  JS 다운 완료  ⇨ HTML 파싱 중단 ⇨  JS 실행  ⇨ 남은 HTML 파싱

장점: 다운이 병렬적으로 일어나기 때문에 다운받는 시간을 절약할 수 있다.

단점:  JS가 HTML이 파싱이 되기도 전에 실행이 되기 때문에 JS와 관련된 HTML의 요소가 파싱되지 않아 정의되지 않았을 경우 페이지 로드의 위험이 있다. 여전히 사용자가 페이지를 보는데 시간이 오래 걸린다.

🌈 [가장 좋은 방법] <head>안의 <script defer...></script> 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script defer src="main.js"></script>
</head>
<body>
</body>
</html>

로드 순서 : HTML 파싱 ⇨ <script defer> 발견 ⇨ JS 다운 명령 ⇨  HTML 모두 파싱 ⇨ JS 실행

장점: HTML 파싱과 병렬로 JS 다운 후 마지막에 JS파일 실행한다.