๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ปSTUDY/JavaScript

[JS] script async/defer

๋ฐ˜์‘ํ˜•

*parsing :: https://solog4something.tistory.com/13

(+)21.10.26 ์ถ”๊ฐ€
ํŒŒ์‹ฑ์€ ํ•ด๋‹น ์–ธ์–ด์˜ ๋ฌธ๋ฒ•๊ฒ€์‚ฌ๊ธฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
๋„คํŠธ์›Œํฌ๋กœ ๋ฐ›์€ HTML๊ณผ CSS ํŒŒ์ผ์„ ํ† ํฐํ™” ์‹œํ‚ค๊ณ  Parse Tree๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
์ด Parse Tree๋ฅผ DOM ํŠธ๋ฆฌ๋กœ ๋งŒ๋“ค์–ด ๋ Œ๋”ํ•˜๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ HTML์„ ํ™”๋ฉด์— ๋ณด์ด๊ธฐ ์œ„ํ•ด ํŒŒ์‹ฑํ•˜๋Š” ๋„์ค‘์— ํŒŒ์‹ฑ์„ ๋ฉˆ์ถ”๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณด์ž.

script


์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” *parser blocking resource(ํŒŒ์„œ ์ฐจ๋‹จ ๋ฆฌ์†Œ์Šค)์ด๋‹ค.

๊ธฐ๋ณธ ๋ชจ๋“œ๋กœ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•ด ์ฝ๋‹ค๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋‚˜๋ฉด ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์—ˆ๋˜ ํŒŒ์‹ฑ์„ ๋ฉˆ์ถ”๊ณ , ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์šด > ํŒŒ์‹ฑ > ์‹คํ–‰ ํ•œ ํ›„ ๋‹ค์‹œ HTML ๋ฌธ์„œ๋ฅผ ํŒŒ์‹ฑํ•˜๊ฒŒ ๋œ๋‹ค.

์Šคํฌ๋ฆฝํŠธ๋Š” ์ธ๋ผ์ธ์œผ๋กœ ์„ ์–ธ๋œ ๊ฒฝ์šฐ, ํŒŒ์‹ฑ๋˜๊ณ  ์‹คํ–‰๋˜์ง€๋งŒ ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฝ์šฐ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„ ํŒŒ์‹ฑํ•˜๊ณ  ์‹คํ–‰๋œ๋‹ค.

 

HTML ๋ฌธ์„œ๊ฐ€ ํด ๋•Œ ๊ธฐ๋ณธ๋ชจ๋“œ๋กœ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์šด/ํŒŒ์‹ฑ/์‹คํ–‰ ํ•  ๋•Œ๊นŒ์ง€ ๋ฌธ์„œ(HTML) ํŒŒ์‹ฑ์ด ์ค‘๋‹จ๋˜์–ด ํ™”๋ฉด ๋žœ๋”ฉ ์‹œ๊ฐ„์ด ๋” ์†Œ์š”๋œ๋‹ค.

 

*parser blocking resource :: parser-blocking script๋Š” javascript์˜ ํŒŒ์ผ ๋˜๋Š” ์ฝ”๋“œ๋กœ, ์Šคํฌ๋ฆฝํŠธํŒŒ์ผ์ด ๋‹ค์šด๋กœ๋“œ ๋  ๋•Œ๊นŒ์ง€ DOM ํŒŒ์‹ฑ(HTMLํŒŒ์‹ฑ)์€ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

๋ธŒ๋ผ์šฐ์ €์˜ Rendering - Rendering Process in browsers

 

 

async

*async :: Asynchronous ๋น„๋™๊ธฐ / (= async ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ๋น„๋™๊ธฐ ์Šคํฌ๋ฆฝํŠธ).

async (defalut: true) / type: boolean


  • async ์Šคํฌ๋ฆฝํŠธ ๋‹ค์šด๊ณผ ํ•จ๊ป˜ HTML ๋ฌธ์„œ ๋‚ด ์ฝ˜ํ…์ธ  ์ฒ˜๋ฆฌ, ์ถœ๋ ฅํ•œ๋‹ค.(HTML ๋ฌธ์„œํŒŒ์‹ฑ + async ์Šคํฌ๋ฆฝํŠธ ๋‹ค์šด)
  • async ์Šคํฌ๋ฆฝํŠธ ๋‹ค์šด ํ›„ ์‹คํ–‰ ์ค‘์—๋Š” HTML ํŒŒ์‹ฑ์ด ๋ฉˆ์ถ˜๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ด ๋๋‚œ ํ›„ ๋‚จ์€ ๋ฌธ์„œ๋ฅผ ์ฝ๋Š”๋‹ค.
  • *DOMContentLoaded ์ด๋ฒคํŠธ์™€ async ์Šคํฌ๋ฆฝํŠธ๋Š” ์„œ๋กœ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

*DOMContentLoaded ::

์ด๋ฒคํŠธ ์ดˆ๊ธฐ HTML ๋ฌธ์„œ๋ฅผ ์™„์ „ํžˆ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ๋ถ„์„ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒ. ์Šคํƒ€์ผ ์‹œํŠธ, ์ด๋ฏธ์ง€ ,ํ•˜์œ„ ํ”„๋ ˆ์ž„ ๋กœ๋”ฉ์€ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค. MDN_DOMContentLoaded

 

<p>...์Šคํฌ๋ฆฝํŠธ ์•ž ์ฝ˜ํ…์ธ ...</p>

<script>
  document.addEventListener('DOMContentLoaded', () => alert("DOM์ด ์ค€๋น„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!"));
</script>

<script async src="https://javascript.info/article/script-async-defer/long.js"></script>
<script async src="https://javascript.info/article/script-async-defer/small.js"></script>

<p>...์Šคํฌ๋ฆฝํŠธ ๋’ค ์ฝ˜ํ…์ธ ...</p>

(1) async ์Šคํฌ๋ฆฝํŠธ ๋‹ค์šด๋กœ๋“œ๋Š” ํŽ˜์ด์ง€ ๋กœ๋”ฉ์„ ๋ง‰์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ๊ฐ€ ๋ฐ”๋กœ ์ถœ๋ ฅ.

(2) DOMContentLoaded ์ด๋ฒคํŠธ๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ async ์Šคํฌ๋ฆฝํŠธ ์ „์ด๋‚˜ ํ›„์— ์‹คํ–‰๋œ๋‹ค. ์ •ํ™•ํ•œ ์ˆœ์„œ๋ฅผ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋‹ค. (3) ์œ„์น˜์ƒ์œผ๋กœ small.js๊ฐ€ ์•„๋ž˜์ด๊ธด ํ•˜์ง€๋งŒ long.js๋ณด๋‹ค ๋จผ์ € ๋‹ค์šด๋กœ๋“œ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋จผ์ € ์‹คํ–‰๋œ๋‹ค. ์ด์™€ ๊ฐ™์ด ๋จผ์ € ๋กœ๋“œ๊ฐ€ ๋œ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ 'load-firstorder'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋น„๋™๊ธฐ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฐฉ๋ฌธ์ž ์ˆ˜๋‚˜ ์นด์šดํ„ฐ๋‚˜ ๊ด‘๊ณ  ๊ด€๋ จ ์Šคํฌ๋ฆฝํŠธ๊ฐ™์ด ๋…๋ฆฝ์ ์ธ ์—ญํ•  ํ˜น์€ ์‹คํ–‰ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์— ์ ์šฉํ•œ๋‹ค.

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ํŒŒ์‹ฑ๋˜๋Š” ๋™์•ˆ์—๋„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰.

 

(+) 21.10.26

์žฅ์  :: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์˜์กด์ ์ธ ์›น์„ ์ข€ ๋” ๋นจ๋ฆฌ ์‹คํ–‰๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹จ์  :: HTML ํŒŒ์‹ฑ์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋™์•ˆ ๋ฉˆ์ถ”๊ฒŒ๋˜๋ฏ€๋กœ ํŒŒ์‹ฑ์ด ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ DOM์š”์†Œ์—  ์ ‘๊ทผํ•˜๋ ค๋Š” ์‹œ๋„๋กœ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ๋  ์ˆ˜ ์žˆ๋‹ค.(head ํƒœ๊ทธ์— script๋ฅผ ๋„ฃ์œผ๋ฉด ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ์ ๊ณผ ๊ฐ™๋‹ค.)

๋˜ํ•œ, ์‹คํ–‰์‹œ์ผœ์•ผ ํ•  ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ๋•Œ ์ˆœ์„œ์— ์ƒ๊ด€์—†์ด ๋จผ์ € ๋‹ค์šด๋ฐ›์•„์ง„ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋˜๋ฏ€๋กœ ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ ์ˆœ์„œ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.

 

defer

*defer :: (=defer ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ์ง€์—ฐ ์Šคํฌ๋ฆฝํŠธ).

defer๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ true, ์‚ฌ์šฉํ•˜๋ฉด false์ด๋‹ค. (์ผ๋ฐ˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ </body>ํƒœ๊ทธ์˜ ๋งจ ๋งˆ์ง€๋ง‰ ์ค„์— ์œ„์น˜์‹œ์ผœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•œ ํšจ๊ณผ๋ฅผ ์ค€๋‹ค.)


  • defer ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋‹ค์šด๋กœ๋“œ.
  • ๋ธŒ๋ผ์šฐ์ €๊ฐ€ defer ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋‚ฌ์„ ๋•Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ๋„์ค‘์—์„œ HTML ํŒŒ์‹ฑ ๊ณ„์† ์ง„ํ–‰. defer ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์€ ํŽ˜์ด์ง€ ๊ตฌ์„ฑ์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ์ง€์—ฐ๋œ๋‹ค.

[์˜ˆ์ œ1]

<p>...์Šคํฌ๋ฆฝํŠธ ์•ž ์ฝ˜ํ…์ธ ...</p>
<script defer src="https://javascript.info/article/script-async-defer/long.js?speed=1"></script>
<!-- ๋ฐ”๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. -->
<p>...์Šคํฌ๋ฆฝํŠธ ๋’ค ์ฝ˜ํ…์ธ ...</p>
  • defer ์Šคํฌ๋ฆฝํŠธ๋Š” ํŽ˜์ด์ง€ ์ƒ์„ฑ์„ ๋ง‰์ง€ ์•Š๋Š”๋‹ค.
  • DOM์ด ์ค€๋น„๋œ ํ›„์— ์‹คํ–‰๋˜๊ธด ํ•˜์ง€๋งŒ DOMContentLoaded ์ด๋ฒคํŠธ ๋ฐœ์ƒ ์ „์— ์‹คํ–‰๋œ๋‹ค.

[์˜ˆ์ œ2]

<p>...์Šคํฌ๋ฆฝํŠธ ์•ž ์ฝ˜ํ…์ธ ...</p>
<script>
document.addEventListener('DOMContentLoaded', () => alert('`defer`์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋œ ํ›„ DOM ์ค€๋น„.'))
</script><!-- (2) -->
<script defer src="https://javascript.info/article/script-async-defer/long.js?speed=1"></script><!-- (1) -->
<p>...์Šคํฌ๋ฆฝํŠธ ๋’ค ์ฝ˜ํ…์ธ ...</p>
  • ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ  ๋ฐ”๋กœ ์ถœ๋ ฅ.
  • DOMContentLoaded ์ด๋ฒคํŠธ๋Š” defer์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. alert ์ฐฝ์€ DOM ํŠธ๋ฆฌ๊ฐ€ ์™„์„ฑ๋˜๊ณ  defer์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋œ ํ›„ ๋œฌ๋‹ค.

 

defer ์Šคํฌ๋ฆฝํŠธ๋Š” ์ผ๋ฐ˜ ์Šคํฌ๋ฆฝํŠธ(script)์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ HTML์— ์ถ”๊ฐ€๋œ ์ˆœ(์ƒ๋Œ€์ˆœ, ์š”์†Œ์ˆœ)์œผ๋กœ ์‹คํ–‰. ๋”ฐ๋ผ์„œ ๊ธธ์ด๊ฐ€ ๊ธด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์•ž์—, ๊ธธ์ด๊ฐ€ ์งง์€ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋’ค์— ์žˆ์–ด๋„ ๋จผ์ € ๋‹ค์šด์„ ๋ฐ›๊ณ  ๊ธด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ๋‹ค.

 

defer ์†์„ฑ์€ ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ์—๋งŒ ์œ ํšจํ•˜๋‹ค. <script>์— src๊ฐ€ ์—†์œผ๋ฉด defer์†์„ฑ์€๋ฌด์‹œ๋œ๋‹ค.

 

(+)21.10.26 ์ถ”๊ฐ€

defer ์Šคํฌ๋ฆฝํŠธ๋Š” ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด๋„ ๋ฏธ๋ฆฌ ๋‹ค์šด์„ ๋‹ค ๋ฐ›๊ณ  HTML๋„ ๋๊นŒ์ง€ ํŒŒ์‹ฑ์‹œํ‚จ ํ›„์— ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— async์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

โœ”๏ธ์ •๋ฆฌ

  • ๊ณตํ†ต์ 
    • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๋Š” ๋™์•ˆ ๋ฌธ์„œ(HTML)๋Š” ์ค‘๋‹จ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ฐจ์ด์ 
    • async๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œ๋์„ ๋•Œ ๊ณง๋ฐ”๋กœ ํ‰๊ฐ€ ์‹คํ–‰ํ•˜๊ณ  defer์€ ๋ฌธ์„œ(HTML)๋ฅผ ์™„์ „ํžˆ ๋‹ค ์ฝ์€ ํ›„์— ์‹คํ–‰ํ•œ๋‹ค.
    • async๋Š” ๋จผ์ € ๋‹ค์šด๋กœ๋“œ๋œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๊ณ , defer์€ ์ •์˜๋œ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค.

Reference

script async์™€ defer์˜ ์˜๋ฏธ, ์‹คํ–‰์ˆœ์„œ, ๊ณตํ†ต์ , ์ฐจ์ด์ 

defer, async ์Šคํฌ๋ฆฝํŠธ

Script, async/defer

script ํƒœ๊ทธ์˜ defer ์†์„ฑ

jQuery #jqXHR ๋ž€? / ajax async true false ์ฐจ์ด

(+)
https://jae04099.tistory.com/entry/HTML-script-%ED%83%9C%EA%B7%B8%EB%8A%94-%EC%96%B4%EB%94%94%EC%97%90-%EC%9C%84%EC%B9%98-%ED%95%B4%EC%95%BC-%ED%95%A0%EA%B9%8C

๋ฐ˜์‘ํ˜•