Critical Rendering Path๋?
Interested in ReactJS, RxJS and ReasonML.
์ด ๊ธ์ Ire Aderinokun์ ํ๋ฝ์ ๋ฐ๊ณ Understanding the Critical Rendering Path๋ผ๋ ๊ธ์ ์ผ๋ถ๋ฅผ ๋ฒ์ญํ ๊ฒ์ด๋ค.
Critical Rendering Path(CRP)
๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ๋ก๋ถํฐ HTML ์๋ต์ ๋ฐ์ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ธฐ ์ํด ์คํํ๋ ๊ณผ์ ์ด๋ค.
CRP๋ 6๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ฉฐ ๊ฐ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ๋ค.
DOM ํธ๋ฆฌ
๋ง๋ค๊ธฐCSSOM ํธ๋ฆฌ
๋ง๋ค๊ธฐJavaScript
์คํRender ํธ๋ฆฌ
๋ง๋ค๊ธฐ- ๋ ์ด์์ ์์ฑํ๊ธฐ
- ํ์ธํ
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 ๋ฐฐ๊ฒฝ์ ๋จ์ ๋ฐฐ๊ฒฝ์๋ณด๋ค ๋ ๋ง์ ์๊ฐ์ด ์์๋๋ค.)