#
์ฑ๋ฅ ์ธก์ #
๋ธ๋ผ์ฐ์ ๊ธฐ์ค#
DOMContentLoadedย ์ด๋ฒคํธHTML๊ณผ CSS ํ์ฑ์ด ๋๋๋ ์์
๋ ๋ ํธ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ ์ค๋น๊ฐ ๋(DOM ๋ฐ CSSOM ๊ตฌ์ฑ์ด ๋๋) ์ํฉ
#
loadย ์ด๋ฒคํธ- HTML ์์ ํ์ํ ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ๋ก๋๋ ์์
๊ทธ๋ฆฌ๊ณ ์ด ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ์์ ์ ๋ด๋น๊ฒ์ด์ ํ์ด๋ฐ API๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ํฌ๋กฌ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ํตํด ํ์ธํ ์ ์๋ค.
#
์ฌ์ฉ์ ๊ธฐ์ค#
FP(First Paint)- ํฐ ํ๋ฉด์์ ํ๋ฉด์ ๋ฌด์ธ๊ฐ๊ฐ ์ฒ์์ผ๋ก ๊ทธ๋ ค์ง๊ธฐ ์์ํ๋ ์๊ฐ์ด๋ค.
#
FCP(First Contentful Paint)- ํ ์คํธ๋ ์ด๋ฏธ์ง๊ฐ ์ถ๋ ฅ๋๊ธฐ ์์ํ๋ ์๊ฐ์ด๋ค.
#
FMP(First Meaningful Paint)- ์ฌ์ฉ์์๊ฒ ์๋ฏธ ์๋ ์ฝํ ์ธ ๊ฐ ๊ทธ๋ ค์ง๊ธฐ ์์ํ๋ ์ฒซ ์๊ฐ์ด๋ค. ์ฝํ ์ธ ๋ฅผ ๋ ธ์ถํ๋๋ฐ ํ์ํ CSS, ์๋ฐ์คํฌ๋ฆฝํธ ๋ก๋๊ฐ ์์๋๊ณ ์คํ์ผ์ด ์ ์ฉ๋์ด ์ฃผ์ ์ฝํ ์ธ ๋ฅผ ์ฝ์ ์ ์๋ค.
#
TTI(Time to Interactive)- ์๋ฐ์คํฌ๋ฆฝํธ์ ์ด๊ธฐ ์คํ์ด ์๋ฃ๋์ด์ ์ฌ์ฉ์๊ฐ ์ง์ ํ๋์ ์ทจํ ์ ์๋ ์๊ฐ์ด๋ค.
#
๋ก๋ฉ ์ต์ ํ#
๋ธ๋ก ๋ฆฌ์์ค(๋๋ ๋ ๋๋ง ์ฐจ๋จ ๋ฆฌ์์ค) ์ต์ ํ๋ธ๋ผ์ฐ์ ๋ก๋ฉ ๊ณผ์ ์์ ํ์ฑ ์ค ๋ธ๋ก ๋ฆฌ์์ค๊ฐ ๋ฐ์ํ ์ ์๋ค. ๋ธ๋ก ๋ฆฌ์์ค์๋ CSS ์ JavaScript๊ฐ ํฌํจ๋๋ค.
#
CSS ์ต์ ํDOM ํธ๋ฆฌ๋ ํ์ฑํ๋ฉด์ ์์ฐจ์ ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
CSSOM ํธ๋ฆฌ๋ CSS๋ฅผ ๋ชจ๋ ํด์ํด์ผ ๊ตฌ์ฑํ ์ ์๋ค.
์ฆ CSSOM ํธ๋ฆฌ๊ฐ ๊ตฌ์ฑ๋์ง ์์ผ๋ฉด ๋ ๋ ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ง ๋ชปํ๊ณ , ๋ ๋๋ง์ด ์ฐจ๋จ๋์ด์๋ค.
๋ฐ๋ผ์ CSS๋ ํญ์ HTML ๋ฌธ์ ์ต์๋จ์ ๋ฐฐ์นํ๋ ๊ฒ์ด ์ข๋ค.
๋ํ ํน์ ์กฐ๊ฑด(์ธ๋ก ๋ชจ๋, ์ธ์ ๋ชจ๋ ๋ฑ)์์๋ง ํ์ํ CSS๋, ํด๋น ๊ฒฝ์ฐ์๋ง ๋ก๋ํ ์ ์๋๋ก ๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ ํํ๋ค.
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ์ฐ (์ต์ ํ ์ )
<link href="style.css" rel="stylesheet" /><link href="print.css" rel="stylesheet" /><link href="portrait.css" rel="stylesheet" />
๋ฏธ๋์ด ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ (์ต์ ํ ํ)
<link href="style.css" rel="stylesheet" /><link href="print.css" rel="stylesheet" media="print" /><link href="portrait.css" rel="stylesheet" media="orientation:portrait" />
์ธ๋ถ ์คํ์ผ์ํธ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์ฌ์ฉํ๋
@import
๋ฌธ์ ์คํ์ผ์ํธ๋ฅผ ๋ณ๋ ฌ๋ก ๋ค์ด๋ก๋ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ก๋ ์๊ฐ์ด ๋์ด๋ ์ ์๋ค.
#
JavaScript ์ต์ ํJavaScript๋ DOMํธ๋ฆฌ์ CSSOM ํธ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ HTML ํ์ฑ์์ฐจ๋จํ๋ ๋ธ๋ก ๋ฆฌ์์ค์ด๋ค.
<script>
ํ๊ทธ๋ฅผ ๋ง๋๋ฉด ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ฉฐ ๊ทธ ์ด์ ๊น์ง ์์ฑ๋ DOM์๋ง ์ ๊ทผํ ์ ์๋ค.๊ทธ๋ฆฌ๊ณ ์คํฌ๋ฆฝํธ ์คํ์ด ์๋ฃ๋ ๋๊น์ง DOM ํธ๋ฆฌ ์์ฑ์ด ์ค๋จ๋๋ค.
์ด๋ฌํ ์ด์ ๋ก JavaScript๋ฅผ ๋ ๋๋ง ์ฐจ๋จ ๋ฆฌ์์ค๋ผ๊ณ ํ๋ค.
#
๋ฆฌ์์ค ์์ฒญ ์ ์ค์ด๊ธฐ#
์ด๋ฏธ์ง ์คํ๋ผ์ดํธ์น ํ์ด์ง์์ ์์ด์ฝ ๋ง๋ค ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฆฌ์์ค ์์ฒญ์ด ์์ด์ฝ ๋ง๋ค๋ฐ์
์ฌ๋ฌ ์์ด์ฝ์ ๋ฌถ์ด ํ๋์ ์ด๋ฏธ์ง๋ก ๋ง๋ค๊ณ , CSS์
background-position
์์ฑ์์ฌ์ฉํด ๋ถ๋ถ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฆฌ์์ค ์์ฒญ ์๋ฅผ ์ค์ผ ์ ์๋ค.
#
CSS, JavaScript ๋ฒ๋ค๋ง๋ชจ๋ ๊ธฐ๋ฐ ๊ฐ๋ฐ ์ด์ ์๋ ์ฌ๋ฌ ๋ฆฌ์์ค ํ์ผ์ ๋ถ๋ฆฌํด์ ๊ฐ์ ธ์์๋ค.
Webpack, Rollup ๋ฑ์ ๋ฒ๋ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ ๋ชจ๋ ํ์ผ์ ํ๋๋ก ๋ฌถ์ด์ 1๊ฐํ์ผ๋ก ๋ง๋ค์ด ๋ฆฌ์์ค ์์ฒญ ์๋ฅผ ์ค์ผ ์ ์๋ค.
#
๋ด๋ถ ์คํ์ผ ์ํธ ?โ ๋ด๋ถ ์คํ์ผ ์ํธ๋ ๋ฆฌ์์ค ์์ฒญ ํ์๋ฅผ ์ค์ผ ์ ์๋ ๋ฐฉ๋ฒ์ด์ง๋ง, ๋ฆฌ์์ค ์บ์๋ฅผ ์ฌ์ฉํ ์ ์์ด์ HTML์ CSS๊ฐ ๋งค๋ฒ ํฌํจ๋๋ค.
#
์์ ์ด๋ฏธ์ง๋ฅผ HTML, CSS๋ก ๋์ฒด์์ด์ฝ ์ด๋ฏธ์ง ๊ฐ์๊ฐ ์ ์ ๊ฒฝ์ฐ, ์ด๋ฏธ์ง๋ฅผ Base64๋ก ๋ณํํ URI๋ฅผ ์ฌ์ฉํ์ฌ HTML, CSS์ ํฌํจํด์ ์ฌ์ฉํ ์ ์๋ค.
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAOCAYAAAAbvf3sAAAAAXNSR0IArs4c6QAAAHBJREFUKBVjYBimICwsLAaEsXmPGV0QqnAeUNxfW1v7/tWrVy8hq0HRgKQ4CahoIxDPQ9cE14CseNWqVUtAJoMUo2tiBFkXGRmp9/fv3zNAZhJIMUgMBmAGMTMzmyxfvhzhPJAmmCJ0Gp8cutqhwAcASWgwk+79LiQAAAAASUVORK5CYII="/>
#
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ์ํ ํจ์๋ง ๊ฐ์ ธ์ค๊ธฐimport _ from 'lodash';
_.array(...);_.object(...);
โ
import array from 'lodash/array';import object from 'lodash/fp/object';
array(...);object(...);
#
HTML ๋งํฌ์ ์ต์ ํ- ์ค์ฒฉ์ ๋จ์ํ๊ฒ ๊ตฌ์ฑํ๋ค.
#
์์ถ(Minify)ํ์ฌ ์ฌ์ฉ- ์นํฉ ํ๋ฌ๊ทธ์ธ๊ณผ ๊ฐ์ ๋๊ตฌ์ ๋์์ผ๋ก ๋ถํ์ํ ์ฃผ์์ด๋ ๊ณต๋ฐฑ์ ๋ชจ๋ ์ญ์ ํ๊ณ , ๋๋ ํ ํ๋ ๋ฑ ์ฝ๋์ ์ฉ๋์ ์์ถํ ์ ์๋ค.
#
๋ ๋๋ง ์ต์ ํ#
requestAnimationFrame์๊ฐ์ ๋ณํ๊ฐ ๋ธ๋ผ์ฐ์ ์์ ์ ํํ ์๊ฐ(ํ๋ ์ ์์ ์)์ ์ํ๋๊ธธ ์ํ๋ค.
์ด๋ฅผ ๋ณด์ฅํ๋ ์ ์ผํ ๋ฐฉ๋ฒ์
requestAnimationFrame
์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.setTimeout
๋๋setInterval
์ ์ฝ๋ฐฑ์ด ์ ํํ ์๊ฐ์ ์ํ๋๋ ๊ฒ์ ๋ณด์ฅํ์ง์๋๋ค.
โ
setTimeout
๊ณผsetInterval
์ ์ฝ๋ฐฑ์ (macro)Task queue ๋ฅผ ์ฌ์ฉ.requestAnimationFrame
์ AnimationFrame ์ฌ์ฉ.
#
์คํ์ผ ๊ณ์ฐ์ ๋ฒ์์ ๋ณต์ก์ฑ ์ค์ด๊ธฐDOM ๋ณ๊ฒฝ, ์์ ์ถ๊ฐ ๋ฐ ์ ๊ฑฐ, ์์ฑ ๋ณ๊ฒฝ, ํด๋์ค ๋๋ ์ ๋๋ฉ์ด์ ์ ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ ์คํ์ผ์ ์ฌ๊ณ์ฐํ๊ณ ๋ง์ ๊ฒฝ์ฐ์ ๋ ์ด์์ ๋จ๊ณ(๋ฆฌํ๋ก์ฐ)๋ฅผ ๊ฑฐ์น๊ฒ ๋ง๋ ๋ค.
์คํ์ผ ๊ณ์ฐ ๋จ๊ณ์ ์ฒซ ๋ถ๋ถ์ ๋งค์นญ ์ ํ๊ธฐ ์งํฉ์ ์์ฑํ๋ ๊ฒ์ด๋ค. (์์, ํด๋์ค , ID, pseudo ์ ํ์ ๋ฑ๋ฑ)
์คํ์ผ ๊ณ์ฐ์ ๋ ๋ฒ์งธ ๋จ๊ณ๋ ๋งค์นญ๋ ์ ํ๊ธฐ์์ ์คํ์ผ ๊ท์น์ ๊ฐ์ ธ์์ ์์์๋ง์ง๋ง ์คํ์ผ์ ๊ณ์ฐํ๋ ๊ณผ์ ์ด ํฌํจ๋๋ค.
๋ฐ๋ผ์ ์ ํ๊ธฐ์ ๋ณต์ก์ฑ์ ์ค์ด๊ณ (BEM ๋ฑ์ ๋ฐฉ๋ฒ๋ก ์ ์ฉ) ์คํ์ผ์ ๊ณ์ฐํด์ผ ํ๋์์์ ์๋ฅผ ์ค์ฌ์ผ ํ๋ค.
#
ํฌ๊ณ ๋ณต์กํ ๋ ์ด์์ ๋ฐ ์ค๋์ฑ ํผํ๊ธฐ๋ ์ด์์์ ๋ฒ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์ฒด ๋ฌธ์๋ก ์ง์ ๋๋ค.
๋๋น, ๋์ด, ์ผ์ชฝ ๋๋ ์๋จ ๋ฑ "๊ธฐํํ์ ์์ฑ"์ ๋ณ๊ฒฝ์ ๋ชจ๋ ๋ ์ด์์์ดํ์ํ๋ค.
flexbox
๋ฅผ ์ฌ์ฉํ ๋ ์ด์์์ดfloat
๋ฅผ ์ฌ์ฉํ ๋ ์ด์์ ๋ณด๋ค ๋น์ฉ์ด ์ ๋ค.
DOM ์์์ ์๋ ์ฑ๋ฅ์ ์ํฅ์ ์ฃผ๋ฏ๋ก ๊ฐ๊ธ์ ๋ ์ด์์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ํผํด์ผ ํ๋ค.
๊ฐ์ ๋๊ธฐ์ ๋ ์ด์์ ๋ฐ ๋ ์ด์์ ์ค๋์ฑ์ ํผํด์ผ ํ๋ค.
โ ์๋ ๋ ์ด์์์ ๋น๋๊ธฐ์ด๋, ํน์ ์ํฉ์์ ๋๊ธฐ์ ์ผ๋ก ๋ ์ด์์์ด ๋ฐ์ํ ์์๋ค. ์ด๊ฒ์ ๊ฐ์ ๋๊ธฐ์ ๋ ์ด์์ ์ด๋ผ ํ๋ค.
function logBoxHeight() { box.classList.add('super-big'); // Gets the height of the box in pixels // and logs it out. console.log(box.offsetHeight);}
์์ ํจ์๋ ์คํ์ผ์ ๋ณ๊ฒฝํ ํ์, ๋์ด๋ฅผ ์์ฒญํ๋ค.
๋์ด๋ฅผ ๊ตฌํ๋ ๊ฒ ์ญ์ ๋ ์ด์์์ ์คํํด์ผ ํ๋ ๊ฒ์ด๋ค.
์คํ์ผ ๊ณ์ฐ๊ณผ ๋ ์ด์์์ ๋์์ ์คํํ๋ฉด ์ ์ฌ์ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๋ฐ๋์งํ์ง ์๋ค.
function resizeAllParagraphsToMatchBlockWidth() { // Puts the browser into a read-write-read-write cycle. for (var i = 0; i < paragraphs.length; i++) { paragraphs[i].style.width = box.offsetWidth + 'px'; }}
์์ ํจ์๋ ๊ฐ ๋ฃจํ์ ๋ฐ๋ณต์ด ์คํ์ผ ๊ฐ
box.offsetWidth
๋ฅผ ์ฝ์ ๋ค์, ์ฆ์paragraphs[i].style.width
๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค.์ด์ ๋ฐ๋ณต์์ ๋ ์ด์์์ด ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์
box.offsetWidth
์ ์กฐํํ๋ ๊ฒ์ญ์ ๊ฐ์ ๋๊ธฐ์ ๋ ์ด์์์ ์ ๋ฐํ๋ค. ์ด๋ฅผ ์๋์ ๊ฐ์ด ์์ ํ ์ ์๋ค.
// Read.var width = box.offsetWidth; function resizeAllParagraphsToMatchBlockWidth() { for (var i = 0; i < paragraphs.length; i++) { // Now write. paragraphs[i].style.width = width + 'px'; }}
#
ํ์ธํธ ๋ณต์ก์ฑ ๋จ์ํ ๋ฐ ํ์ธํธ ์์ญ ์ค์ด๊ธฐtransform
๋๋opacity
๋ฅผ ์ ์ธํ ๋ชจ๋ ์์ฑ ๋ณ๊ฒฝ์ ํญ์ ํ์ธํธ๋ฅผ ํธ๋ฆฌ๊ฑฐ ํ๋ค.๊ฐ๋ฅํ ํ์ ๋ ธ๋์ DOM์ ์กฐ์ํ๊ณ ์คํ์ผ์ ๋ณ๊ฒฝ
DOM์ด ์๊ณ ๊น์ด๊ฐ ์์์๋ก ๊ณ์ฐ์ด ๋น ๋ฅด๋ค.
๋ถํ์ํ ๋ํผ ์๋ฆฌ๋จผํธ๋ฅผ ์ ๊ฑฐํ๋ค.
์ํฅ ๋ฐ๋ ์๋ฆฌ๋จผํธ ์ ํ