티스토리 뷰
1. 기본적인 DOM과 WB의 Rendering 과정
: Rander Tree = DOM Tree + CSSOM Tree
1.1 첫 방문 -> WB의 Rendering 과정
- 페이지 방문-> HTML 파일 로드
- WB의 렌더링 엔진 -> HTML 파싱 및 DOM 트리 생성
- (2)에서 CSS파일을 만나면 CSS 파일 로드 및 WB 렌더링 엔진을 통한 CSSOM 트리 생성
- WB는 DOM트리의 노드 순회 -> 사용자의 현재 페이지의 구성 노드만 방문(display:none 같은 안보이는 건 방문 X)
- 방문한 노드에 대한 CSSOM 노드 탐색 및 CSS적용
- layout( or reflow) : 각 노드가 화면 어느 좌표에 나타는지 계산하는 과정 -> 반드시 이후에 페인트를 함
- painting : 레이아웃 단계를 거친 노드에 색, 형태 등의 실제 모습을 적용
1.2 슬픈 점...
- 문제가 되는 상황
1) 하나의 이벤트가 다수의 DOM을 변경
2) 변경이 잦은 페이지의 경우
-> 필요한거만 한번에 바꾸고 싶은데..!!
: 사용자와 상호작용하는 경우에 레이아웃과 리페인팅을 다시금 호출 -> 위의 방법은 하위의 모든 자식이 리렌더링
: SPA에서 리렌더링은 자주 일어남 -> 화면은 부드럽지만 DOM관리 부담 증가
2. VDOM과 React Fiber
2.1 VDOM
: 리액트가 관리하는 가상의 DOM - JSON 형태임을 유의
: 상태 변경 시, 표시해야할 DOM을 메모리에 저장 -> react-dom에서 준비가 완료되었을 때, WB에 한번에 반영
-> 반복적인 렌더링에 대해 렌더링 과정 최소화 및 부담 완화
2.2 React Fiber
: 이전의 스택기반 조정 알고리즘의 동기식 처리의 문제를 해결하기 위해 등장
: 리액트 안의 파이버 재조정자(fiber reconciler)가 관리하는 JS객체
: 모든 작업은 비동기로 진행
역할 | 1) 작업을 작은 단위로 분할-> 우선순위 랭크 2) 해당 작업은 정지 및 재시작 가능 3) 이전 작업 재사용 또는 폐기 가능 |
구현 | Render Phase | - 사용자에게 노출되지 않는 비동기 작업 수행 - 해당 단계에서, 파이버의 작업, 우선 순위 지정, 중지, 폐기 진행 - 모두 처리 완료 시, finishedWork() 호출 |
commit Phase | - DOM에 실제 변경 사항을 반영하기 위한 작업 - commitWork()가 실행 - 동기적 작업 처리, 작업 중 중단 x |
- 파이버 재조정자(fiber reconciler)
1) 파이버 관리
2) VDOM과 DOM의 변경 사항을 비교 및 수집 -> 갱신이 있을 경우 파이버를 기준으로 렌더링 요청 - 재조정(reconciliation)
: VDOM과 DOM을 비교하여 어떤 노드를 렌더링해야하는지 추적하는 과정
2.3 React Fiber Tree
- 구성(2개의 트리로 구성)
- 현재 DOM의 모습을 담은 트리(current)
- 작업 중인 상태인 workinProgress 트리 - 더블 버퍼링
: 파이버의 작업 완료 후, 실제 DOM 트리를 가리키는 포인터를 workinProgress 트리로 전환
: 커밋 단계에서 수행
2.4 fiber 작업 순서 정리
- 업데이트 요청
: 상태나 속성의 변경을 통해 React에 업데이트 요청
: 해당 상태에 종속된 노드를 추적 및 리렌더링 준비 ( => 즉, 상태 변화에 따라 리렌더링 발생 여부 결정) - work in progress
: beginWork() 호출 -> 파이버 작업 시작 -> 작업 후 completeWork()를 호출하여 작업 완료를 알림
: 작업을 반영한 VDOM Tree인 workinProgress Tree 생성 및 렌더링 작업 진행
: 순서에 따른 깊이 탐색을 통해 형제 노드를 확인함 - Reconciliation
: current 트리와 workinProgress 트리 비교 -> 차이에 대한 최소한의 변경 사항만 업데이트
: VDOM의 경우, JS객체 형태로 변환되어 비교
더보기: 비교 완료 후, 변경된 부분만 바꾼 실제 DOM 렌더링을 1번만 트리거(다수의 리렌더를 "배치"를 통해 하나로 압축)=> JSX → JS → JSON : JSX 는 컴파일 시 Babel 통해 JS 로 변환, 런타임에서는 JSON 으로 변환
// jsx pragma(jsx 컴파일 옵션): React.createElement 대신에 h를 사용하라고 Babel에게 전달 /** @jsx h */ const a = ( <ul className="list"> <li>item 1</li> <li>item 2</li> </ul> ); // 위의 코드를 Babel이 아래와 같이 변환 const a = ( h('ul', { className: 'list' }, h('li', {}, 'item 1'), h('li', {}, 'item 2'), ); ); // h함수(직접 생성한 헬퍼 함수)를 실행하면 JSON(Virtual DOM 표현)가 반환됨 const a = ( { type: 'ul', props: { className: 'list' }, children: [ { type: 'li', props: {}, children: ['item 1'] }, { type: 'li', props: {}, children: ['item 2'] } ] } );
- 작업 완료
: finishedWork() 호출을 통해 변경된 사항이 준비 되었음을 알림 - 커밋 준비(Commit Phase)
: 위의 결과를 바탕으로 최소화된 DOM 업데이트 준비 및 업데이트 - (Re)Paint : Web Browser Rendering
: 최종 결과를 반영 - WB 리렌더
: Painting (Web Browser Rendering) - React 는 제어권을 브라우저에게 위임하고 Paint 작업 진행
: Cleanup useEffect → Run useEffect : 비동기 수행더보기useEffect에서의 cleanUp은 중복된 이벤트 등록을 막기 위해 이전에 등록된 것을 한번 초기화
- 웹 브라우저 렌더 순서 : Render Tree(DOM + CSSOM) → Layout(Reflow) → Paint(Repaint)
- Side-Effect Hook 고려 시 : Render Tree → Layout → useLayoutEffect → Paint → useEffect
- Paint 이전에 동기적으로 수행되는 useLayoutEffect : 웹페이지가 보이기까지의 시간을 지연
- Paint 직후에 비동기적으로 수행되는 useEffect
- 깨알 결론 : 응애....아기 이런거 몰라
- 깨알 단어 사전
- DOM
: Document Object Model
: 웹 페이지에 대한 인터페이스
: WB가 웹 페이지의 콘텐츠와 구조를 어떻게 버여줄지에 대한 정보를 담고 있음
참조
ASAC
모던 리액트 Deep Dive
https://amadaclub.tistory.com/42
[React Core Deep Dive] How does React re-render internally?
다음은 리액트가 리렌더링 될 때 어떤 과정이 일어나는 지에 대한 내용이다. 우선 직역을 해보자React가 초기 마운트를 수행하고 전체 DOM을 처음부터 생성하는 방법에 대해 설명했습니다. 초기
amadaclub.tistory.com
'정리용 > react' 카테고리의 다른 글
[07-React] 6-1. React Hook :: useState (0) | 2025.01.15 |
---|---|
[07-React] 5. React 초기 설정 - vite 기준 (0) | 2025.01.15 |
[07-React] 2-1. React 문법 JSX (0) | 2025.01.14 |
[07-React] 3. 클래스 컴포넌트 개념 (0) | 2025.01.14 |
[07-React] 2. React 문법 기초 및 바인딩 (0) | 2025.01.14 |
- Total
- Today
- Yesterday
- useCallback
- useMemo
- Nginx
- acac
- useRef
- ssh
- git
- useLayoutEffect
- ASAC
- useContext
- react
- useReducer
- asac#asac7기
- useState
- useEffect
- acas#acas7기
- asac7
- asac7기
- asac7#asac
- memo
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |