์ฃผ์š” ์ž‘์—…

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ๊ฐ€์ƒDOM์„ ์œ„ํ•œ ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
      • React.createElement โ†’ ReactDOM.render โ†’ React.createFiberFromElement
      • React.createElement(element์— ๋Œ€ํ•œ ๊ฐ€์ƒ DOM) ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
      • ReactDOM.render(element์— ๋Œ€ํ•ด์„œ html element๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋Š” ๋ชจ๋“ˆ) ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„
      • React.createFiberFromElement(ReactDOM.render์—์„œ ๋ Œ๋”๋ง์„ ์œ„ํ•œ ํŒŒ์ด๋ฒ„ ๊ฐ์ฒด) ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • Virtual DOM๊ณผ React Fiber
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜

๊ณ ๋ฏผ ๋ฐ ํ•ด๊ฒฐ๊ณผ์ •

React์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•œ createElement์™€ Fiber๊ฐ์ฒด ์„ค๊ณ„ ๋ฐ ๊ตฌํ˜„

React๋Š” ๊ธฐ์กด์— createElement๋ฅผ ํ†ตํ•ด ๊ฐ Element์— ๋Œ€ํ•œ ์ •๋ณด๋“ค์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฐ์ฒด๊ฐ€ ReactDOM.render์— ๋ฐ”๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ReactDOM.renderํ•จ์ˆ˜ ์•ˆ์—์„œ ํŒŒ์ด๋ฒ„๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ํŒŒ์ด๋ฒ„๋ฅผ ์ฐธ์กฐํ•˜์—ฌ tree๋ฅผ ๋งŒ๋“  ํ›„์— ๊ธฐ์กด์˜ root fiber์™€ ๋น„๊ตํ•˜์—ฌ reconciliation ๊ณผ์ •์„ ๊ฑฐ์ณ ์ƒˆ๋กญ๊ฒŒ ์—…๋ฐ์ดํŠธ๋œ DOM์„ ๋ Œ๋”๋ง ํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๊ตฌํ˜„ํ•˜๊ธฐ์— ์•ž์„œ์„œ, ํ•จ์ˆ˜ํ˜•์œผ๋กœ ๋˜์–ด์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ jsx๋ณ€ํ™˜์ด ์ด๋ฃจ์–ด์ง€๋Š”์ง€์™€ ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค.

/** @jsx mhreact.createElement */
 
import mhreact from "mhreact";
export function Test() {
  return <div>์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ</div>;
}
 
//ํŠธ๋žœ์ŠคํŒŒ์ผ๋ง
...
 
/** @jsx mhreact.createElement */
 
import mhreact from "mhreact";
export function Test() {
  return mhreact.createElement(
    "div",
    null,
    "\uCEF4\uD3EC\uB10C\uD2B8 \uD14C\uC2A4\uD2B8"
  );
}

์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“  ํ›„ ์ ์šฉ์‹œ์ผœ ๋ณด์•˜๋‹ค.

{
  type: 'div',
  props: { id: 'app', className: 'wow' },
  children: [
    { type: [Function: Test], props: null, children: [] },
    { type: 'p', props: null, children: [Array] },
    { type: 'div', props: null, children: [Array] }
  ]
}

ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ด๋ ‡๊ฒŒ ์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„ฃ์—ˆ์„ ๊ฒฝ์šฐ, type์—๋Š” function์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ type์— ํ•จ์ˆ˜๊ฐ€ ์˜ค๊ฒŒ ๋œ๋‹ค๋ฉด children์— ์™€์•ผ ํ•  ์•ˆ์ชฝ ์ž์‹๋“ค์€ ์•„๋ฌด๊ฒƒ๋„ ์˜ค์ง€ ์•Š์•˜๋‹ค.

mhreact.createElement(Test, null),

์ปค์Šคํ…€ ์ปดํฌ๋„ŒํŠธ๋ฅผ importํ•ด์™€์„œ ์‚ฌ์šฉํ•œ ๊ณณ์—๋Š” ํ•จ์ˆ˜ ๊ทธ ์ž์ฒด๊ฐ€ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด ํ•จ์ˆ˜๋ฅผ ํ’€์–ด์„œ createElement์ชฝ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

{
        type: 'div',
        props: { id: 'app', className: 'wow' },
        children: [
          { type: [Function: Test], props: null, children: [] },
          { type: 'p', props: null, children: [Array] },
          { type: 'div', props: null, children: [Array] }
        ]
      }
export function createElement(type, props, ...children) {
  if (typeof type === "function") {
    return type();
  }
  return new MhElement(type, props, children);
}
 
export function MhElement(type, props, children) {
  this.type = type;
  this.props = props;
  this.children = children;
}
 

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜ํ˜•๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋”ฐ๋กœ ํ•จ์ˆ˜๋ฅผ ๋ฏธ๋ฆฌ ์‹คํ–‰์‹œ์ผœ๋†“๊ณ  createElement์˜ ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜ค๋Š” ๊ฐ’์ด children๊ณผ ๊ฐ™์€ ์•Œ๋งž์€ ์œ„์น˜์— ๊ฐ™์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ Element๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ฐ์ฒดํ™”์‹œ์ผฐ๋‹ค.

export function FiberNode(type, key = null) {
  this.type = type;
  this.key = key;
  this.state = null;
  this.textNode = null;
  this.props = null;
  this.index = null;
 
  //fibers
  this.child = null;
  this.sibling = null;
  this.return = null;
}

์ด๋ฅผ ํ†ตํ•ด Fiber ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋กœ์ง๊ณผ Fiber ๊ฐ์ฒด ์ž์ฒด ๋˜ํ•œ ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•ด์ฃผ์—ˆ๋‹ค. ์ดˆ๊นƒ๊ฐ’์ด ๋Œ€๋ถ€๋ถ„ null๋กœ ๋˜์–ด์žˆ๋Š” ์ด์œ ๋Š” MhElement ๊ฐ์ฒด์— ๋Œ€ํ•ด ์žฌ๊ท€์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ Fiber๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ๊ทธ๋•Œ๊ทธ๋•Œ๋งˆ๋‹ค element๋ฅผ ๋ณด๊ณ  ๊ฐ์ฒด๋ฅผ ์—…๋ฐ์ดํŠธ์‹œ์ผœ์ฃผ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฆฌ๋ทฐ ์š”์ฒญ

์•ˆ๋…•ํ•˜์„ธ์š”. ๋ฉ˜ํ† ๋‹˜. ๊ณ ์ƒ ๋งŽ์œผ์‹ญ๋‹ˆ๋‹ค! ์ด๋ฒˆ ๋ฆฌ๋ทฐ์—์„œ๋Š” ์•„์ง ํ•™์Šตํ•  ๊ฒƒ๋“ค์ด ๋งŽ์•„ ํ•™์Šต์— ๋งŽ์€ ์‹œ๊ฐ„์„ ์Ÿ์€ ํƒ“์— ๋งŽ์ด ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค,, ๋‹ค์Œ ๋ฆฌ๋ทฐ์—์„œ๋Š” ๋ณด๋‹ค ์งˆ๋ฌธ์„ ์ •๋ฆฌํ•ด์„œ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค! ํŽธํ•˜๊ฒŒ ๋ด์ฃผ์‹œ๊ณ  ์ „์ฒด์ ์ธ ํ”ผ๋“œ๋ฐฑ๋งŒ ํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค :)