๐ ๋ฒ๋ฒ ์(Jank) ๋ฉ์ถฐ!
๋๋ถ๋ถ์ ๊ธฐ๊ธฐ๋ค์ 1์ด์ 60๋ฒ ํ๋ฉด์ ์ ๋ฐ์ดํธํ๋ค. ์ด ์ฃผ๊ธฐ๋ฅผ 60Hz ๋ผ๊ณ ํํํ๊ณ , ์ด๋น ํ๋ ์ 60 ์ฆ, 60 fps(frames per second)๋ผ๊ณ ๋ ํํํ๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ ์์ 60๋ฒ๋ณด๋ค ์ ๊ฒ ๊ฐ์ ธ์ค๋ฉด ์ฌ์ฉ์๋ ํ๋ฉด์ด '๋ฒ๋ฒ ์ด๊ณ ์์'์ ์์์ฑ๊ณ ์๊ฐ์ ๋ถํธํจ์ ๋๋ผ๊ฒ ๋๋ค.
๊ทธ๋ ๋ค๋ฉด 1์ด์ 60๊ฐ์ ํ๋ ์์ ์ค๋นํ๋ ค๋ฉด, ์ผ๋ง๋งํผ์ ์๊ฐ๋์ ํ ํ๋ ์์ ์ค๋นํด์ผ ํ๋๊ฑธ๊น? 1000ms ๋ฅผ 60๊ฐ๋ก ๋๋๋ฉด ์ฝ 16ms์ด๋ค. ๊ทธ๋ ์ง๋ง ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฐ์ ๋ฐ ์ก์ผ๋ ์ฒ๋ฆฌํด์ผํด์ ์ค์ ๋ก๋ 10 ~ 12ms ๋ง์ ์ค๋นํด์ผ ํ๋ค.
๐ผ ํ๋ ์์ ์ด๋ ๊ฒ ๋ง๋ค์ด์
๋์ ์ฑ์ ํ๋ ์์๋๋ฅผ ์ต์ ํ ํ๊ธฐ ์ํด์๋, ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ ์์ ์ด๋ป๊ฒ ๋ ๋ํ๋์ง๋ถํฐ ์ดํดํด์ผ ํ๋ค. ๋ธ๋ผ์ฐ์ ์ ํฌ๋ฆฌํฐ์ปฌ ๋ ๋๋ง ํจ์ค(Critical Rendering Path) ๋ผ๊ณ ๋ ๋ถ๋ฅด๋ ์ด ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
1. ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ฒ์๊ฒ GET ์์ฒญ์ ๋ณด๋ธ๋ค.
2. ์๋ฒ๋ HTML์ ์๋ต์ผ๋ก ๋ณด๋ด์ค๋ค.
3. ๋ธ๋ผ์ฐ์ ๋ ๋ฐ์ HTML์ ํ์ฑํด์ DOM์ ๊ตฌ์ฑํ๋ค.
4. CSSํ์ผ๊ณผ ๋ธ๋ผ์ฐ์ ์์ด์ ํธ๋ฅผ ํฉ์ณ CSSOM์ ๊ตฌ์ฑํ๋ค.
5. DOM๊ณผ CSSOM์ ํฉ์ณ Render Tree๋ฅผ ๋ง๋ ๋ค. (Recalcuates styles)
6. ๋ ์ด์์ ๊ณ์ฐํ๋ค.
7. ์ค์ ์๊ฐ์ ์์๋ฅผ ํฝ์ ๋จ์๋ก ํํํ๋ค. (ํ์ธํธ)
8. ๋ ์ด์ด๋ฅผ ํฉ์ฑํ๋ค. (์ปดํฌ์งํธ)
์ฐธ๊ณ ๋ก ๋ ๋ํธ๋ฆฌ์๋ ์๊ฐ์ ์ผ๋ก ๋ณด์ด๋ ๊ฒ๋ง ํฌํจ๋๋ค.
๋ ํฐํธ๋ฆฌ์ ํฌํจ๋๋ ๊ฒ | ๋ ๋ํธ๋ฆฌ์ ํฌํจ๋์ง ์๋ ๊ฒ |
- ::after์ ๊ฐ์ pesudo elemnt - height: 0 ์ธ ํ๊ทธ - position: ablsolute, left: 100% ์ธ ํ๊ทธ |
- head ํ๊ทธ - script ํ๊ทธ - display: none ์ธ ํ๊ทธ |
๊ทธ๋ ๋ค๋ฉด ์ํ ์ฌ์ดํธ ์ ๊ฒฝ์ฐ์, ๋ธ๋ผ์ฐ์ ์ ๋ ์ด์์ ๋จ๊ณ์์ body ์์ฒด์ width๋ฅผ ์์ ํ๋ ๊ฒ๊ณผ body์ ์์์ธ ํน์ div์ width๋ฅผ ์์ ํ๋ ๊ฒ ์ค ์ด๋ค ๊ฒ์ด ๋ ๋ง์ ์์ ์ ํ์๋ก ํ ๊น?
์ ๋ต์ '๋ ๋ค ๊ฐ์ ์์ ์์ ์ ์๊ตฌํ๋ค.' ์ด๋ค. ์ด๋ ๋ ธ๋๊ฐ ๋ณ๊ฒฝ๋๋์ง ์๋๋ผ๋ ์ ์ฒด ๋ ์ด์์์ด ์ด๋ป๊ฒ ๋ณ๊ฒฝ๋ ์ง๋ ์ ์ ์๋ค. ๋ฐ๋ผ์ ๋ธ๋ผ์ฐ์ ๋ ์ ์ฒด ํ์ด์ง์ ๋ ์ด์์์ ๋ค์ ์ก์์ผ ํ๋ค. ์ฆ, ๋ธ๋ผ์ฐ์ ๋ ๋ ์ด์์์ ๋ณํ๊ฐ ์์ผ๋ฉด ์ต์ ์ ์๋๋ฆฌ์ค๋ฅผ ๊ฐ์ ํ๊ณ ๊ธฐ์กด์ ๋ ์ด์์์ ์ ๋ถ ๋ญ๊ฐ๊ณ ์ ์ฒด ๋ ์ด์์์ ๋ค์ ์ก๋๋ค.
์ด ๊ณผ์ ์ ํฌ๋กฌ ๊ฐ๋ฐ์๋๊ตฌ - [Performance] ํญ์์ ํ์ธํ ์ ์๋ค.
์ด๋ฐ ์ํฉ์ ๋ ์ด์์์ '์ค์ฝํ'๊ฐ ์ ์ฒด ๋ฌธ์(whole document)๋ผ๊ณ ํํํ๋ค. ๋ ์ด์์ ์ค์ฝํ๋ฅผ ์ข๊ฒ ํ๊ธฐ ์ํด์ ์ ๋ต์ ์ผ๋ก CSS๋ฅผ ์์ฑํด์ ๋ ์ด์์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๋ ์ด์์ ๋ฐ์ด๋๋ฆฌ๊ฐ ์๊ธฐ๋ฉด ์ ์ฒด ๋ฌธ์๊ฐ reflow๋์ง ์๊ณ ํด๋น scope๋ง reflow๋๊ธฐ ๋๋ฌธ์ ๋ ์ด์์ ๋น์ฉ์ ํฌ๊ฒ ์ค์ผ ์ ์๋ค. (์ฐธ๊ณ : Introducing 'layout boundaries')
โญ ๋ ๋๋ง ํ์ดํ๋ผ์ธ
๋ธ๋ผ์ฐ์ ๊ฐ ํ์ด์ง๋ฅผ ๋ ๋ํ๋ ๊ณผ์ ์ ๋ค์ฏ ๋จ๊ณ๋ก ๋๋ ์ ์๋ค. ๊ฐ ๋จ๊ณ ์ค ์ผ๋ถ๋ ํญ์ ์คํ๋๋ฉฐ, ์ผ๋ถ๋ ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์๋ต๋๊ธฐ๋ ํ๋ค.
1. layout ์์ฑ์ ๋ณ๊ฒฝํ ๊ฒฝ์ฐ
Style > Layout > Paint > Composite
position, padding, overflow, width, top ๋ฑ์ด ํด๋น๋๋ค.
2. paint-only ์์ฑ๋ง ๋ณ๊ฒฝํ ๊ฒฝ์ฐ
Style > Paint > Composite
shadow, color, background-image, opacity, z-index ๋ฑ์ด ํด๋น๋๋ค.
3. compositing-only ์์ฑ๋ง ๋ณ๊ฒฝํ ๊ฒฝ์ฐ
Style > Composite
transform, orphans, cursor ๋ฑ์ด ํด๋น๋๋ค.
4. ์ฌ์ฉ์๊ฐ ์๋์ฐ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ๊ฒฝ์ฐ (์๋ ์๋ flexbox์ item)
Layout > Paint > Composite
๋จ, ๋ฏธ๋์ด์ฟผ๋ฆฌ ๋ฑ resize๊ฐ ํ์ํ ๊ฒฝ์ฐ๋ Style ๊ณผ์ ์ด ์ถ๊ฐ๋๋ค.
๊ฐ ๊ฒฝ์ฐ์ ์ด๋ค ํ์ดํ๋ผ์ธ์ ๊ฑฐ์น๋์ง ์์ธก ๋๋ ์ธก์ ํ๊ณ , ๊ฐ๋ฐ์๋์ ๋ฐ๋ผ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ด๋ฉด์๋ ๋ ์ ์ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ์๋ํ ์๋ ์๋ค.
์ฐธ๊ณ ๊ฐ์
'FrontEnd+' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
CRA ์์ next.js ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ธฐ (0) | 2021.10.04 |
---|---|
[์ฑ๋ฅ์ต์ ํ] ์์ฒญ ์ฌ์ด์ฆ ๋ค์ด์ดํธ (1) | 2021.09.09 |
์์(?) ๋ฆฌ์กํธ ์ฑ์ webpack ์ค์ ํ๊ธฐ (without CRA) (1) | 2021.07.18 |
ํ์ ์ ์ํ HTTP ๊ธฐ์ด (1) | 2021.05.16 |
ํ๋ก ํธ์๋ ํ ์คํธ ๊ณ ๋ฏผ ์ผ์ง (0) | 2021.05.09 |