GiantStepDEV

script์™€ html

์•„๋ž˜ ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ script ํŒŒ์ผ์„ ํšจ๊ณผ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฒซ๋ฒˆ์งธ ์˜ˆ์‹œ

  • head ํƒœ๊ทธ ์•ˆ์— ์‚ฝ์ž…
<!DOCTYPE html>
<html lang="en">
  <head>
    <script src="script.js"></script>
  </head>
  <body>
    <button id="btn">๋ฒ„ํŠผ</button>
  </body>
</html>

โžก๏ธ html ํŒŒ์‹ฑ์€ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— DOM์ด ์ƒ์„ฑ๋˜๊ธฐ ์ „์— script๊ฐ€ ์‹คํ–‰๋˜์–ด #btn์„ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์–ด null์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋‘๋ฒˆ์งธ ์˜ˆ์‹œ

  • body ํƒœ๊ทธ์˜ ๋งˆ์ง€๋ง‰์— ์‚ฝ์ž…
<!DOCTYPE html>
<html lang="en">
  <head>
  </head>
  <body>
    <button id="btn">๋ฒ„ํŠผ</button>
    <script src="script.js"></script>
  </body>
</html>
let btn = document.querySelector('#btn');
console.log('btn : ', btn); 
// <button id="btn">๋ฒ„ํŠผ</button>

์„ธ๋ฒˆ์งธ ์˜ˆ์‹œ

  • window.onload ํ•จ์ˆ˜
    • HTMLํŒŒ์‹ฑ, DOM์ƒ์„ฑ ๊ทธ๋ฆฌ๊ณ  ์™ธ๋ถ€ ์ฝ˜ํ…์ธ (images, script, css, etc)๊ฐ€ ๋กœ๋“œ๋œ ํ›„ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ
<!DOCTYPE html>
<html lang="en">
  <head>
    <script>
      window.onload = function () {
        let btn = document.querySelector('#btn');
        btn.addEventListener('click', function () {
          alert('Hello World');
        });
      };
    </script>
  </head>
  <body>
    <button id="btn">๋ฒ„ํŠผ</button>
  </body>
</html>

โžก๏ธ DOM์ด ๋‹ค ์ƒ์„ฑ๋œ ํ›„ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!

ํ•˜์ง€๋งŒ onload ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ ์ฝ˜ํ…์ธ ๊นŒ์ง€ ๋กœ๋“œ๋œ ํ›„์— ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ์ง€๊ฐ€ ์ˆ˜ ๋งŒ์žฅ(?) ๋ถˆ๋Ÿฌ์™€์•ผ ํ•  ๊ฒฝ์šฐ์—๋Š” ํšจ์œจ์ ์ด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์— ์“ธ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋Š” DOMContentLoaded ์ž…๋‹ˆ๋‹ค.

  • DOMContentLoaded ํ•จ์ˆ˜
    • HTMLํŒŒ์‹ฑ DOM์ƒ์„ฑ ํ›„ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ
<!DOCTYPE html>
<html lang="en">
  <head>
    <script>
      document.addEventListener('DOMContentLoaded', function() {
        let btn = document.querySelector('#btn');
        btn.addEventListener('click', function() {
          alert('Hello World');
        });
      });
    </script>
  </head>
  <body>
    <button id="btn">๋ฒ„ํŠผ</button>
  </body>
</html>

โžก๏ธ window.onload์™€ DOMContentLoaded ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด

DOMContentLoaded โ‡’ window.onload ์ˆœ์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋„ค๋ฒˆ์งธ ์˜ˆ์‹œ

  • defer, async

๐Ÿ”ฅ์—ฌ๊ธฐ์„œ ์ž ๊น!

script ํƒœ๊ทธ๋ฅผ head ํƒœ๊ทธ ์œ„์—๋‹ค๊ฐ€ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ, HTML parsing์„ ํ•˜๋‹ค๊ฐ€ script ํƒœ๊ทธ๋ฅผ ๋งŒ๋‚˜๋ฉด ์ž ์‹œ ๋ฉˆ์ถ”๊ณ  script๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ (fetch), ์‹คํ–‰(execution)ํ•œ ๋‹ค์Œ ๋‹ค์‹œ HTML parsing์ด ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. (๋™๊ธฐ ๋ฐฉ์‹)

๊ทธ๋ž˜์„œ DOM์ด ์ œ๋Œ€๋กœ ๋ถˆ๋Ÿฌ์™€์ง€์ง€ ์•Š์€ ์ƒํƒœ์—์„œ script๊ฐ€ ์‹คํ–‰๋˜์–ด ์˜ค๋ฅ˜๊ฐ€ ๋‚ฌ์—ˆ๋˜ ๊ฒ๋‹ˆ๋‹ค~

body ํƒœ๊ทธ ์ตœํ•˜๋‹จ์— ์ž‘์„ฑํ•˜๋ฉด HTML parsing์ด ๋ชจ๋‘ ์™„๋ฃŒ๋œ ํ›„์— script๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— DOM ์š”์†Œ๋ฅผ ๋ชป ์ฐพ๋Š” ๋ถˆ์ƒ์‚ฌ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ์ข€ ๋” ํšจ์œจ์ ์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ์š”?

HTML parsing์„ ํ•  ๋•Œ ๊ฐ™์ด script๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ์™„๋ฃŒ๋œ ํ›„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๊ฒ ์ฃ ?

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด html5์—์„œ defer์™€ async๊ฐ€ ์ƒ๊ฒจ๋‚ฌ์Šต๋‹ˆ๋‹ค.

  • defer
    • HTMLํŒŒ์‹ฑ๊ณผ ํ•จ๊ป˜ ๋น„๋™๊ธฐ๋กœ JavaScript ํŒŒ์ผ ๋กœ๋“œ
      • HTML ํŒŒ์‹ฑ์ด ์™„๋ฃŒ๋œ ํ›„, JavaScript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰
<!DOCTYPE html>
<html lang="en">
  <head>
    <script src="script.js" defer></script>
  </head>
  <body>
    <button id="btn">๋ฒ„ํŠผ</button>
  </body>
</html>
  • async
    • HTMLํŒŒ์‹ฑ๊ณผ ํ•จ๊ป˜ ๋น„๋™๊ธฐ๋กœ JavaScript ํŒŒ์ผ ๋กœ๋“œ
      • HTMLํŒŒ์‹ฑ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜๋”๋ผ๋„, ๋จผ์ € ๋กœ๋”ฉ๋˜๋Š” JavaScriptํŒŒ์ผ๋ถ€ํ„ฐ ์‹คํ–‰ ์‹œ์ž‘
    • JavaScript ํŒŒ์ผ์„ ์‹คํ–‰ํ•  ๋•Œ๋Š” HTML ํŒŒ์‹ฑ ์ค‘๋‹จ
<!DOCTYPE html>
<html lang="en">
  <head>
    <script src="script.js" async></script>
  </head>
  <body>
    <button id="btn">๋ฒ„ํŠผ</button>
  </body>
</html>

โžก๏ธ defer, async๋Š” parsing ๋„์ค‘์— script๋ฅผ ๋งŒ๋‚˜๋„ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋™์‹œ์— ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

(์ด๊ฒƒ์ด ๋น„๋™๊ธฐ ํ•ต์‹ฌ!)

๐Ÿ”ฅํ•˜์ง€๋งŒ!

defer๋Š” ๋™์‹œ์— ์ง„ํ–‰ํ•˜๊ณ  script๋ฅผ parsing๋ณด๋‹ค ๋จผ์ € ์™„๋ฃŒ๋˜๋”๋ผ๋„ ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ script๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ฐ˜๋ฉด async๋Š” script fetch๊ฐ€ ์™„๋ฃŒ๋˜๋Š”๋Œ€๋กœ ๋ฐ”๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ด๋ฐ์ด ์•ˆ๋งž์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ defer๋งŒ ์“ฐ๋ฉด ๋˜์ง€ async๋Š” ์–ด๋А ๋•Œ์— ํ•„์š”ํ• ๊นŒ์š”?

๊ฐ„๋‹จํžˆ ์ƒ๊ฐํ•ด๋ณด๋ฉด DOM๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” parsing์ด ์™„๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ๋น„ํšจ์œจ ์ ์ผ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋ฐ–์— ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค~

๋…๋ฆฝ์ ์ธ ์Šคํฌ๋ฆฝํŠธ ๋กœ๋“œ

  • ์Šคํฌ๋ฆฝํŠธ๊ฐ€ DOM ๊ตฌ์กฐ์— ์˜์กดํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

    • ์˜ˆ) ๋ฐ์ดํ„ฐ ๋ถ„์„ ํˆด, ๊ด‘๊ณ  ์Šคํฌ๋ฆฝํŠธ, ์†Œ์…œ ๋ฏธ๋””์–ด ์œ„์ ฏ ๋“ฑ

      <script async src="https://www.google-analytics.com/analytics.js"></script>

๋„คํŠธ์›Œํฌ ๋ณ‘๋ ฌ ๋กœ๋“œ

  • ์—ฌ๋Ÿฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œํ•˜์—ฌ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ๊ฐ„์„ ์ตœ์ ํ™”
    • ์˜ˆ) ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋กœ๋“œ ์†๋„ ์ตœ์ ํ™”

  • DOM์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ์ž‘์—…
    • ์˜ˆ) ์ด๋ฒคํŠธ ์ถ”์ , ์ดˆ๊ธฐํ™” ๋“ฑ
profile

GiantStepDEV

@kongmi

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!