지난 포스팅에서 React Fiber란 무엇인지, 그 도입 배경과 Fiber를 통한 Reconciliation을 Render와 Commit 두 단계에 걸쳐서 알아보았다. 이를 통해 Fiber가 call Stack의 종속성으로부터 벗어나 React가 브라우저와 함께 작업들을 스케줄링할 수 있도록 하기 위해 도입 되었음을 알게 되었다.
이번 포스팅에서는 Fiber를 이용한 스케줄링에서 작업들의 우선순위를 어떻게 선정하고 스케줄링하는지를 알아보려한다.
https://www.youtube.com/watch?v=ZCuYPiUIONs&t=1517s
React Conf 17과 React의 Contributor Toru Kobayashi의 포스팅에 따르면 React는 각 업데이트나 작업의 성격을 파악해 적절한 우선순위를 할당한다.
할당하는 우선 순위 라벨은 다음과 같이 enum으로 정의되어 있다.
ReactPriorityLevel {
NoWork: 0,
SynchronousPriority: 1,
AnimationPriority: 2,
HighPriority: 3,
LowPriority: 4,
OffscreenPriority: 5,
};
// No work is pending.
// For controlled text inputs. Synchronous side-effects.
// Needs to complete before the next frame.
// Interaction that needs to complete pretty soon to feel responsive.
// Data fetching, or result from updating stores.
// Won't be visible but do the work in case it becomes visible.
그러나 내가 참고했던 자료들이 17년, 18년도 자료여서 그런지는 몰라도, 실제 18 버전의 현 React 코드를 열어보았을 때는 같은 개념이 조금 다른 형태로 구성되어 있었다.
React는 React element를 Fiber 노드로 만드는 과정에서 위의 우선순위를 할당하는데, Fiber 노드 내의 비트 필드인lanes
, childlLanes
속성이 이에 관여한다. 해당 속성들은 우선순위 정보를 인코딩하는 데 사용된다.