Open JaeYeopHan opened 5 years ago
๐กFCP: First Contentful Painting
๋ธ๋ผ์ฐ์ ๋ ์ผ๋ จ์ ๊ณผ์ ์ ํตํด ํ๋ฉด์ ๋ ๋๋งํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณผ์ ์ค์๋ paint ๊ณผ์ ์ด ์์ผ๋ฉฐ ๋ณดํต UX์ ๊ด๋ จ๋ ์ฑ๋ฅ ์งํ๋ก First Contentful Painting Time์ ์ผ๋๋ค. ์ด ์์ ์ JavaScript๋ก ์ก์๋ผ ์ ์์๊น? ์ด ์์ ์ ์ก์๋ผ ์ ์๋ค๋ฉด React Application ์ธ๋ถ์์ ReactDOM.render๊ฐ ์๋ฃ๋ ์์ ์ ์ ์ ์์ง ์์๊น?
ReactDOM.render
const po = new PerformanceObserver(list => list .getEntries() .filter(({ entryType }) => entryType === 'paint') .map(({ name }) => name === FIRST_CONTENTFUL_PAINT) .forEach(/* callback */), ) try { po.observe({ entryTypes: ['measure', 'paint'] }) } catch (e) { console.error(e) po.disconnect() }
PerformanceObserver๋ผ๋ API๋ฅผ ํ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ทธ๋ ค์ง๋ ๊ณผ์ ๋ค์ observeํ ์ ์๋ค. ์ฐ๋ฆฌ์๊ฒ ํ์ํ ์ธก์ ์งํ๋ paint ์์ ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ observe์ parameter๋ก { entryTypes: ['paint'] }๋ง ๋๊ฒจ์ค๋ ๋๋ค.
PerformanceObserver
observe
paint
{ entryTypes: ['paint'] }
(์ try-catch๋ก ๊ฐ์ธ์คฌ๋์ง๋ ๋ฐ๋ก ๋ฐ์์๐)
try-catch
โ Safari ๋ฏธ์ง์ API ๐คฆโโ๏ธ
ํด๋น API๋ Chrome์์๋ง ์ง์ํ๊ณ Safari์์๋ ์ง์ํ์ง ์๋๋ค. ๋๋ฌธ์ entryType์์ paint๋ฅผ observeํ ์ ์๋ค. paint๋ฅผ ๊ตฌ๋ ํ์ ๋ ๋ฐํ๋๋ entry์ interface๋ ๋ค์๊ณผ ๊ฐ๋ค.
interface PerformancePaintTiming { name: string; // "first-paint" or "first-contentful-paint" entryType: string // "paint" duration: number startTime: number }
ReactDOM.render๊ฐ ์๋ฃ๋ ์์ ์ ์ก๊ธฐ ์ํด PerformanceObserver API๋ฅผ ์ฌ์ฉํ์ง๋ง safari์์ ๋ฏธ์ง์ํ๋ฏ๋ก ํฐ์ง๋ค. ๋๋ฌธ์ safari๋ฅผ ํฌ๊ธฐํ๊ณ try-catch statement๋ก ๊ฐ์ธ๋๊ฐ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค.
Catch FCP
๋ธ๋ผ์ฐ์ ๋ ์ผ๋ จ์ ๊ณผ์ ์ ํตํด ํ๋ฉด์ ๋ ๋๋งํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณผ์ ์ค์๋ paint ๊ณผ์ ์ด ์์ผ๋ฉฐ ๋ณดํต UX์ ๊ด๋ จ๋ ์ฑ๋ฅ ์งํ๋ก First Contentful Painting Time์ ์ผ๋๋ค. ์ด ์์ ์ JavaScript๋ก ์ก์๋ผ ์ ์์๊น? ์ด ์์ ์ ์ก์๋ผ ์ ์๋ค๋ฉด React Application ์ธ๋ถ์์
ReactDOM.render
๊ฐ ์๋ฃ๋ ์์ ์ ์ ์ ์์ง ์์๊น?PerformanceObserver
PerformanceObserver
๋ผ๋ API๋ฅผ ํ์ฉํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ทธ๋ ค์ง๋ ๊ณผ์ ๋ค์observe
ํ ์ ์๋ค. ์ฐ๋ฆฌ์๊ฒ ํ์ํ ์ธก์ ์งํ๋paint
์์ ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ observe์ parameter๋ก{ entryTypes: ['paint'] }
๋ง ๋๊ฒจ์ค๋ ๋๋ค.(์
try-catch
๋ก ๊ฐ์ธ์คฌ๋์ง๋ ๋ฐ๋ก ๋ฐ์์๐)PerformancePaintTiming
ํด๋น API๋ Chrome์์๋ง ์ง์ํ๊ณ Safari์์๋ ์ง์ํ์ง ์๋๋ค. ๋๋ฌธ์ entryType์์
paint
๋ฅผ observeํ ์ ์๋ค. paint๋ฅผ ๊ตฌ๋ ํ์ ๋ ๋ฐํ๋๋ entry์ interface๋ ๋ค์๊ณผ ๊ฐ๋ค.So What?
ReactDOM.render
๊ฐ ์๋ฃ๋ ์์ ์ ์ก๊ธฐ ์ํดPerformanceObserver
API๋ฅผ ์ฌ์ฉํ์ง๋ง safari์์ ๋ฏธ์ง์ํ๋ฏ๋ก ํฐ์ง๋ค. ๋๋ฌธ์ safari๋ฅผ ํฌ๊ธฐํ๊ณtry-catch
statement๋ก ๊ฐ์ธ๋๊ฐ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค.