์ด์ฌํ ํ ๊ณผ์ ๋ฅผ ์ํํ๋์ค..
@[]](์ด๊ฑฐ ๋ฉ์ธํ์ด์ง ์์ด๋ ๊ฒ ๋๋ ค์ก๋ ?)
@[](๋ฉ์ธ ํ์ด์ง๊ฐ ๋ก๋ฉ๋๋๊ฒ ๋์ ๋ณด์ฌ !)
@[](์ด๊ฑฐ ์ข ๋ฒ๋ฒ
๊ฑฐ๋ฆฌ๋ ๊ฒ ๊ฐ์ง ์๋ ?)
@[](๊ทธ๋๋ ๋ฉ์ธํ์ด์ง์ธ๋ฐ.. ์ข ๋ ๋นจ๋์ผ๋ฉด ์ข๊ฒ ์ด !)
@
Note: ์ด์ฌํ ํ ๊ณผ์ ๋ฅผ ์ํํ๋ ๋์ค.. ๊ฐ์๊ธฐ ๋ ๋ค๋ฅธ ๊ณผ์ ๊ฐ ๋ค์ด๋ฅ์ณค๋ค
+++
- Back-End
- Network
- Front-End
Steve souders : "์๋น์ค ์๋ต ์๊ฐ์ 80~90%๋ Front-End์์ ์๋ชจ๋๋ค"
@[](Front-End ์ฑ๋ฅ ํฅ์ = ์ต์๋น์ฉ ์ต๋ํจ์จ!)
+++
https://developers.google.com/web/tools/lighthouse
์น ์ฑ์ ํ์ง์ ๊ฐ์ ํ๋ ์คํ ์์ค ์ง๋ํ ๋๊ตฌ
Note: ์ต๊ทผ Chrome๋ธ๋ผ์ฐ์ ์ Developer tool Audits์ ํฌํจ๋์์ผ๋ฉฐ, ๊ฐ์ฅ ์ต๊ทผ์ ๊ตฌ๊ธ์์ ๊ฐ๋ฐํ ํด ์ด๋ฏ๋ก ๋ฏฟ๊ณ ์ฐ์ ๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค
+++?image=/assets/light-house-exam.png&size=contain
Note: ์ด ํ๋ฉด์ด LIGHTHOUSE๊ฐ ์น ํ์ด์ง๋ฅผ ๋ถ์ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง ์ ๋๋ค. ์ ํฌ ํ์ LIGHTHOUSE ํฌ๋กฌ ์ต์คํ ์ ์ ํตํด์ ๋ถ์์ ํ๊ตฌ์, ๋ณด์๋ ํ๋ฉด์์ Performance ์ Best Practice์ ์ด์ ์ ๋ง์ถฐ ๊ฐ์ ์ ์งํ ํ์ต๋๋ค.
+++
User agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36
Device Emulation Nexus 5X: Enabled
Network Throttling 562.5ms RTT, 1.4Mbps down, 0.7Mbps up: Enabled
CPU Throttling 4x slowdown: Enabled
์น์ ๋ชจ๋ฐ์ผ๋ถํฐ ๋ฐ์คํฌํ๊น์ง ๋ค์ํ ํ๊ฒฝ์์ ์๋น์ค๋ฉ๋๋ค.
๋ค์ํ ํ๊ฒฝ์ค ์ต์
์ ํ๊ฒฝ์์ ํ
์คํธ๋ฅผ ๊ฑฐ์น๊ณ ๊ฐ๋ฐ์ ํ๊ฒ๋๋ฉด,
์น์๋น์ค๋ฅผ ๋ ๋ง์ ์ฌ์ฉ์๋ค์๊ฒ ์ ๊ณตํ ์ ์์๊ฑฐ๋ผ ์๊ฐํ์ต๋๋ค.
์ LIGHTHOUSE ๊ฒฐ๊ณผ์ ๋ณด์ด๋ ๊ฒ๋ค์ด ์น ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ๊น?
@[](๋ถํ์ํ ๋ฆฌ์์ค ๋ค์ด๋ก๋) @[](๋ถํ์ํ ๋ฆฌ์์ค์ ํฌ๊ธฐ) @[](๊ฒฐ๊ณผ์ ์ผ๋ก ๋ ๋๋ง ์๊ฐ์ ์ํฅ์ ๋ฏธ์นจ)
+++
์๋ฒ์์ ์์ฒญ ํ์๋ฅผ ์ค์ด์
ํ์ด์ง์์ ์ฌ์ฉํ๋ ๋ฆฌ์์ค๋ค์ ํฌ๊ธฐ๋ฅผ ์ค์ด์
ํ๋ฉด์ ๋ณด์ฌ์ง์ง ์๋ ๋ฆฌ์์ค๋ค์ ๋ฏธ๋ฆฌ ๋ถ๋ฌ์ค์ง ๋ง์
@[3]
@[](ํ๋ฉด์ ๋ณด์ฌ์ง์ง ์๋ ์ด๋ฏธ์ง๋ค์ ๋ฏธ๋ฆฌ ์์ฒญํ์ง ์๋๋ค!)
@[](๊ฐ์ฅ ๋น ๋ฅด๊ณ ์ต์์ผ๋ก ์ต์ ํ๋ ๋ฆฌ์์ค๋ ์ ์ก๋์ง ์๋ ๋ฆฌ์์ค!)
+++
์ด๋ฏธ์ง์ ๊ฐ์๊ฐ ๋ง๊ฑฐ๋ ์ฉ๋์ด ํฐ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ฌ ๊ฒฝ์ฐ ์ธ๋ฐ์๋ ๋คํธ์ํฌ ๋น์ฉ์ด ์ฆ๊ฐํ๋ฏ๋ก
์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ค๋ ๊ณผ์ ์์ ์๋น์ค ์๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์์ง๊ฐ ์์
+++
Observer์ ๋ฑ๋ก๋ DOM element๋ค์ด ํ๋ฉด์ ๋ํ๋๊ฑฐ๋ ์ฌ๋ผ์ง ๋ ๋น๋๊ธฐ๋ก ์ด๋ฒคํธ๋ฅผ ๋ฐ์์ํจ๋ค.
function _settingIntersectionObserver() {
var interectionObserver = new IntersectionObserver
(function (entries, observer) {
entries.forEach(function (entry) {
if (!entry.isIntersecting) {
return;
}
var target = entry.target;
var $lazyImg = $(target).find('img');
if ( $lazyImg.data('lazy-img') ){
var source = $lazyImg.data('lazy-img');
$lazyImg.attr('src', source);
$lazyImg.removeAttr('data-lazy-img');
observer.unobserve(target);
}
});
});
Array.from($productContainer.find('li.item'))
.forEach(function (el) {
interectionObserver.observe(el);
});
}
@[3](IntesectionObserver ์ค์ )
@[10-17, 19](DOM์ด ๋
ธ์ถ๋๋ฉด ์ด๋ฏธ์ง ๋ก๋ฉ)
@[18](๋ณด์ฌ์ง ์ด๋ฏธ์ง๋ Observer์์ ์ ๊ฑฐ)
@[24-27](ํ๋ฉด์ ๋ํ๋๋ ๊ฒ์ ๊ฐ์งํ๊ธฐ ์ํ Element๋ฅผ ๋ฑ๋ก)
Note:
์ด๋ฏธ์ง ๋์ ๋ก๋ฉ์์ ๊ฐ์ฅ ์ค์ํ ์ฝ๋๋ ํด๋น ์๋ฆฌ๋จผํธ๊ฐ ํ์ฌ ํ๋ฉด ๋ด์ ๋ณด์ด๋์ง ์์๋ด๋ ๊ฒ! ์ด๋ฅผ ์ํด ์๋ฆฌ๋จผํธ์ ํฌ๊ธฐ์ ์์น ๊ฐ์ ๋๋ ค์ฃผ๋ Element.getBoundingClientRect
ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
ํ์ง๋ง, ์ด ํจ์๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋ธ๋ผ์ฐ์ ๋ ์๋ฆฌ๋จผํธ์ ํฌ๊ธฐ์ ์์น๊ฐ์ ์ต์ ์ ๋ณด๋ก ์์์ค๊ธฐ ์ํด ๋ฌธ์์ ์ผ๋ถ ํน์ ์ ์ฒด๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๊ฒ ๋๋ ๋ฆฌํ๋ก์ฐ(reflow)
ํ์์ด ๋ฐ์ํ๋ค๋ ์ ! ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์คํฌ๋กค ์ด๋ฒคํธ, ๋ฆฌ์ฌ์ด์ฆ ์ด๋ฒคํธ์ ๊ฐ์ด ๋ชจ๋ ์๋ฆฌ๋จผํธ๋ฅผ ์ํํ๋ฉด์ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ interaction ์ฑ๋ฅ์ด ๋จ์ด ์ง ์ ์๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์, ์คํฌ๋กค์ด๋ ๋ฆฌ์ฌ์ด์ฆ ์ด๋ฒคํธ๊ฐ ๊ณผ๋ํ๊ฒ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ผ๋ฏ๋ก throttle ๋๋ debounce ๋ฑ์ ์ฌ์ฉํด ์คํ ๋น๋๋ฅผ ์กฐ์ ํ ์๋ ์์ต๋๋ค. ๋๋, requestAnimationFrame์ ์ด์ฉํด ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ค์ ์ฌ์ฉํ์๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํด์ค IntersectionObserver API๋ ์์ง ๋ช๋ช ๋ธ๋ผ์ฐ์ ์ ์ต์ ๋ฒ์ ์์๋ง ์ฌ์ฉํ ์ ์์ง๋ง ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํด Polyfill
์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
+++
์ด๋ฏธ์ง๊ฐ ์ฑ์์ง๊ธฐ ์ DOMํฌ๊ธฐ๊ฐ ๊ธฐ์ค์ด ๋์ด๋ฒ๋ฆผ
์ด๋ก ์ธํด์ ์์๋ณด๋ค ๋ง์ ์ด๋ฏธ์ง๋ค์ด ๋ถ๋ ค์ง
@[](์ด๋ฏธ์ง์ ๋์ด์ ๋์ด๊ฐ ๊ณ ์ ์ธ ์ํ๋ก ์งํํ์ต๋๋ค.)
@[]( ํ๊ทธ์ inline-style๋ก ๋์ด์ ๋์ด ์ง์ )
+++
+++
+++
์ด๋ฏธ์ง๋ฅผ ์์ถํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ 2๊ฐ์ง ์ด๋ค.
Optimize-images
Oversize-images
@[](์ด๋ฏธ์ง์ ํ์ผ ํฌ๊ธฐ = ์ด ํฝ์
์ X ๊ฐ ํฝ์
์ ์ธ์ฝ๋ฉํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฐ์ดํธ ์)
@[1](์ด๋ฏธ์ง ํฝ์
์ ์ธ์ฝ๋ฉํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ฐ์ดํธ์ ์๋ฅผ ์ต์ ํํ๋ ๊ฒ)
@[2](์ด ํฝ์
์๋ฅผ ์ต์ ํํ๋ ๊ฒ)
+++
Webp๋ ์ง์ํ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ํ์ ์ ์ด๋ค!
<picture>
<source media="(min-width: 650px)" srcset="img_pink_flowers.jpg">
<source media="(min-width: 465px)" srcset="img_white_flower.jpg">
<img src="img_orange_flowers.jpg" alt="Flowers" style="width:auto;">
</picture>
@[](์ง์ํ๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํด์ ์ฌ์ฉํ๋ picture Element Tag)
+++
+++
ํ์ผ ์ ๋ก๋ ํ ๋์, ์ด๋ฏธ์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ๋ฆฌ์ฌ์ด์ง ์งํ, large, middle, small ๋ฑ ํ๋ก์ ํธ์ ์ ์ฉ ํ ๋งํ ์ฌ์ด์ฆ๋ก ๋ฆฌ์ฌ์ด์ง ํ๊ณ , Before After ๋น๊ต
Header์ Content Distposition: attachment; ํค๋๊ฐ ๋ด๋ ค์ค๋ ์ด์ ??
---?image=/assets/webpack.png&size=contain
+++
์๋ฒ์ฌ์ด๋ ๋ ๋๋ง ์ ์ฉ
์๋ฒ์์ ์์ฒญ ํ์๋ฅผ ์ค์ด์
ํ์ด์ง์์ ์ฌ์ฉํ๋ ๋ฆฌ์์ค๋ค์ ํฌ๊ธฐ๋ฅผ ์ค์ด์
์๋ณด์ด๋ ๋ฆฌ์์ค๋ค์ ๋ฏธ๋ฆฌ ๋ถ๋ฌ์ค์ง ๋ง์
@[2-3] @[](์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ๋ค์ ๊ธฐํ์.)
Note: FE ๊ฐ์ ์ ๋ฐฉํฅ์ผ๋ก ์ก์๊ธฐ์ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ์ ์ธํ๊ณ , ๋๋จธ์ง๋ฅผ ์ฐจ๋ก๋๋ก ์งํ ํ๊ฒ ์ต๋๋ค.
+++
- ๋ฆฌ์์ค ํฌ๊ธฐ : 500KB ์ด์
- ์๊ฐ : 500ms ์ด์
Note: ๊ฐ์ ํ๊ธฐ ์ด์ ์ ์์ฒญํ๋ ๋คํธ์ํฌ ํ์ผ์์๋ค์ด ์ด๋ ๊ฒ ๋ง๋ค์..
+++
- ๋ฆฌ์์ค ํฌ๊ธฐ : 180KB
- ์๊ฐ : 37ms
๋ฆฌ์์ค ํฌ๊ธฐ ์ฝ 64% ๊ฐ์, ์๊ฐ ์ฝ 92% ์ ์ฝ!
@[](์ธ์ณ ๊ฐํฉ!)
Note: ๊ฐ์ ํ๊ธฐ๋ฅผ ์งํํ๊ณ ๋์ ๋ฆฌ์์ค์ ํฌ๊ธฐ๋ 64%๊ฐ์ํ์๊ณ , ์๊ฐ์ ์ฝ 90%์ ๋ ์ ์ฝ๋์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ๋ก๋ ์ด๋ฒคํธ์ ๋๋ฌ ํ ๋๊น์ง์ ์๊ฐ์ ํ๊ท
์ฆ, ํ์ด์ง์ ๋ณด์ด๋ ๋ถ๋ถ์ด ํ์๋๋ ํ๊ท ์๊ฐ์
๋๋ค.
๊ทธ๋ฌ๋ ์ค์ ์ฌ์ฉ์๊ฐ ํ๋ฉด์์ ์ฃผ์ ์ปจํ ์ธ ๋ฅผ ๋๋ ์ ์๋ ๋ก๋ ์์ ์ ์๋ ์๋ ์๋ค.
+++
Note : ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ฌ์ฉ์๊ฐ ์ปจํ ์ธ ๋ฅผ ๋๋ผ๋ ์์ ์ ๋ ์์ ์์ ๋ค๋ฅด๊ฒ ๋ํ๋๋ค. ์ฒซ๋ฒ์งธ๋ ์ ์ฐจ์ ์ผ๋ก ์ฝํ ์ธ ๊ฐ ๋ก๋ฉ์ด ๋์ง๋ง, ๋๋ฒ์งธ๋ ์ ์ง์ ์ธ ๋ ๋๋ง์ด ์ด๋ฃจ์ด์ง์ง ์๊ณ ํ๋ฒ์ ๋ก๋๊ฐ ๋๋ค. ์ด๋ ํฐ ์ฐจ์ด๊ฐ ์์ผ๋ฉฐ ํ์๊ฐ speedindex๊ฐ ์ต์ ํ ๋์ง ์์์์ ๋ํ๋ด๊ธฐ๋ ํ๋ค.
+++
- ์ฝํ ์ธ ํจ์จ์ฑ ์ต์ ํ
- ์ฃผ์ ๋ ๋๋ง ๊ฒฝ๋ก ์ต์ ํ
+++
๋ถํ์ํ ๋ค์ด๋ก๋๋ฅผ ์ ๊ฑฐ
๋ค์ํ ์์ถ ๊ธฐ์ ์ ํตํด ๊ฐ ๋ฆฌ์์ค์ ์ ์ก ์ธ์ฝ๋ฉ์ ์ต์ ํ
์บ์ฑ ํ์ฑํ
@[1](offsreen images) @[2](optimize images, oversize images, text compression) @[3](content caching)
+++
Critical Rendering Path (CRP) ์กฐ์ฌ
๋ธ๋ผ์ฐ์ ๊ฐ HTML, CSS, Javascript๋ฅผ ํ๋ฉด์ ์ค์ ํฝ์
๋ก ๋ณํํ๋ ๋จ๊ณ์ ์์
๋ ๋๋ง ์ฐจ๋จ ๋ฆฌ์์ค
์ ๋ํ ์ดํด
+++
Before
speedline์ผ๋ก ์ธก์ ํ ์ด๋ฏธ์ง
+++
After
speedline์ผ๋ก ์ธก์ ํ ์ด๋ฏธ์ง (2)
+++
Lighthouse๋ก ๊ฐ์ ์ ๊ณผ ํ๋ฅผ ๋น๊ตํ ์ด๋ฏธ์ง ์ฒจ๋ถ, ํนํ performance ์ธ๋ถ ํญ์ ๊ฐ์กฐํ์ฌ ์ผ๋งํผ ๊ฐ์ ์ด ๋์๊ณ , ์ฌ๊ธฐ์ ์ด๋ค๊ฑธ ๋ ์ ์ฉํ๋ฉด ๋ ๊ฐ์ ์ด ๋๋์ง์ ๋ํ ์ค๋ช ์ฒจ๋ถ
์ง์ ์๋ต