Skip to content

Instantly share code, notes, and snippets.

@easylogic
Created November 19, 2025 13:38
Show Gist options
  • Select an option

  • Save easylogic/b87d1863483e166930a3c0ddb494d6ca to your computer and use it in GitHub Desktop.

Select an option

Save easylogic/b87d1863483e166930a3c0ddb494d6ca to your computer and use it in GitHub Desktop.
react-style-reconciliation

React-style Reconciliation ์š”์•ฝ

1. ์ „์ฒด ํ๋ฆ„

๋‹จ๊ณ„ Render Phase (renderFiberNode) Commit Phase (commitFiberNode) ๊ฒฐ๊ณผ
DOM ์ค€๋น„ Fiber ํŠธ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ Text/Host DOM ์ƒ์„ฑ๋งŒ ์ˆ˜ํ–‰ (๋ถ€๋ชจ์— ์‚ฝ์ž…ํ•˜์ง€ ์•Š์Œ) effectTag(PLACEMENT/UPDATE/DELETION)์— ๋”ฐ๋ผ ์‹ค์ œ DOM ์‚ฝ์ž…/์žฌ๋ฐฐ์น˜/์ œ๊ฑฐ React completeWork + commitMutationEffects์™€ ๋™์ผ
์ˆœ์„œ ๊ฒฐ์ • Fiber child/sibling ๋งํฌ๋งŒ ๊ตฌ์„ฑ getHostSibling์œผ๋กœ ๋‹ค์Œ ํ˜•์ œ DOM ์ฐพ์€ ๋’ค insertBefore DOM ์ˆœ์„œ ์•ˆ์ •
์†์„ฑ/์Šคํƒ€์ผ ์„ค์ •ํ•˜์ง€ ์•Š์Œ dom.updateAttributes / dom.updateStyles๊ฐ€ diff๋ฅผ ๊ณ„์‚ฐํ•ด Insert/Update/Delete ์ˆ˜ํ–‰ React commitUpdate์™€ ๋™์ผ
ํ…์ŠคํŠธ Text node ์ƒ์„ฑ๋งŒ handleVNodeTextProperty๊ฐ€ ์ตœ์ข… ํ…์ŠคํŠธ ์ปค๋ฐ‹ Text-only VNode ์ฒ˜๋ฆฌ

1-1. ๋‹จ๊ณ„๋ณ„ ๋‹ค์ด์–ด๊ทธ๋žจ (Mermaid)

flowchart LR
  A["VNode ์ž…๋ ฅ<br/>(prev / next)"]
  B["Render Phase<br/>(renderFiberNode)"]
  C["DOM ์ƒ์„ฑ/์žฌ์‚ฌ์šฉ๋งŒ<br/>(์‚ฝ์ž… X, attrs X)"]
  D["effectTag ๊ฒฐ์ •<br/>(PLACEMENT / UPDATE / DELETION)"]
  E["Commit Phase<br/>(commitFiberNode / commitFiberTree)"]
  F["CL: effectTag === PLACEMENT?<br/>โ†’ getHostSibling & insertBefore"]
  G["์†์„ฑ/์Šคํƒ€์ผ diff & ์ปค๋ฐ‹<br/>(dom.updateAttributes / updateStyles)"]
  H["ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ<br/>(handleVNodeTextProperty)"]
  I["์ตœ์ข… DOM ๋ฐ˜์˜ ์™„๋ฃŒ"]

  A --> B --> C --> D --> E --> F --> G --> H --> I
Loading

1-2. VNode ๋น„๊ต/ID ์ „ํŒŒ ํ๋ฆ„

flowchart LR
  subgraph Prev_Render
    P1["VNode_prev (sid/key)"] -->|metaDomElement| P2[DOM_prev]
  end
  subgraph Next_Render
    N1[VNode_next] -->|transferVNodeIdFromPrev| N2["VNode_next + sid"]
    N2 -->|generateVNodeIdIfNeeded fallback| N3["VNode_next stable ID"]
  end
  P2 -. reused DOM .-> N3
  N3 -->|fiber.domElement| RenderPhase
  RenderPhase -->|effectTag| CommitPhase
Loading
  • transferVNodeIdFromPrev: ์ด์ „ VNode์˜ sid/key๋ฅผ ์ƒˆ VNode๋กœ ๋ณต์‚ฌํ•ด ๋™์ผ ๊ฐœ์ฒด์ž„์„ ํ‘œ์‹œ.
  • generateVNodeIdIfNeeded: sid/key๊ฐ€ ์—†์œผ๋ฉด ์ปดํฌ๋„ŒํŠธ(stype) โ†’ ComponentManager, ์ผ๋ฐ˜ Host โ†’ tag-index ๊ธฐ๋ฐ˜ auto ID ์ƒ์„ฑ (DOM์—๋Š” ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ).
  • fiber.domElement๊ฐ€ prev DOM์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜์–ด Commit Phase์—์„œ๋„ ๊ฐ™์€ DOM์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ.

2. Render Phase ์ƒ์„ธ

if (prevVNode?.meta?.domElement) {
  domElement = prevVNode.meta.domElement;
} else if (vnode.tag === '#text') {
  domElement = document.createTextNode(vnode.text);
} else if (vnode.tag) {
  domElement = dom.createSimpleElement(vnode.tag);
  if (vnode.sid && !isAutoGeneratedSid(vnode)) {
    dom.setAttribute(domElement, 'data-bc-sid', vnode.sid);
  }
  if (vnode.attrs) {
    for (const [key, value] of Object.entries(vnode.attrs)) {
      dom.setAttribute(domElement, key, String(value));
    }
  }
}
vnode.meta.domElement = domElement;
fiber.domElement = domElement;
  • DOM ์ƒ์„ฑ ํ›„ vnode.meta.domElement/fiber.domElement์— ์ €์žฅ.
  • ๋ถ€๋ชจ์— ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์†์„ฑ์„ diffํ•˜์ง€ ์•Š์Œ.
  • Portal๋„ ๋ณ„๋„ FiberScheduler๋กœ ๋™์ผ ํ๋ฆ„ ์ˆ˜ํ–‰.

3. Commit Phase ์ƒ์„ธ

if (fiber.effectTag === 'PLACEMENT') {
  const parent = fiber.parentFiber?.domElement ?? fiber.parent;
  let before = getHostSibling(fiber);
  if (before && before.parentNode !== parent) before = null;
  parent.insertBefore(domElement, before);
}

if (domElement instanceof HTMLElement) {
  dom.updateAttributes(domElement, prevVNode?.attrs, vnode.attrs);
  dom.updateStyles(domElement, prevVNode?.style, vnode.style);
}

if (domElement instanceof HTMLElement && vnode.text && !vnode.children) {
  handleVNodeTextProperty(domElement, vnode, prevVNode);
}
  • ์‚ฝ์ž…: Render Phase์—์„œ ์ค€๋น„๋œ DOM์„ commit ์‹œ์ ์—๋งŒ insertBefore.
  • ์†์„ฑ/์Šคํƒ€์ผ: React์™€ ๋™์ผํ•˜๊ฒŒ diff โ†’ ๋ถ€์กฑ๋ถ„ ์‚ญ์ œ, ์ƒˆ ๊ฐ’ ์ ์šฉ.
  • Deletion: prevVNode.meta.domElement ๊ธฐ๋ฐ˜์œผ๋กœ DOM ์ œ๊ฑฐ + component unmount.

4. getHostSibling (React ์•Œ๊ณ ๋ฆฌ์ฆ˜)

let sibling = fiber.sibling;
while (sibling) {
  if (sibling.domElement) return sibling.domElement;
  if (sibling.child) {
    let child = sibling.child;
    while (child) {
      if (child.domElement) return child.domElement;
      child = child.child;
    }
  }
  sibling = sibling.sibling;
}
return null;
  • Render Phase์—์„œ domElement๋ฅผ ๋ฏธ๋ฆฌ ์„ธํŒ…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— commit์—์„œ ๋ฐ”๋กœ reference node ํ™•๋ณด ๊ฐ€๋Šฅ.
  • reference node๊ฐ€ ๋ถ€๋ชจ์˜ child๊ฐ€ ์•„๋‹ˆ๋ฉด null๋กœ ๊ฐ•๋“ฑ โ†’ React์™€ ๋™์ผํ•œ append ๋™์ž‘.

5. ์†์„ฑ/์Šคํƒ€์ผ Insert / Update / Delete

dom.updateAttributes

  • Prev attrs์— ์žˆ์ง€๋งŒ next attrs์— ์—†๋Š” ํ‚ค โ†’ removeAttributeWithNamespace๋กœ ์‚ญ์ œ.
  • next ๊ฐ’์ด undefined/null โ†’ ์‚ญ์ œ๋กœ ๊ฐ„์ฃผ.
  • ๋‚˜๋จธ์ง€๋Š” namespace-aware setAttributeWithNamespace ํ˜ธ์ถœ.

dom.updateStyles

  • Prev ์Šคํƒ€์ผ์— ์žˆ์ง€๋งŒ next์— ์—†๋Š” ํ‚ค โ†’ style.removeProperty.
  • next ๊ฐ’์ด undefined/null โ†’ removeProperty.
  • ๋‚˜๋จธ์ง€๋Š” style.setProperty๋กœ ์—…๋ฐ์ดํŠธ.

6. ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ

  • Text VNode๋Š” Render Phase์—์„œ Text ๋…ธ๋“œ๋งŒ ์ƒ์„ฑ.
  • Commit Phase์—์„œ handleTextOnlyVNode / handleVNodeTextProperty๊ฐ€ ์ตœ์ข… ํ…์ŠคํŠธ ์ปค๋ฐ‹ ๋ฐ ์œ„์น˜ ์ด๋™์„ ๋‹ด๋‹น.

7. Deletion ํ๋ฆ„

  • effectTag === 'DELETION' โ†’ prevVNode.meta.domElement๋ฅผ parent์—์„œ ์ œ๊ฑฐ.
  • Component VNode์ด๋ฉด components.unmountComponent ํ˜ธ์ถœ ํ›„ DOM ์ œ๊ฑฐ.

8. React์™€์˜ ๋Œ€์กฐํ‘œ

React ๊ฐœ๋… ํ˜„์žฌ ๊ตฌํ˜„
Fiber Render (beginWork/completeWork) renderFiberNode (DOM ์ƒ์„ฑ๋งŒ)
Effect flags fiber.effectTag (PLACEMENT/UPDATE/DELETION)
Effect list traversal commitFiberTree (childโ†’sibling DFS)
commitPlacement insertBefore + getHostSibling
commitUpdate (attrs/styles) dom.updateAttributes / dom.updateStyles
getHostSibling ๋™์ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜
namespace-aware attributes setAttributeWithNamespace / removeAttributeWithNamespace

๊ฒฐ๋ก : Render Phase์—์„œ DOM์„ ์ค€๋น„ํ•˜๊ณ , Commit Phase์—์„œ ์‚ฝ์ž…/์†์„ฑ/์Šคํƒ€์ผ/ํ…์ŠคํŠธ/์‚ญ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” React ํ๋ฆ„์„ ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

9. Child Matching Matrix

Fiber ์ƒ์„ฑ ์‹œ prev/next VNode ์ž์‹ ๋งค์นญ์€ ์•„๋ž˜ ์šฐ์„ ์ˆœ์œ„๋กœ ์ง„ํ–‰๋œ๋‹ค. ๊ฐ ๋‹จ๊ณ„์—์„œ ๋งค์นญ๋˜๋ฉด DOM์„ ์žฌ์‚ฌ์šฉํ•˜๊ณ  effectTag = 'UPDATE', ๋๊นŒ์ง€ ๋งค์นญ๋˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ DOM์„ ๋งŒ๋“ค๊ณ  effectTag = 'PLACEMENT'๊ฐ€ ๋œ๋‹ค. ๋งค์นญ์— ์‹คํŒจํ•œ prev VNode๋Š” Commit Phase์—์„œ removeStaleChildren์ด ์ œ๊ฑฐํ•œ๋‹ค.

์šฐ์„ ์ˆœ์œ„ ์กฐ๊ฑด ๋งค์นญ ๊ธฐ์ค€ ๊ฒฐ๊ณผ
1 getVNodeId(childVNode)๊ฐ€ truthy (sid, key, data-decorator-sid ๋“ฑ) prevVNode.children ์ค‘ ๋™์ผ ID, ์•„์ง ๋งค์นญ๋˜์ง€ ์•Š์€ ํ•ญ๋ชฉ ๊ฒ€์ƒ‰ DOM/์ปดํฌ๋„ŒํŠธ ์™„์ „ ์žฌ์‚ฌ์šฉ. ์œ„์น˜๊ฐ€ ๋‹ฌ๋ผ๋„ ํ˜„์žฌ ์ธ๋ฑ์Šค๋กœ ์ด๋™.
2 ๋ช…์‹œ ID ์—†์Œ, transferVNodeIdFromPrev๊ฐ€ stype ๊ธฐ๋ฐ˜ ID๋ฅผ ๋ถ€์—ฌ prev ์ž์‹์˜ stype์ด ๊ฐ™๊ณ  ID๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ID๋ฅผ ๋ณต์‚ฌ โ†’ 1๋‹จ๊ณ„์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ ์ปดํฌ๋„ŒํŠธ/Decorator๊ฐ€ ๋ช…์‹œ ID ์—†์ด๋„ ์•ˆ์ •์ ์œผ๋กœ ์žฌ์‚ฌ์šฉ๋จ.
3 ID ์—†์Œ, ๊ฐ™์€ ์ธ๋ฑ์Šค์— prev ์ž์‹ ์กด์žฌ prev.children[i]์˜ tag์™€ ํ˜„์žฌ tag๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ ๋‘˜ ๋‹ค ํ…์ŠคํŠธ (#text) ๋™์ผ ํƒ€์ž…์ผ ๋•Œ๋งŒ DOM ์žฌ์‚ฌ์šฉ. ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ๋งค์นญ ์‹คํŒจ.
4 ID/์ธ๋ฑ์Šค ๋งค์นญ ์‹คํŒจ, ๋‘˜ ๋‹ค Host VNode prev children ์ „์ฒด๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ tag + ํด๋ž˜์Šค ์กฐํ•ฉ์ด ๊ฐ™์€ ํ•ญ๋ชฉ ํƒ์ƒ‰ (์ด๋ฏธ ๋งค์นญ๋œ VNode ์ œ์™ธ) mark/decorator wrapper์ฒ˜๋Ÿผ ID๊ฐ€ ์—†๋Š” Host ๋…ธ๋“œ๋„ ์•ˆ์ •์ ์œผ๋กœ ์žฌ์‚ฌ์šฉ.
5 ์–ด๋А ์กฐ๊ฑด์—๋„ ํ•ด๋‹นํ•˜์ง€ ์•Š์Œ ๋งค์นญ ์‹คํŒจ๋กœ ๊ฐ„์ฃผ Render Phase์—์„œ ์ƒˆ DOM ์ƒ์„ฑ, Commit Phase์—์„œ ๊ธฐ์กด DOM ์ œ๊ฑฐ ํ›„ ์‚ฝ์ž….

์ถ”๊ฐ€ ๊ทœ์น™:

  • ํ…์ŠคํŠธ ์ž์‹์€ tag: '#text'๋กœ ํ†ต์ผํ•ด 3๋‹จ๊ณ„์—์„œ ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ์ผ๊ด€์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • generateVNodeIdIfNeeded๊ฐ€ Host/Text VNode์— tag-index ๊ธฐ๋ฐ˜ auto ID๋ฅผ ๋ถ€์—ฌํ•ด ๋™์ผ ๊ตฌ์กฐ๊ฐ€ ๋ฐ˜๋ณต๋  ๋•Œ๋„ ๋งค์นญ์ด ์•ˆ์ •์ ์ด๋‹ค.
  • Render Phase๋Š” ๋งค์นญ ๊ฒฐ๊ณผ๋งŒ ๊ณ„์‚ฐํ•˜๊ณ  DOM ์ด๋™/์‚ญ์ œ๋Š” ํ•˜์ง€ ์•Š๋Š”๋‹ค. Commit Phase์—์„œ commitFiberTree๊ฐ€ effectTag์— ๋”ฐ๋ผ DOM์„ ์‚ฝ์ž…ยท์—…๋ฐ์ดํŠธยท์‚ญ์ œํ•˜๊ณ , ๋งˆ์ง€๋ง‰์— removeStaleChildren/processPrimitiveTextChildren๊ฐ€ ๋‚จ์€ ๋™๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

10. Matching Flow Diagram

flowchart TD
  A[Next child VNode] --> B{getVNodeId ์กด์žฌ}
  B -->|Yes| C[prev.children ์ค‘ ๋™์ผ ID & ๋ฏธ๋งค์นญ ํ•ญ๋ชฉ]
  C --> D[DOM ์žฌ์‚ฌ์šฉ<br/>effectTag = UPDATE]
  B -->|No| E{transferVNodeIdFromPrev ๊ฒฐ๊ณผ ID}
  E -->|Yes| C
  E -->|No| F{๊ฐ™์€ ์ธ๋ฑ์Šค prev child}
  F -->|Yes, tag ๋™์ผ| D
  F -->|No| G{Host ๊ตฌ์กฐ ๋งค์นญ}
  G -->|Yes| H[prev ์ „์ฒด ์ˆœํšŒ<br/>tagยทclass ๋™์ผ ๋…ธ๋“œ]
  H --> D
  G -->|No| I[์ƒˆ Fiber/DOM ์ƒ์„ฑ<br/>effectTag = PLACEMENT]
  D --> J[Commit Phase์—์„œ ๊ธฐ์กด DOM ์œ„์น˜๋ณด์ •]
  I --> K[Commit Phase์—์„œ ์ƒˆ DOM ์‚ฝ์ž…]
  J --> L[removeStaleChildren๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ prev DOM ์ œ๊ฑฐ]
  K --> L
Loading

์œ„ ๋‹ค์ด์–ด๊ทธ๋žจ์€ Render Phase์™€ Commit Phase ๊ฐ„์˜ ์—ญํ•  ๋ถ„๋ฆฌ๋ฅผ ์‹œ๊ฐํ™”ํ•œ๋‹ค. Render Phase๋Š” ๋งค์นญ ๊ฒฝ๋กœ๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  fiber.effectTag๋งŒ ์„ค์ •ํ•˜๋ฉฐ, Commit Phase๋Š” effectTag์— ๋”ฐ๋ผ DOM์„ ์‚ฝ์ž…ํ•˜๊ฑฐ๋‚˜ ์žฌ๋ฐฐ์น˜ํ•œ ๋’ค ๋‚จ์€ prev DOM์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ œ๊ฑฐํ•œ๋‹ค.

11. Mount / Update / Unmount Timing

Render Phase์—์„œ๋Š” ์˜ค์ง diff ๊ณ„์‚ฐ๊ณผ effectTag ์ง€์ •๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ์–ด๋–ค DOM ์กฐ์ž‘๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค. Mount, Update, Unmount๋Š” ๋ชจ๋‘ Commit Phase์—์„œ effectTag๋ณ„๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค.

effectTag ์‹œ์  ์‹คํ–‰ ํ•จ์ˆ˜ ์ˆ˜ํ–‰ ์ž‘์—…
PLACEMENT Commit Phase์˜ commitFiberNode โ†’ commitPlacement ๊ตฌ๊ฐ„ insertBefore + getHostSibling ์ƒˆ DOM ์‚ฝ์ž…, decorator/portal ํฌํ•จ
UPDATE Commit Phase์˜ commitFiberNode ๋ณธ๋ฌธ dom.updateAttributes, dom.updateStyles, ํ…์ŠคํŠธ ๊ฐฑ์‹ , ์ž์‹ Fiber parent ๊ฐฑ์‹  ๊ธฐ์กด DOM ์œ ์ง€ํ•œ ์ฑ„ ์†์„ฑยท์Šคํƒ€์ผยทํ…์ŠคํŠธ diff ๋ฐ˜์˜
DELETION Commit Phase์˜ commitFiberNode (vnode ์—†์Œ) + ๋ถ€๋ชจ removeStaleChildren components.unmountComponent, removeChild prev DOM ์ œ๊ฑฐ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ, primitive text ํฌํ•จ

11-1. Lifecycle Diagram

sequenceDiagram
  participant Scheduler as FiberScheduler
  participant Render as Render Phase<br/>(renderFiberNode)
  participant Commit as Commit Phase<br/>(commitFiberTree)
  participant DOM as ์‹ค์ œ DOM
  participant Components as ComponentManager

  Note over Scheduler: reconcileWithFiber ์‹œ์ž‘
  Scheduler->>Scheduler: scheduleWork(rootFiber)
  Scheduler->>Render: performUnitOfWork<br/>(Fiber DFS ์ˆœํšŒ)
  
  loop Render Phase (๊ฐ Fiber ๋…ธ๋“œ)
    Render->>Render: transferVNodeIdFromPrev
    Render->>Render: generateVNodeIdIfNeeded
    Render->>Render: ํƒ€์ž… ๋น„๊ต (prevType vs nextType)
    Render->>Render: effectTag ๊ฒฐ์ •<br/>(PLACEMENT/UPDATE)
    alt prevVNode.meta.domElement ์กด์žฌ & ํƒ€์ž… ๋™์ผ
      Render->>Render: ๊ธฐ์กด DOM ์žฌ์‚ฌ์šฉ
    else ์ƒˆ DOM ์ƒ์„ฑ ํ•„์š”
      Render->>Render: createTextNode ๋˜๋Š”<br/>createSimpleElement
      Render->>Render: attrs ์„ค์ • (DOM์— ์ €์žฅ)
    end
    Render->>Render: vnode.meta.domElement ์ €์žฅ
    Render->>Render: fiber.domElement ์ €์žฅ
    Note over Render: DOM ์กฐ์ž‘ ์—†์Œ<br/>(์ƒ์„ฑ๋งŒ)
  end
  
  Scheduler->>Scheduler: Render Phase ์™„๋ฃŒ
  Scheduler->>Commit: onCompleteCallback<br/>(commitFiberTree ํ˜ธ์ถœ)
  
  loop Commit Phase (๊ฐ Fiber ๋…ธ๋“œ)
    Commit->>Commit: commitFiberNode (DFS ์ˆœํšŒ)
    alt effectTag = PLACEMENT
      Commit->>Commit: getHostSibling (referenceNode ์ฐพ๊ธฐ)
      Commit->>DOM: insertBefore (DOM ์‚ฝ์ž…)
      Note over Commit,DOM: mount (DOM์— ์ถ”๊ฐ€)
    else effectTag = UPDATE
      Commit->>DOM: updateAttributes (diff ์ ์šฉ)
      Commit->>DOM: updateStyles (diff ์ ์šฉ)
      alt Text ๋…ธ๋“œ
        Commit->>DOM: textContent ์—…๋ฐ์ดํŠธ
      end
      Note over Commit,DOM: update (์†์„ฑ/์Šคํƒ€์ผ/ํ…์ŠคํŠธ ๊ฐฑ์‹ )
    else effectTag = DELETION
      Commit->>Components: unmountComponent
      Commit->>DOM: removeChild
      Note over Commit,DOM: unmount (DOM ์ œ๊ฑฐ)
    end
  end
  
  Commit->>Commit: processPrimitiveTextChildren<br/>(primitive text ์ฒ˜๋ฆฌ)
  Commit->>DOM: removeStaleChildren<br/>(์‚ฌ์šฉ๋˜์ง€ ์•Š์€ DOM ์ œ๊ฑฐ)
  Commit->>Components: unmountComponent<br/>(stale ์ปดํฌ๋„ŒํŠธ ์–ธ๋งˆ์šดํŠธ)
Loading

์œ„ ์‹œํ€€์Šค๋Š” FiberScheduler๊ฐ€ Render Phase๋ฅผ ์Šค์ผ€์ค„๋งํ•˜๊ณ , Render Phase๊ฐ€ effectTag๋งŒ ๊ณ„์‚ฐํ•˜๋ฉฐ, Commit Phase๊ฐ€ mount/update/unmount๋ฅผ ์‹ค์ œ DOM์— ์ ์šฉํ•˜๋Š” ์ „์ฒด ํ๋ฆ„์„ ๋ณด์—ฌ์ค€๋‹ค.

์ฃผ์š” ํฌ์ธํŠธ:

  • FiberScheduler: reconcileWithFiber์—์„œ ์ƒ์„ฑ๋˜์–ด Render Phase๋ฅผ ๋น„๋™๊ธฐ๋กœ ์Šค์ผ€์ค„๋ง (ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ๋™๊ธฐ ๋ชจ๋“œ)
  • Render Phase: DOM ์ƒ์„ฑ๋งŒ ์ˆ˜ํ–‰ํ•˜๊ณ  ์‚ฝ์ž…/์ˆ˜์ •์€ ํ•˜์ง€ ์•Š์Œ. mountComponent/updateComponent๋Š” ํ˜ธ์ถœํ•˜์ง€ ์•Š์Œ (ํ–ฅํ›„ ์ถ”๊ฐ€ ์˜ˆ์ •)
  • Commit Phase: effectTag์— ๋”ฐ๋ผ ์‹ค์ œ DOM ์กฐ์ž‘ ์ˆ˜ํ–‰. unmountComponent๋งŒ ํ˜ธ์ถœ (์‚ญ์ œ ์‹œ)

11-2. Component Lifecycle (ํ–ฅํ›„ ๊ตฌํ˜„ ์˜ˆ์ •)

ํ˜„์žฌ Fiber reconciler์—์„œ๋Š” mountComponent/updateComponent๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ธฐ์กด reconciler์˜ ๋™์ž‘์„ ์ฐธ๊ณ ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„๋  ์˜ˆ์ •์ด๋‹ค:

mountComponent ํ˜ธ์ถœ ์‹œ์ :

  • createHostElement์—์„œ ์ƒˆ Host element ์ƒ์„ฑ ํ›„ (๊ธฐ์กด reconciler)
  • Fiber reconciler์—์„œ๋Š” commitFiberNode์˜ PLACEMENT ๊ตฌ๊ฐ„์—์„œ ํ˜ธ์ถœ ์˜ˆ์ •

updateComponent ํ˜ธ์ถœ ์‹œ์ :

  • updateHostElement์—์„œ ๊ธฐ์กด Host element ์—…๋ฐ์ดํŠธ ์‹œ (๊ธฐ์กด reconciler)
  • Fiber reconciler์—์„œ๋Š” commitFiberNode์˜ UPDATE ๊ตฌ๊ฐ„์—์„œ ํ˜ธ์ถœ ์˜ˆ์ •
  • ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌ๋˜๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ:
    components.updateComponent(prevVNode, nextVNode, host, context);
    // ๋‚ด๋ถ€์—์„œ ๋‹ค์Œ ํ•ญ๋ชฉ๋“ค์ด ์—…๋ฐ์ดํŠธ๋จ:
    // - instance.props = nextSanitizedProps (prevVNode.props์™€ diff)
    // - instance.model = nextModelData (prevVNode.model๊ณผ diff)
    // - instance.decorators = nextDecorators (prevVNode.decorators์™€ diff)
    // - instance.vnode = nextVNode
    // - component.update(host, prevVNode.props, nextVNode.props) (props ๋ณ€๊ฒฝ ์‹œ)

unmountComponent ํ˜ธ์ถœ ์‹œ์ :

  • commitFiberNode์—์„œ effectTag === 'DELETION'์ผ ๋•Œ
  • removeStaleChildren์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์ปดํฌ๋„ŒํŠธ ์ œ๊ฑฐ ์‹œ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment