Critical Rendering Path๋ž€?

Critical Rendering Path๋ž€?

Front-end developer WONISM
Interested in ReactJS, RxJS and ReasonML.

์ด ๊ธ€์€ Ire Aderinokun์˜ ํ—ˆ๋ฝ์„ ๋ฐ›๊ณ  Understanding the Critical Rendering Path๋ผ๋Š” ๊ธ€์˜ ์ผ๋ถ€๋ฅผ ๋ฒˆ์—ญํ•œ ๊ฒƒ์ด๋‹ค.

Critical Rendering Path(CRP)๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ HTML ์‘๋‹ต์„ ๋ฐ›์•„ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•ด ์‹คํ–‰ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.
CRP๋Š” 6๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋ฉฐ ๊ฐ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. DOM ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ
  2. CSSOM ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ
  3. JavaScript ์‹คํ–‰
  4. Render ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ
  5. ๋ ˆ์ด์•„์›ƒ ์ƒ์„ฑํ•˜๊ธฐ
  6. ํŽ˜์ธํŒ…

DOM ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ

DOM ํŠธ๋ฆฌ๋Š” ์™„์ „ํ•˜๊ฒŒ ํŒŒ์‹ฑ๋œ HTML ํŽ˜์ด์ง€์˜ Object ํ‘œํ˜„์ด๋‹ค.
html๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘๋˜์–ด, ํŽ˜์ด์ง€์˜ ๊ฐ element, text์— ๋Œ€ํ•œ ๋…ธ๋“œ๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค.
๋‹ค๋ฅธ ์š”์†Œ ๋‚ด์— ์ค‘์ฒฉ๋œ ์š”์†Œ๋Š” ์ž์‹ ๋…ธ๋“œ๋กœ ํ‘œ์‹œ๋˜๋ฉฐ, ๊ฐ ๋…ธ๋“œ์—๋Š” ํ•ด๋‹น ์š”์†Œ์˜ ํŠน์„ฑ(attribute)์ด ํฌํ•จ๋œ๋‹ค.

์ด ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ DOM ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

<html>
<head>
  <title>Understanding the Critical Rendering Path</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <header>
    <h1>Understanding the Critical Rendering Path</h1>
  </header>
  <main>
    <h2>Introduction</h2>
    <p>Lorem ipsum dolor sit amet</p>
  </main>
  <footer>
    <small>Copyright 2017</small>
  </footer>
</body>
</html>

HTML์€ ๋ถ€๋ถ„์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŽ˜์ด์ง€์— ๋‚ด์šฉ์ด ํ‘œ์‹œ๋˜๊ธฐ ์œ„ํ•ด ๋ฌธ์„œ ์ „์ฒด๋ฅผ ๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ํ•˜์ง€๋งŒ, CSS์™€ JavaScript๋Š” ํŽ˜์ด์ง€์˜ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค.

CSSOM ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ

CSSOM์€ DOM๊ณผ ๊ด€๋ จ๋œ ์Šคํƒ€์ผ์˜ Object ํ‘œํ˜„์ด๋‹ค.
CSSOM์€ DOM๊ณผ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ํ‘œํ˜„๋˜์ง€๋งŒ, (๋ช…์‹œ์ ์œผ๋กœ) ์„ ์–ธ๋˜์—ˆ๋Š”์ง€ (์•”์‹œ์ ์œผ๋กœ) ์ƒ์†๋˜์—ˆ๋Š”์ง€ ์ƒ๊ด€์—†์ด ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์Šคํƒ€์ผ์ด ํฌํ•จ๋œ๋‹ค.

์œ„ HTML ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ ํฌํ•จ๋œ style.css๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉฐ, ์ด๋Š” ์•„๋ž˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ CSSOM ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

body { font-size: 18px; }

header { color: plum; }
h1 { font-size: 28px; }

main { color: firebrick; }
h2 { font-size: 20px; }

footer { display: none; }

CSS๋Š” ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฆฌ์†Œ์Šค๋กœ, ์™„์ „ํžˆ ํŒŒ์‹ฑ๋˜์ง€ ์•Š์œผ๋ฉด Render ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๋‹ค. HTML๊ณผ ๋‹ฌ๋ฆฌ CSS๋Š” ์ƒ์†๋œ ๊ณ„๋‹จ์‹ ํŠน์„ฑ๋•Œ๋ฌธ์— ๋ถ€๋ถ„์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋ฌธ์„œ์˜ ๋’ท๋ถ€๋ถ„์— ์ •์˜๋œ ์Šคํƒ€์ผ์€ ์ด์ „์— ์ •์˜๋œ ์Šคํƒ€์ผ์„ ๋ฎ์–ด์“ฐ๊ฒŒ๋œ๋‹ค.

(CSS์ „์ฒด๊ฐ€ ํŒŒ์‹ฑ๋˜๊ธฐ ์ „์— ๋จผ์ € ์Šคํƒ€์ผ ์‹œํŠธ์— ์ •์˜ํ•œ CSS์Šคํƒ€์ผ์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ž˜๋ชป๋œ CSS๊ฐ€ ์ ์šฉ๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์™„์ „ํžˆ ํŒŒ์‹ฑ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋ Œ๋”๋ง์„ ์ฐจ๋‹จํ•จ์œผ๋กœ์จ ์ด์™€ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.)

<link rel="stylesheet" /> ํƒœ๊ทธ๋Š” ๋ฏธ๋””์–ด ์†์„ฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ๋ฏธ๋””์–ด ์†์„ฑ์€ ์Šคํƒ€์ผ์ด ์ ์šฉ๋˜๋Š” ๋ฏธ๋””์–ด์ฟผ๋ฆฌ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ, ๋ฏธ๋””์–ด ์†์„ฑ์ด orientation: landscape ์ธ ์Šคํƒ€์ผ ์‹œํŠธ๊ฐ€ ์žˆ๊ณ , ํŽ˜์ด์ง€๋ฅผ ์„ธ๋กœ๋ชจ๋“œ๋กœ ๋ณด๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋Š” ๋ Œ๋”๋ง ๋ธ”๋กœํ‚น์œผ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š๋Š”๋‹ค. CSS๋Š” ์Šคํฌ๋ฆฝํŠธ ๋ธ”๋กœํ‚น์ผ์ˆ˜๋„ ์žˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, JavaScript ํŒŒ์ผ์€ ์‹คํ–‰๋˜๊ธฐ ์ „์— CSSOM์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

JavaScript ์‹คํ–‰

JavaScript๋Š” ํŒŒ์„œ ์ฐจ๋‹จ ๋ฆฌ์†Œ์Šค๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ์ด๊ฒƒ์€ HTML ๋ฌธ์„œ ์ž์ฒด์˜ ํŒŒ์‹ฑ์ด JavaScript์— ์˜ํ•ด ์ฐจ๋‹จ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค.

ํŒŒ์„œ๊ฐ€ ๋‚ด๋ถ€ ํƒœ๊ทธ์ด๋“  ์™ธ๋ถ€ ํƒœ๊ทธ์ด๋“  <script> ํƒœ๊ทธ์— ๋„๋‹ฌํ•˜๋ฉด, (์™ธ๋ถ€ ํƒœ๊ทธ๋ผ๋ฉด, ์™ธ๋ถ€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ ) ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌธ์„œ ๋‚ด์˜ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” JavaScriptํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๋ฌธ์„œ๊ฐ€ ํ‘œ์‹œ๋œ ํ›„์— ์˜ค๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

JavaScript๊ฐ€ ํŒŒ์„œ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด async ์†์„ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Render ํŠธ๋ฆฌ ๋งŒ๋“ค๊ธฐ

Render ํŠธ๋ฆฌ๋Š” DOM ๊ณผ CSSOM ์ด ํ•ฉ์ณ์ง„ ๊ฒƒ์œผ๋กœ ํŽ˜์ด์ง€์—์„œ ์ตœ์ข…์ ์œผ๋กœ ๋ Œ๋”๋งํ•  ๋‚ด์šฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŠธ๋ฆฌ์ด๋‹ค. display: none; ์œผ๋กœ ์ˆจ๊ฒจ์ง„ ์š”์†Œ๋Š” ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.
์œ„์˜ DOM, CSSOM ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ๋‹ค์Œ ๋ Œ๋” ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

๋ ˆ์ด์•„์›ƒ ์ƒ์„ฑํ•˜๊ธฐ

๋ ˆ์ด์•„์›ƒ์€ ๋ทฐํฌํŠธ์˜ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉฐ, ๋ทฐํฌํŠธ์˜ ํฌ๊ธฐ๋Š” ๋ทฐํฌํŠธ์˜ ํฌ๊ธฐ์™€ ๊ด€๋ จ์žˆ๋Š” CSS ์Šคํƒ€์ผ์— ๋Œ€ํ•œ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋ทฐํฌํŠธ ํฌ๊ธฐ๋Š” <meta> ํƒœ๊ทธ์˜ viewport ์†์„ฑ์„ ํ†ตํ•ด ๊ฒฐ์ •๋˜๋Š”๋ฐ, ๊ธฐ๋ณธ ๋ทฐํฌํŠธ ๋„ˆ๋น„๋Š” 980px ์ด๋‹ค.

(์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”ํƒ€ํƒœ๊ทธ์˜ ๋ทฐํฌํŠธ ๊ฐ’์€ ์žฅ์น˜ ๋„ˆ๋น„์— ๋งž๊ฒŒ ์„ค์ •ํ•œ๋‹ค.)

<meta name="viewport" content="width=device-width,initial-scale=1">

ํŽ˜์ธํŒ…

๊ทธ๋ฆฌ๋Š” ๋‹จ๊ณ„์—์„œ๋Š” ํŽ˜์ด์ง€์˜ ๊ฐ€์‹œ์ ์ธ ๋‚ด์šฉ์„ ํ”ฝ์…€๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ํ™”๋ฉด์— ํ‘œ์‹œํ•œ๋‹ค.

ํŽ˜์ธํŒ… ๋‹จ๊ณ„์—์„œ ์†Œ์š”๋˜๋Š” ์‹œ๊ฐ„์€ DOM์˜ ํฌ๊ธฐ์™€ ์ ์šฉ๋˜๋Š” ์Šคํƒ€์ผ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. (์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋ณต์žกํ•œ gradient ๋ฐฐ๊ฒฝ์€ ๋‹จ์ˆœ ๋ฐฐ๊ฒฝ์ƒ‰๋ณด๋‹ค ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.)

Reference