February 28, 2021
HTML에서 JS를 포함할 때 어떻게 포함하는 것이 더 효율적일까?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script src="main.js"></script>
</head>
<body></body>
</html>
<script>
태그가 보이면 JS 를 다운로드 받아야 되네라고 이해하게 된다.
그래서 HTML 파싱하는 것을 잠시 멈추고 필요한 JS 를 서버에서 다운로드 받아서 실행한 다음에 HTML 파싱하는 부분으로 넘어간다.script
를 head
에 포함하는 것은 좋은 방법이 아니다.<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<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>
body
내, 가장 하단에 script
를 추가하는 방법<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script async src="main.js"></script>
</head>
<body>
<div></div>
</body>
</html>
head
안에 script
태그를 넣되, async
라는 속성값을 이용한다body
끝에 사용하는 것 보다는 JS fetching이 HTML 파싱하는 동안 병렬로 일어나기 때문에 다운로드 받는 시간을 절약할 수 있다.여러개의 JS 파일을 async
로 다운로드 받게 되면 작성한 순서대로 script 가 실행되는 것이 아니라 먼저 다운로드 된 것이 먼저 실행된다. 만약 JS 파일끼리 의존적이라 순서가 중요하다면 이러한 방식은 위험할 수 있다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
<script defer src="main.js"></script>
</head>
<body>
<div></div>
</body>
</html>
head
안에 script
태그를 넣되, defer
라는 속성값을 이용한다여러 개의 JS 파일을 defer
로 다운로드 받게 되면 다운로드가 먼저 끝나는 것과 상관 없이 실행은 작성한 script 순서대로 실행된다.