HTML에서 자바스크립트를 포함할 때 어떻게 포함하는 것이 더 효율적일까요?
<!DOCTYPE html>
<html lang="ko">
<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>방법1</title>
<script src="main.js"></script>
</head>
<body>
</body>
</html>
HTML을 쭉 파싱하다가 script 태그가 보이면 HTML을 파싱하는것을 잠시 멈춤
필요한 JS 파일을 서버에서 다운받아 실행한 다음에 파싱하는 부분으로 넘어감
자바스크립트 파일 사이즈가 큰 경우 페이지가 로드되는데 많은 시간이 소요됨
<!DOCTYPE html>
<html lang="ko">
<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>방법2</title>
</head>
<body>
<script src="main.js"></script>
</body>
</html>
HTML을 쭉 파싱해서 페이지가 준비된 다음 script를 만나서 서버에서 받아오고 실행
사용자가 기본적인 HTML을 빨리 볼 수 있음
자바스크립트 의존성이 큰 경우, 사용자가 정상적으로 작동하는 웹 페이지를 보기 어려움
<!DOCTYPE html>
<html lang="ko">
<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>방법3</title>
<script async src="main.js"></script>
</head>
<body>
</body>
</html>
브라우저가 HTML을 파싱하다가 async을 확인하고 병렬로 다운로드를 명령만 해놓음
다시 파싱을 하고 JS 파일이 다운로드되면 그때 파싱을 멈춤
다운로드된 JS 파일을 실행하게된다.
이후 실행을 다하고나서 나머지 HTML을 파싱함
다운로드받는속도를 절약할 수 있지만 HTML이 파싱되기도 전에 실행이 됨
사용자가 페이지를 보는데 여전히 시간이 조금 걸릴 수 있음
<!DOCTYPE html>
<html lang="ko">
<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>방법4</title>
<script defer src="main.js"></script>
</head>
<body>
</body>
</html>
HTML을 파싱을하다가 defer를 확인하고 JS 파일 다운로드를 명령시킴
나머지 HTML을 끝까지 파싱하게 함
이후 마지막 파싱을 끝낸 다음 다운로드된 JS 파일을 실행하도록 함
가장 효율적인 방법❣
스크립트를 다운로드하는 동안 HTML이 중단되지 않습니다.
async
는 script가 다운로드 됐을 때 곧바로 평가 실행하고, defer
는 HTML을 완전히 읽은 후에 실행합니다.
async
는 정의된 script 순서에 상관없이 먼저 다운로드가 완료된 파일을 우선적으로 실행하기 때문에 JS 파일이 순서에 의존적이라면 문제가 생길 수 있습니다.
반면, defer
는 정의된 순서대로 실행되기 때문에 훨씬 안전합니다.