<script/>
태그는 javascript코드를 웹 페이지에 포함시키는데 사용되는 태그이다.
스크립트 태그는 보통 body의 close 태그 직전에 삽입하는 것으로 알고 있다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
<style></style>
</head>
<body>
<div id="box"></div>
<script />
</body>
</html>
이것은 브라우저에서 화면을 렌더링 할 때, html을 파싱 중 javascript 코드를 만나게 되면 파싱이 중단되기 때문이다.
하지만, body태그의 끝부분에 그냥 <script/>
태그를 썼을 때의 문제점이 있다.
html이 엄청 클 때에는 html을 파싱을 마치고나서 javascript를 받으려면 interaction이 이루어질 때 까지 시간이 오래 걸린다는 것이다.
이를 해결하기 위해서 html을 파싱을 하면서, javascript를 비동기적으로 다운로드 받을 수 있게 하기 위해서 <script/>
태그에는 defer
와 async
라는 속성이 있다. 오늘은 이것을 알아보자!
이 속성을 알기 전에 DOMContentLoaded
라는 개념을 먼저 이해하면 좋다.
DOMContentLoaded
load
beforeunload
/ unload
beforeunload
: 사용자가 사이트를 떠나려 할 때 발생하는 이벤트. ex) 저장되지 않은 변경사항이 있습니다 등unload
: 사용자가 실제로 사이트를 떠날 때 발생하는 이벤트. ex) 사용자 분석 통계 등을 전송 <script defer src="script.js" />
<script async src="script.js" />
defer | async | |
---|---|---|
여러 script 실행 순서 | 문서에 추가된 순서대로 실행 됨 | 먼저 load된 것 부터 실행됨 (load-first) |
실행 시점 | html 파싱 이후, DOMContentLoaded 이전 | html이 모두 파싱되지 않은 상태에서도 실행될 수 있음. |
createElement()
로 동적으로 script 태그를 추가하는 방법이 있다. let script = document.createElement('script');
script.src = "/script.js";
document.body.append(script);
이렇게 동적으로 추가된 script 태그는 기본적으로 async
속성을 가진다.
그러기 때문에 위에서 언급한 async script 태그의 속성인
1. 스크립트가 다운로드 즉시 실행되며.
2. 여러 스크립트가 있을 시, 다운로드 된 순서대로 실행된다.
async 속성을 원하지 않는다면, async 속성을 false로 지정해주면 된다.
script.src = "/script.js";
script.async = false;
Reference