[JavaScript] script 태그 위치와 defer
Lpla
·2021. 3. 10. 22:03
자바스크립트는 html의 어디에 위치하는게 좋을까?
자바스크립트는 head 안에 혹은 body 위쪽에 <script src="...">
형태로 사용한다.
브라우저는 html을 위쪽부터 읽으며 내려오다가 <script>
를 만나게 되면 DOM 생성을 멈추고 외부 script 파일을 읽는다.
html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="style.css">
<script src="js/script1.js"></script>
<script src="js/script3.js"></script>
</head>
<body>
<script src="js/script2.js"></script>
</body>
</html>
script1.js
document.body.prepend('script1.js');
console.log('script1.js');
script2.js
document.body.prepend('script2.js');
console.log('script2.js');
script3.js
document.body.prepend('script3.js');
console.log('script3.js');
script1.js 와 script3.js 는 head에 있고 script2.js 는 body 에 있다.
결과
script1.js 와 script3.js 는 body가 생성되기 전에 실행되기 때문에 에러가 발생한다.
반면 script2.js 는 body가 생성되고 마지막에 실행되기 때문에 정상적인 결과가 출력된다.
이처럼 head 보다 body 에 script 태그를 추가하는 것이 안전하다.
하지만 head 에 사용하고 싶다면 defer
를 사용해 위 문제를 해결할 수 있다.
html
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="style.css">
<script src="js/script1.js" defer></script>
<script src="js/script3.js" defer></script>
</head>
<body>
<script src="js/script2.js"></script>
</body>
</html>
결과
script 태그에 defer 속성을 사용하면 브라우저가 html을 읽을 때 <script>
를 만나더라도 DOM 생성을 멈추지 않고 html을 계속 읽어 들인다.
그리고 defer 속성이 있는 script 태그는 DOM이 준비가 된 이후에 실행된다.
html이 모두 파싱되기 전에 script가 실행되는 불상사를 막을 수 있는 것이다.