*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์ ์๋ฏธ, ์คํ์์, ๊ณตํต์ , ์ฐจ์ด์
'๐ฉ๐ปโ๐ปSTUDY > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] nullish ๋ณํฉ ์ฐ์ฐ์ ?? (0) | 2022.01.24 |
---|---|
[JavaScript] return์ด ํ๋ ์ผ (0) | 2021.11.26 |
[JavaScript / ES6] let, const์ ๋ธ๋ก ๋ ๋ฒจ ์ค์ฝํ (0) | 2021.02.11 |
[JavaScript] Call By Value (0) | 2021.01.29 |
[JavaScript] JavaScript ์ฝ์ ๋ฐฉ์๊ณผ ์์น (0) | 2020.09.24 |