Async VS Defer

업데이트:

HTML 안에서 JS 효율적으로 배치방식

1. head 안에 위치

  • js file이 크고 인터넷이 느리다면 브라우저의 과부하가옴
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="main.js"></script>
</head>
<body>
    
</body>
</html>

2. body 맨 끝에 위치

  • html이 parsing(그려지는것을 의미)하고 서버로부터 js file을 받아와 속도가 빨라짐
  • 단점은 해당 페이지가 js에 의존적인 페이지라면, 사용자가 정상적인 페이지를 받아올수 없음
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div></div>
    <script src="main.js"></script>
</body>
</html>

3. head + async

  • 병렬로 main.js를 받기 다운받는 속도가 빠름, but DOM요소를 컨트롤할때 HTML이 완료되지않으면 문제가 생길 위험 있음
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script async src="main.js"></script>
</head>
<body>
    
</body>
</html>

4. head + defer (가장 좋은 방법)

  • 병렬로 main.js를 받고 실행은 HTML이 전부 Parsing되었을때 실행됨
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script defer src="main.js"></script>
</head>
<body>
    
</body>
</html>

※ ‘use strict’; 를 JS를 작성할떄 맨 위에 명시해주면 좋음
(JS는 Flexible하기 때문에 떄로 이해할 수 없는상황이 일어날수 있음, 이를 방지하기 위함임)