React Element, virtual Dom

May 20th 2020 by jyoon
  • 리액트 요소는 리액트 UI를 표현하는 수단
  • 우리는 JSX문법을 사용하기 대문에 리액트 요소의 존재를 잘 모름

    • 하지만 리액트 요소를 이해하면 리액트가 내부적으로 어떻게 동작하는지 알 수 있다.

매커니즘

  • 리액트 렌더링성능르 위해 '가상 돔'을 활용한다.
  • 브라우저에서 돔을 변경하는 것은 비교적 오래 걸리는 작업

    • 따라서 빠른 렌더링을 위해서 돔변경을 최소화 해야 한다.
  • 그래서 리액트는 리액트 요소로부터 가상돔을 만들어 메모리에 올려 놓고 이전과 이후의 가상 돔을 비교해서 변경된 부분만 실제 돔에 반영하는 전략을 채택

리액트 요소가 돔 요소로 만들어지는 과정

  • 간략단계

    • JSX → [babel] → createElement함수호출결과 code → 리액트 요소 → [렌더링 단계] → 가상돔 → [커밋단계] → 실제 돔 변경
  • 하나의 화면을 표현하기 위해 여러개의 리액트 요소가 트리 구조로 구성
  • 리액트에서 데이터 변경에 의한 화면 업데이트는 '렌더단계(render phase)', '커밋단계(commit phase)'를 거친다

    • 단계별 설명

      • 렌더단계

        • 실제 돔에 반영할 변경 사항을 파악하는 단계
        • ReactDom.render 함수와 setState 메서드에 의해서 시작된다.
      • 커밋단계

        • 파악된 변경사항을 실제 돔에 반영하는 단계
    • 변경 사항을 파악하기 위해 '가상 돔'을 이용한다.
  • 과정 정리

    • ReactDOM.render 함수가 호출되고 최초의 렌더 단계가 실행

      • 가상 돔이 실제 돔으로 만들어 졌다.
      • 클래스형 컴포넌트는 인스턴스로 만들어지고 리액트 내부에서 관리된다.
    • 만약 상탯값이 변견되면 두번째 렌더가 실행되고 새로운 가상 돔이 만들어진다.

      • 이때 이전 가상 돔과 비교해 변경된 부분만 돔에 반영
  • 리액트 요소는 파이버(fiber)라는 구조체로 변환

    • 리액트16부터 도입된 구조체
    • 파이버도 리액트 요소와 같이 type,props 속성값을 갖는다.
    • 바이버로 동작할 때도 모든 type 속성값이 문자열이 될 때까지 연산한다