2024-04-16.md

๐Ÿก

DIL: ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ, 7์ฃผ์ฐจ-2

์Šคํ„ฐ๋””: ์›”๊ฐ„ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์˜ค๋Š˜ ์ง„ํ–‰: ๊ฐœ์ธ๊ณต๋ถ€


DIL-week7-2_2024-04-16

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ---------- | --------------------------------------------------------------------------------------- | ----------- | | 7์ฃผ์ฐจ | 12์žฅ, 13์žฅ | ๋ชจ๋“  ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผ ํ•  ํ•ต์‹ฌ ์›น ์ง€ํ‘œ, ์›น ํŽ˜์ด์ง€์˜ ์„ฑ๋Šฅ์„ ์ธก์ •ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ• | 781~788p |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ
์ฝ์€ ์‹œ๊ฐ„: ์ด 1์‹œ๊ฐ„


๋ชจ๋“  ์›น ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์•ผ ํ•  ํ•ต์‹ฌ ์›น ์ง€ํ‘œ

์˜ˆ์ œ

  • LCP๋Š” ํŽ˜์ด์ง€ ๋กœ๋”ฉ์— ๋”ฐ๋ผ ๋ณ€ํ™”ํ•˜๋Š” ์ง€ํ‘œ๋‹ค.
  • LCP๋Š” ์‚ฌ์šฉ์ž ๋””๋ฐ”์ด์Šค ํฌ๊ธฐ์— ๋”ฐ๋ผ ๊ฐ’์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

๊ธฐ์ค€ ์ ์ˆ˜

  • ์ง€ํ‘œ ์ ์ˆ˜ ์ธก์ •: (1)JS API ํ˜ธ์ถœ (2)๋„๊ตฌ ํ™œ์šฉ image

    https://web.dev/articles/lcp?hl=ko#what-is-lcp ๐Ÿ’ก Key Point: LCP includes any unload time from the previous page, connection setup time, redirect time, and Time To First Byte (TTFB), which can all be significant when measured in the field and can lead to differences between field and lab measurements.

๊ฐœ์„  ๋ฐฉ์•ˆ

  • ํ…์ŠคํŠธ ๊ตฟ
์ด๋ฏธ์ง€ ๋…ธ์ถœ ๋ฐฉ๋ฒ•๋ณ„ ์„ฑ๋Šฅ

| ์š”์†Œ | preload ์—ฌ๋ถ€ | | ---------------------- | ------------ | | <img>, <picture> | O | | <svg> ๋‚ด๋ถ€์˜ <img> | X | | <video>์˜ poster | O | | background image | X |

  • <img>, <picture>
    • ๋ธŒ๋ผ์šฐ์ €์˜ preload ์Šค์บ๋„ˆ์— ์˜ํ•ด์„œ ๋จผ์ € ๋ฐœ๊ฒฌ๋˜์–ด ์š”์ฒญ ๋“ค์–ด๊ฐ. HTML์„ ํŒŒ์‹ฑํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๊ณ , preload๊ฐ€ ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์•„ ๋กœ๋”ฉํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋Šฅ.
  • <svg> ๋‚ด๋ถ€์˜ <img>
    • (ํฌ๋กฌ 102๋ฒ„์ „)svg๋งŒ ๋กœ๋”ฉ๋œ ์ƒํƒœ์—์„œ๋„ LCP๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•˜๋Š” ๋ฒ„๊ทธ์žˆ์—ˆ์Œ
    • preload x
  • <video>์˜ poster
    • video ์š”์†Œ๋ฅผ ์žฌ์ƒํ•˜๊ฑฐ๋‚˜ ํƒ์ƒ‰ํ•˜๊ธฐ ์ „๊นŒ์ง€ ๋…ธ์ถœ๋˜๋Š” ์š”์†Œ (์ธ๋„ค์ผ์ผ)
    • video๊ฐ€ viewport์— ๊ฑธ๋ฆฐ๋‹ค๋ฉด์€ (LCP ์˜ํ–ฅ) => poster๋ฅผ ๋„ฃ์–ด์ฃผ์ž
      • ๋‚˜์ค‘์— poster๊ฐ€ ์—†๋‹ค๋ฉด ์‹ค์ œ ๋กœ๋”ฉํ›„ ์ฒซ ํ”„๋ ˆ์ž„์„ ๋ฆฌ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์žˆ์„ ์˜ˆ์ •
      • yes preload
  • background image
    • CSS์˜ ๋ฆฌ์†Œ์Šค๋Š” ํ•ญ์ƒ ๋Š๋ฆฌ๋‹ค
    • DOM์„ ๊ทธ๋ฆด ์ค€๋น„๊ฐ€ ๋  ๋•Œ๊นŒ์ง€, ๋ฆฌ์†Œ์Šค ์š”์ฒญ์„ ๋ฏธ๋ฃจ๊ธฐ ๋•Œ๋ฌธ
    • not preload

๊ทธ ๋ฐ–์— ์กฐ์‹ฌํ•ด์•ผ ํ•  ์‚ฌํ•ญ

  • ๋ฌด์†์‹ค ์•• ์ถ•! ์ตœ์†Œํ•œ์˜ ์šฉ๋Ÿ‰!
  • loading=lazy๋Š” LCP์— ์˜ํ–ฅ์žˆ๋Š” ๋ฆฌ์†Œ์Šค์—๋Š” ์‚ฌ์šฉ no no
  • fadein ์• ๋‹ˆ๋ฉ”์ด์…˜๋„ LCP์— ํฌํ•จ
  • ํด๋ผ์ด์–ธํŠธ์—์„œ ๋นŒ๋“œํ•˜์ง€ ๋ง๊ฒƒ~
    // LCP๋Š” ๋ฆฌ์•กํŠธ ์ฝ”๋“œ๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ  ์ฝ์€ ๋‹ด์—, API ์š”์ฒญ/์‘๋‹ต ํ›„
    useEffect(() => {
      (async function loadData() {
        const result = await fetchData("https://api.takes-time.com");
        if (result.ok) {
          setShow(true);
        }
      })();
    });
    
  • ๊ฐ€๋Šฅํ•˜๋ฉด~? LCP ๋ฆฌ์†Œ์Šค๋Š” => ๊ฐ™์€ ๋„๋ฉ”์ธ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ข‹๋‹ค
    • cross origin์˜ ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•  ์‹œ, loading=lazy์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ตœ์ ํ™”์— ๋ณ„๋กœ ์ข‹์ง€ ์•Š๋‹ค~

FID, First Input Delay

| FID, ์ตœ์ดˆ ์ž…๋ ฅ ์ง€์—ฐ | ๊ธฐ์ค€ ๊ฒฐ๊ณผ | | ------------------- | --------- | | >100ms | ์ข‹์Œ | | >300ms | ๋ณดํ†ต | | โ‰ค300ms | ๋‚˜์จ |

์ •์˜

  • FID๊ฐ€ ์•…ํ™”๋˜๋Š” ์ด์œ ~
    • ๋ธŒ๋ผ์šฐ์ €์˜ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฐ”์˜๋‹ค. (๋‹ค๋ฅธ ์ž‘์—… ์ฒ˜๋ฆฌ ์ค‘)
      • ๋Œ€๊ทœ๋ชจ ๋žœ๋”๋ง
      • ๋Œ€๊ทœ๋ชจ javascript ํŒŒ์ผ์„ ๋ถ„์„ & ์‹คํ–‰
  • ๋ฐ˜์‘์„ฑ์— ํ•ด๋‹นํ•˜๋Š” ์‚ฌ์šฉ์ž ์ž…๋ ฅ: ํด๋ฆญ, ํ„ฐ์น˜, ํƒ€์ดํ•‘ ๋“ฑ ๊ฐœ๋ณ„ ์ž…๋ ฅ ์ž‘์—…

RAIL

  • Response: ์‚ฌ์šฉ์ž์— ์ž…๋ ฅ์— ๋Œ€ํ•œ ๋ฐ˜์‘ ์†๋„. 50ms <- FID๊ฐ€ ์—ฌ๊ธฐ ํ•ด๋‹น
  • Animation: ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ฐ ํ”„๋ ˆ์ž„์„ 10ms
  • Idle: ํŽ˜์ด์ง€๊ฐ€ 50ms ๋‚ด์— ์‚ฌ์šฉ์ž ์ž…๋ ฅ์— ์‘๋‹ต
  • Load: 5์ดˆ ๋‚ด์— ์ฝ˜ํ…์ธ ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์ธํ„ฐ๋ ‰์…˜ ์ค€๋น„

INP, Interaction to Next Paint

https://web.dev/blog/inp-cwv-march-12
2024๋…„ 3์›”์— Core web vital์— FID๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ ์ถ”๊ฐ€๋จ (FID is deprecated) image Today, we're announcing that INP will officially become a Core Web Vital and replace FID on March 12 of this year, and that FID will be deprecated in this transition.

  • ๋‹ˆ ์‚ฌ์ดํŠธ PageSpeed Insights ํ†ต๊ณผํ•˜๋ƒ~ image

์ฝ์œผ๋ฉด ์ข‹์€ ๋ ˆํผ๋Ÿฐ์Šค

  • https://web.dev/articles/defining-core-web-vitals-thresholds?hl=en image
  • Cloudinary: ์ด๋ฏธ์ง€ ์ตœ์ ํ™” ์„œ๋น„์Šค (ํฌ๊ธฐ, ํฌ๋งท, ์••์ถ•)
    • https://cloudinary.com/ip/gr-sea-gg-brand-home-base?utm_source=google&utm_medium=search&utm_campaign=goog_selfserve_brand_wk22_replicate_core_branded_keyword&utm_term=1329&campaignid=17601148700&adgroupid=141182782954&keyword=cloudinary&device=c&matchtype=e&adposition=&gad_source=1&gclid=CjwKCAjww_iwBhApEiwAuG6ccNyQhRJY3ISGbve8DQkca0989oUulgozh3ZVlbDcflWftMFLe67LlRoCdI8QAvD_BwE
    • https://console.cloudinary.com/pm/c-15c83121473acc71e5bf4cd045bdf7/getting-started
  • CrUX Chrome ์‚ฌ์šฉ์ž ํ™˜๊ฒฝ ๋ณด๊ณ ์„œ // ๊ณต์‹ ๋ฐ์ดํ„ฐ ์„ธํŠธ
    • https://developer.chrome.com/docs/crux?hl=ko