공청
개발하는 금융인
공청
전체 방문자
오늘
어제
  • 분류 전체보기 (102)
    • 개인적인 이야기 (27)
    • IT에 관한 글 (15)
    • 경제, 금융 (12)
    • Python (2)
    • Javascript (6)
    • golang (2)
    • 비전공자를 위한 IT 지식 (0)
    • SQL (SQLD,SQLP) (1)
    • React (Front-end) (29)
    • 정보처리기사 (0)
    • Typescript (4)
    • (study) 모던 자바스크립트 Deep Dive (0)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 방명록
  • 글쓰기

공지사항

인기 글

태그

  • 언섹시비즈니스
  • next.js
  • 기술스택
  • 짧은생각
  • vite
  • approute
  • 트래블카드
  • WSGI
  • 인터넷
  • Fira Code
  • typescript
  • 미국주식
  • 웹개발
  • python
  • sql
  • vscode
  • Golang
  • Effective Typescript
  • 트래블월렛
  • react-router
  • HTTP
  • go
  • react
  • useref
  • ChatGPT
  • 조건부렌더링
  • 일기
  • 프로그래밍
  • javascript
  • 창업

최근 댓글

최근 글

티스토리

반응형
공청

개발하는 금융인

(React 만들기) 08. virtual DOM (가상 DOM - 문서 객체 모델)
React (Front-end)

(React 만들기) 08. virtual DOM (가상 DOM - 문서 객체 모델)

2022. 12. 18. 17:04

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

"블로그 내의 광고와 쿠팡 링크를 클릭해주시면 블로그 운영에 큰 힘이 됩니다."

반응형

1. 가상 돔

개발자들이 DOM을 직접 건드리지 않고 훨씬 더 쉬운 구조물로 UI를 개발할 수 있도록 중간에 DOM처리는 리액트에게 맡기고 개발자는 JSX만 개발하면 될 수 있도록 하는 것.

 

리액트는 실제 DOM과 메모리 상에 쌓아둔 가상 DOM을 비교해서 다른 것만 비교하여 특정 부분을 변경한다.

 

export class Component {
  constructor(props) {
    this.props = props;
  }
}

export function createDOM(node) {
  if (typeof node === 'string') {
    return document.createTextNode(node);
  }

  const element = document.createElement(node.tag);

  Object.entries(node.props)
    .forEach(([name, value]) => element.setAttribute(name, value));

  node.children
    .map(createDOM)
    .forEach(element.appendChild.bind(element));

  return element;
}

function makeProps(props, children) {
  return {
    ...props,
    children: children.length === 1 ? children[0] : children,
  };
}

export function createElement(tag, props, ...children) {
  props = props || {};
  
  if (typeof tag === 'function') {
    if (tag.prototype instanceof Component) {
      const instance = new tag(makeProps(props, children));
      return instance.render();
    } else {
      if (children.length > 0) {
        return tag(makeProps(props, children))
      } else {
        return tag(props);
      }
    }

  } else {
    return { tag, props, children };
  }
}

export function render(vdom, container) {
  container.appendChild(createDOM(vdom));  
}

여기서 가상돔 역할을 하는 것은 createElement 함수의 리턴에 있는 { tag, props, children } 객체로서

이것은 현재 HTML의 형태를 데이터로 가지고 있는 것이다.

 

이 객체의 특징은 트리 구조를 가지고 있다는 것이다.

루트는 하나고 그 아래에는 루트의 자식들로서 단일 객체이며 실제 돔은 createDOM을 통해 생성된다.

 

실제 React 라이브러리는 이것보다 훨씬 더 복잡하게 코드가 구현되어있다.

이런 식으로 가상돔을 구현해두면 좋은 것이 UI가 업데이트할 때 엄청난 장점을 발휘한다.

 

기존에 그려진 DOM과 만들고자하는 DOM이 메모리 상에 있다. 

이 전에 그렸던 가상돔을 메모리에서 가지고 있다가 새로 써야 하는 형태의 가상돔이 오면

그 두 개의 객체를 비교해서 달라진 것만 비교할 수 있다는 것이다. (객체 대 객체로서 비교 가능)

 

이 구조 덕분에 React는 핫한 라이브러리가 되었다.

 

 

대략적으로 DOM을 비교하는 로직을 짜면 이렇게 될 것이다.

export const render = (function() {
  let prevDom = null;

  return function(vdom, container) {
    if (prevDom === null) {
      prevDom = vdom;
    }

    // diff

    container.appendChild(createDOM(vdom));
  }
})();

이런 식으로 diff 부분에서 두 개의 객체를 비교하면 기존에 가지고 있던 DOM과 다른 것만을 구별해낼 수 있을 것이다.

 

 

 

 

2. 참고할만한 글

1. 가상돔을 공부할만한 라이브러리 : snabbdom

https://github.com/snabbdom/snabbdom

 

GitHub - snabbdom/snabbdom: A virtual DOM library with focus on simplicity, modularity, powerful features and performance.

A virtual DOM library with focus on simplicity, modularity, powerful features and performance. - GitHub - snabbdom/snabbdom: A virtual DOM library with focus on simplicity, modularity, powerful fea...

github.com

 

2. virtual-DOM open source library

https://awesomeopensource.com/projects/virtual-dom

 

 

 

끝!

반응형
    'React (Front-end)' 카테고리의 다른 글
    • (React Router) 1. 리액트 라우터 튜토리얼 진행 - Vite를 통한 프로젝트 생성
    • (React 만들기) 09. 리액트 Hook 원리와 제약사항들
    • (React 만들기) 07. 클래스형 컴포넌트
    • React 환경에서 tailwindcss 사용하기
    공청
    공청
    투자, 프로그래밍, IT에 대한 글을 씁니다.

    티스토리툴바