Skip to main content Link Menu Expand (external link) Document Search Copy Copied

javascript async vs defer μ˜΅μ…˜

Table of contents

  1. 상황 별, μžλ°”μŠ€ν¬λ¦½νŠΈ fetching κ³Ό executing μ‹œμ 
    1. head νƒœκ·Έ μ•ˆμ— script νƒœκ·Έκ°€ μžˆλŠ” 경우
    2. body νƒœκ·Έ 끝 뢀뢄에 script νƒœκ·Έκ°€ μœ„μΉ˜ν•˜λŠ” 경우
    3. head νƒœκ·Έμ•ˆμ— script νƒœκ·Έμ— async μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λŠ” 경우
    4. head νƒœκ·Έμ•ˆμ— script νƒœκ·Έμ— defer μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λŠ” 경우


상황 별, μžλ°”μŠ€ν¬λ¦½νŠΈ fetching κ³Ό executing μ‹œμ 


기본적으둜 html ꡬ문을 μœ„μ—μ„œ λΆ€ν„° ν•œμ€„ ν•œμ€„μ”©, parsing ν•˜λ©΄μ„œ μ½μ–΄λ‚˜κ°„λ‹€.


head νƒœκ·Έ μ•ˆμ— script νƒœκ·Έκ°€ μžˆλŠ” 경우


<!DOCTYPE html>
<html lang = "en">
	<head>
	<meta charset="UTF-8" />
	<title>Document</title>
	<script src = "main.js"></script>
</head>
<body></body>
</html>


μœ„μ™€ 같이 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•˜λ©΄, μœ„μ—μ„œ λΆ€ν„° λ‚΄λ €μ˜€λ©΄μ„œ HTML ꡬ문을 parsing ν•˜λ‹€κ°€ <script> νƒœκ·Έλ₯Ό λ°œκ²¬ν•˜λ©΄

ν•΄λ‹Ή 슀크립트 νƒœκ·Έμ˜ src νŒŒμΌμ„ μ„œλ²„μ—μ„œ λ‹€μš΄λ‘œλ“œ(fetching) ν•˜κ³  μ‹€ν–‰(executing) ν•˜κ²Œ λœλ‹€.

그러고 λ‚˜μ„œ 남은, HTML ꡬ문을 parsing ν•œλ‹€.

image-20230114001347411

그림으둜 보면 μœ„μ™€ 같은 과정을 κ±°μΉœλ‹€.


μžλ°”μŠ€ν¬λ¦½νŠΈ 파일이 μ»€μ„œ λ‹€μš΄λ‘œλ“œν•˜κ³  μ‹€ν–‰ν•˜λŠ”λ° 였래 κ±Έλ¦°λ‹€λ©΄, μ™„μ „ν•œ HTML νŒŒμΌμ„ λ³΄κΈ°κΉŒμ§€ μ‹œκ°„μ΄ 였래 κ±Έλ¦°λ‹€λŠ” 단점이 μžˆλ‹€.


body νƒœκ·Έ 끝 뢀뢄에 script νƒœκ·Έκ°€ μœ„μΉ˜ν•˜λŠ” 경우


<!DOCTYPE html>
<html lang = "en">
	<head>
	<meta charset="UTF-8" />
	<title>Document</title>
</head>
<body>
    <script src = "main.js"></script>
</body>
</html>

μœ„μ™€ 같이 μ½”λ“œκ°€ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•˜λ©΄, HTML νŒŒμΌμ„ λͺ¨λ‘ parsing ν•œ λ’€, scipt νƒœκ·Έλ₯Ό λ°œκ²¬ν•˜μ—¬ λ‹€μš΄λ‘œλ“œλ°›κ³  μ‹€ν–‰ν•  것이닀.

image-20230114001749439


μ‚¬μš©μžκ°€ 기본적인 HTML 컨텐츠λ₯Ό λΉ λ₯΄κ²Œ λ³Ό 수 μžˆλŠ” μž₯점이 μžˆμ§€λ§Œ, μžλ°”μŠ€ν¬λ¦½νŠΈμ— 의쑴적인 μ‚¬μ΄νŠΈμ˜ κ²½μš°λŠ” 정상적인 νŽ˜μ΄μ§€λ₯Ό λ³΄κΈ°κΉŒμ§€ 였래 걸릴 수 μžˆλ‹€.


head νƒœκ·Έμ•ˆμ— script νƒœκ·Έμ— async μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λŠ” 경우


<!DOCTYPE html>
<html lang = "en">
	<head>
	<meta charset="UTF-8" />
            <script asyn src = "main.js"></script>
	<title>Document</title>
</head>
<body>
</body>
</html>

μœ„μ™€ 같이 μ½”λ“œκ°€ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€κ³  ν• λ•Œ,

image-20230114002046784

script의 async μ˜΅μ…˜μ„ ν™•μΈν•˜λ©΄, λ³‘λ ¬λ‘œ λ‹€μš΄λ‘œλ“œ 받도둝 μš”μ²­ν•œλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈ 파일 μ €μž₯이 μ™„λ£Œλ˜λ©΄, HTML 을 parsing ν•˜λŠ” 것을 λ©ˆμΆ”κ³  λ‹€μš΄λ°›μ€ μžλ°”μŠ€ν¬λ¦½νŠΈ νŒŒμΌμ„ μ‹€ν–‰μ‹œν‚¨λ‹€.

싀행이 λλ‚œ λ’€, 남은 HTML 을 parsing ν•œλ‹€.


λ‹€μš΄λ‘œλ“œ λ°›λŠ” μ‹œκ°„μ„ μ ˆμ–„ν•  수 μžˆμ§€λ§Œ, HTML이 완전이 parsing 이 λλ‚˜κΈ° 전에 μ‹€ν–‰λ˜λ―€λ‘œ μ™„μ „ν•œ νŽ˜μ΄μ§€λ₯Ό ν™•μΈν•˜λŠ” μ‹œκ°„μ„ λ‹¨μΆ•ν•˜κΈ°λŠ” μ–΄λ €μšΈ 수 μžˆλ‹€.


head νƒœκ·Έμ•ˆμ— script νƒœκ·Έμ— defer μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λŠ” 경우


<!DOCTYPE html>
<html lang = "en">
	<head>
	<meta charset="UTF-8" />
            <script defer src = "main.js"></script>
	<title>Document</title>
</head>
<body>
</body>
</html>

μœ„μ™€ 같이 μ½”λ“œκ°€ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€λ©΄,

image-20230114002407727

script 의 defer μ˜΅μ…˜μ„ ν™•μΈν•˜λ©΄, λ³‘λ ¬μ μœΌλ‘œ λ‹€μš΄λ‘œλ“œ 받도둝 ν•˜κ³ , 싀행은 HTML parsing 이 λλ‚˜λ©΄ μ§„ν–‰ν•˜λ„λ‘ ν•œλ‹€.

λ˜ν•œ, defer μ˜΅μ…˜μ΄ 적용된 scriptκ°€ μ—¬λŸ¬κ°œλΌλ©΄, λ‹€μš΄λœ μˆœμ„œμ™€ 관계 없이, λ°œκ²¬ν•œ μˆœμ„œλŒ€λ‘œ μ‹€ν–‰μ‹œν‚¬ 수 μžˆμ–΄ μ•ˆμ „ν•œ μ›Ή μ‚¬μ΄νŠΈ ν‘œν˜„μ΄ κ°€λŠ₯해진닀.