[JS] script async와 defer의 차이점 + use strick
<script> async와 defer의 차이점
1. <head> 안에 <script> 작성 시
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Document</title>
<script src="main.js"></script>
</head>
<body>
<div></div>
</body>
</html>
브라우저는 HTML을 읽다가 <script>…</script>를 만나면 DOM 생성을 멈추고
스크립트를 다운 받고 실행한 후에 남은 페이지를 처리한다.이러한 브라우저의 동작으로
- 스크립트에서는 스크립트 아래의 요소에 접근할 수 없게 됨.
- 스크립트를 다운받고 실행할 때까지 스크립트 아래 내용을 볼 수 없게 됨.
2. <body> 끝에 <script> 작성 시
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Document</title>
</head>
<body>
<div></div>
<script src="main.js"></script>
</body>
</html>
js 파일을 받기 전에 페이지가 준비되기에 사용자가 페이지 컨텐츠를 볼 수 있음.
하지만 웹사이트가 JS에 의존적이라면 정상적인 페이지를 보기 위한 기다림이 또 필요해짐.
3. <head>에 async 속성 부여
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Document</title>
<script async src="main.js"></script>
</head>
<body>
<div></div>
</body>
</html>
async는 boolean 타입의 속성으로 선언만 해도 true로 사용함.
parsing하다가 해당 async 속성을 가진 <script> 태그를 만나면 parsing과 병렬로 js파일 다운함.
다운이 끝나면 parsing을 멈추고 다운된 js파일을 실행하며 실행이 끝나면 마저 HTML을 parsing함.
body 끝에서보단 다운로드 시간을 줄일 수 있음.
하지만, 실행할 때 필요한 DOM 요소가 아직 parsing되지 않았거나 js파일 실행을 위한 멈추는 시간이 있으므로
사용자가 페이지를 보는데에 시간이 걸릴 수 있는 단점이 있음.
<head>
<meta charset="UTF-8"/>
<title>Document</title>
<script asyn src="a.js"></script>
<script asyn src="b.js"></script>
<script asyn src="c.js"></script>
</head>
정의된 스크립트 순서와는 상관없이 다운이 되는 순서대로 실행됨.
스크립트의 순서에 의존적(선행되어야한다면)이라면 문제가 될 수 있음.
4. <head>에 defer 속성 부여
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<title>Document</title>
<script defer src="main.js"></script>
</head>
<body>
<div></div>
</body>
</html>
fetching과 parsing을 병렬로 같이 진행 후 parsing이 끝나게 되면 js를 실행함.
<head>
<meta charset="UTF-8"/>
<title>Document</title>
<script defer src="a.js"></script>
<script defer src="b.js"></script>
<script defer src="c.js"></script>
</head>
parsing하는 동안 다 다운 받아 순서대로 실행.
정의한 순서가 지켜지므로 원하는대로 스크립트 실행이 가능함.
→ 가장 효율적! 안전!
5. 흐름 한 눈에 보기
(출처 : https://javascriptanswers.com/defer-or-async/)
use stirct
// whole-script strict mode syntax
// Javascript is very flexible
// flexible === dangerous
// added ECMAScript 5
'use strict';
선언되지 않은 변수에 값을 할당한다던지,
기존에 존재하는 프로토타입을 변경한다던지, 등이 가능함.유연함 === 개발자의 실수↑
‘use strict’을 선언하게 되면 비상식적인 것을 쓸 수 없게 됨.
strict 모드로 개발 시 js엔진이 js를 더 효율적, 더 빠르게 분석할 수 있으므로 성능 개선까지 기대할 수 있음.
댓글남기기