2024-03-18.md

๐Ÿก

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

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


DIL-week3-1_2024-03-18

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ------ | ------------------------------------------------------ | ----------- | | 3์ฃผ์ฐจ | 6, 7์žฅ | ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ๋„๊ตฌ ๋””๋ฒ„๊น…, ํฌ๋กฌ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•œ ๋ถ„์„ | 401p~ |

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


๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ ๋„๊ตฌ๋กœ ๋””๋ฒ„๊น…ํ•˜๊ธฐ

๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ ๋„๊ตฌ๋ž€?

  • react-dev-tools: ํฌ๋กฌ, ํŒŒํญ, ์—ฃ์ง€

Component ๋ฉ”๋‰ด: Netflix ์‚ดํŽด๋ณด๊ธฐ

  • ๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ
  • ์ต๋ช…ํ•จ์ˆ˜๋ฅผ default๋กœ exportํ•œ ๊ฒฝ์šฐ: AnonymousDefaultComponent
  • (memo) ํ•จ์ˆ˜๋ช… ์ถ”๋ก x. memo ๋ผ๋ฒจo: Anonymous
  • (HOC) ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ์™€, ๊ณ ์ฐจ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐ์‹ผ ์ปดํฌ๋„ŒํŠธ: Anonymous
  • ๋ฌด๊ธฐ๋ช… ํ•จ์ˆ˜์— displayName ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ• ์žˆ์Œ
    MemoizedComponent.displayName = '๋ฉ”๋ชจ ์ปดํฌ๋„ŒํŠธ'
    
  • (displayName, ๊ธฐ๋ช… ํ•จ์ˆ˜) ๊ฐœ๋ฐœ ๋ชจ๋“œ์—์„œ๋งŒ ์ฐธ๊ณ : terser ๋“ฑ ์••์ถ• ๋„๊ตฌ๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ช… ๋‚œ์ˆ˜ํ™”, displayName์€ ๋นŒ๋“œ ๋„๊ตฌ๊ฐ€ ์‚ญ์ œ

์ปดํฌ๋„ŒํŠธ ๋„๊ตฌ Component

  • ๐Ÿ‘๏ธ: Element ํƒญ + ๋žœ๋”๋ง๋œ HTML ์š”์†Œ ์„ ํƒ

  • ๐Ÿชฒ: console.log์— Props, Hooks, Nodes

    Props:
    {
      as: "p",
      children:
        {
          $$typeof: Symbol(react.element),
          key: null,
          props: {children: '์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•ด ์ด๋™ ์ค‘์—๋„ ์ฆ๊ธฐ๋Š” ์‹ ๋ฐ•ํ•œ ๊ฒฝํ—˜.'},
          ref: null,
          type: {
            $$typeof: Symbol(react.forward_ref),
            displayName: 'Styled(span)',
            defaultProps: undefined,
            __emotion_real: {โ€ฆ},
            render: ฦ’,
            ...
          }
          _owner:null,
        },
      color:"WhiteT70",
      variant:{xs: 'BodyStandard', l: 'Subtitle'},
    }
    
    Hooks:[
      {
        id: null,
        isStateEditable: false,
        name: "a",
        subHooks: [
          {
            id: null,
            isStateEditable: false,
            name: "Context",
            value: {
              theme: "dark",
              internalHasProvider: true,
            },
            subHooks: [],
            hookSource: {
              lineNumber: 1,
              functionName: "a",
              fileName:
                "https://assets.nflxext.com/web/ffe/wp/signup/nmhp/nmhpFrameworkClient.js.456145d0d707f996a700.js",
              columnNumber: 1404288,
            },
          },
        ],
        hookSource: {
          lineNumber: 7,
          columnNumber: 89727,
          fileName:
            "https://assets.nflxext.com/web/ffe/wp/signup/nmhp/nmhpFrameworkClient.js.456145d0d707f996a700.js",
        },
      },
    ];
    
    Nodes: [p.default-ltr-cache-dk1xic.euy28771]
    

    | console | ๋‚ด์šฉ | | ------- | ------------------------------------------------------ | | Props | card, onRenderComplete, setFirstCardImage | | Hooks | hookSource, id, isStateEditable, name, subHooks, value | | Nodes | ๋…ธ๋“œ element ๋ฐฐ์—ด |

  • <>: view source code for this element

    • ๋ณ€์ˆ˜
      • copy value to clipboard
      • store as global variable: window.$r // ์ „์—ญ๋ณ€์ˆ˜๋กœ ๋ณด๊ด€
    • ํ•จ์ˆ˜
      • go to definition
    • hooks
      • use๊ฐ€ ์ƒ๋žต๋œ ๋ชจ์Šต์ž„
      • ์ปค์Šคํ…€ ํ›…๋„ ๋‚˜์˜ด
      • ํ›…์— ๋„˜๊ฒจ์ฃผ๋Š” ํ•จ์ˆ˜ ๊ธฐ๋ช…ํ•จ์ˆ˜๋ฉด ํ™•์ธo
    • rendered by
      • ๋žœ๋”๋ง ์ฃผ์ฒด

Profiler

  • Flamegraph, Ranked, Timeline
  • ๋žœ๋”๋ง ๊ณผ์ •์— ๊ฐœ์ž…ํ•ด ๋””๋ฒ„๊น…์— ํ•„์š”ํ•œ ๋‚ด์šฉ์„ ๊ธฐ๋ก => ํ”„๋กœ๋•์…˜์—์„œ ์‚ฌ์šฉx
    • ๊ฐœ๋ฐœ ๋ชจ๋“œ์˜ ๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ค€๋น„~
  • ๋žœ๋” Commit ๋ณ„๋กœ ์–ด๋–ค ์ž‘์—…์ด ์žˆ์–ด๋ƒค๋ƒ
  • ๋„ˆ๋น„: ๋žœ๋”๋ง ์‹œ๊ฐ„
  • Timeline์˜ timestamp๋กœ effect ๋™์ž‘ ํ™•์ธ

=> ์ฝ”๋“œ ๋งŽ์•„์ ธ์„œ ์† ๋Œ€๊ธฐ ํž˜๋“ค์–ด์ง€๊ธฐ ์ „์— ๋””๋ฒ„๊น…ํ•ด์„œ ๋ฒ„๊ทธ ๋ฐฉ์ง€ ํ•ด์•ผ ํ•œ๋‹ค

=> ๋””๋ฒ„๊น… ํˆด ์ž˜ ํ™œ์šฉํ•˜๊ธฐ

ํ™•์ธ ๋‚ด์šฉ

  • ํ”„๋กœํŒŒ์ผ๋ง json ๋‚ด๋ณด๋‚ด๊ธฐ

image

  • ๋žœ๋” ์ปค๋ฐ‹ ์ •๋ณด

image

  • ํƒ€์ž„๋ผ์ธ

image

  • ๋žญํฌ

image

  • ์ต๋ช…ํ•จ์ˆ˜ default export

image

  • store as global variable

image