notion link
https://silver-blue-23c.notion.site/React18-0d46d803f3be437dbe7f90348dbecd09
React18
React 18의 알파 버전이 출시
* 바로 막 쓰기엔 무리일듯
자동 배치(Automatic Batching)가 도입되어 배치가 개선
배치 : React가 더 나은 성능을 위해 여러 개의 state 업데이트를 하나의 리렌더링 (re-render)로 묶는 것을 의미)
React 18의 createRoot를 통해, 모든 업데이트들은 어디서 왔는가와 무관하게 자동으로 배칭되게 된다.
이 뜻은, 추가적으로 timeout, promise, native 이벤트 핸들러와 모든 여타 이벤트는 React에서 제공하는 이벤트와 동일하게 state 업데이트를 배칭할 수 있다. 이를 통해 우리는 렌더링을 최소화하고, 나아가 애플리케이션에서 더 나은 성능을 기대한다.
상태 업데이트에 배치가 적용되지 않았으면 하는 경우엔 새롭게 추가된ReactDOM.flushSync함수를 사용
useTransition
React 17 까지는 상태 업데이트를 긴급 혹은 전환으로 명시하는 방법 X
모든 상태 업데이트는 긴급 업데이트 → setTimeout이나 throttle, debounce 등의 테크닉을 써서 긴급 업데이트 방해를 우회하는 것이 최선이였다
useTransition을 쓰면
일부 상태 업데이트를 긴급하지 않은 것 (not urgent)로 표시
이것으로 표시되지 않은 상태 업데이트는 긴급한 것으로 간주
긴급한 상태 업데이트 (input text 등)가 긴급하지 않은 상태 업데이트 (검색 결과 목록 렌더링)을 중단할 수 있다.
쓰는 이유 : 느린 렌더링 & 느린 네트워크
업데이트를 긴급한 것과 긴급하지 않은 것으로 나누어 개발자에게 렌더링 성능을 튜닝하는데 많은 자유를 주었다고 볼 수 있다.
useId
useId는 클라이언트와 서버간의 hydration의 mismatch를 피하면서 유니크 아이디를 생성할 수 있는 새로운 훅이다. 이는 주로 고유한 id가 필요한 접근성 API와 사용되는 컴포넌트에 유용할 것으로 기대
useDeferredValue
useDeferredValue를 사용하면, 트리에서 급하지 않은 부분의 재렌더링을 지연
지연된 렌더링을 인터럽트하고 사용자 입력을 차단할때 사용
이는 debounce와 비슷하지만, 몇가지 더 장점이 있다.
지연된 렌더링은 인터럽트가 가능하며, 사용자 입력을 차단하지 않는다.
***** 아래는 Library author들에게 권장하는 hook들*****
(아직 어디에 쓰는진 잘..? library 제작자한테 추천한다고 한다 특히 useSyncExternalStore)
useSyncExternalStore
스토어에 대한 업데이트를 강제로 동기화 하여 외부 스토어가 concurrent read를 지원할 수 있도록 하는 새로운 훅
**useEffect**가 필요하지 않고, 이는 리액트 외부 상태와 통합되는 모든 라이브러리에 권장된다.
용어 설명 :
- External Store: 외부 스토어라는 것은 우리가 subscribe하는 무언가를 의미한다. 예를 들어 리덕스 스토어, 글로벌 변수, dom 상태 등이 될 수 있다.
- Internal Store: props context useState useReducer 등 리액트가 관리하는 상태를 의미한다.
- Tearing: 시각적인 비일치를 의미한다. 예를 들어, 하나의 상태에 대해 UI가 여러 상태로 보여지고 있는, (= 각 컴포넌트 별로 업데이트 속도가 달라서 발생하는) UI가 찢어진 상태를 의미한다.
**useExternalStore**는 리액트 18에서 스토어 내 데이터를 올바르게 가져올 수 있도록 도와준다.
useInsertionEffect
css-in-js 라이브러리가 렌더링 도중에 스타일을 삽입할 때 성능 문제를 해결할 수 있는 새로운 훅
The signature is identical to useEffect, but it fires synchronously before all DOM mutations.
리액트가 DOM을 변환한경우, 레이아웃에서 무언가를 읽기전 (**clientWidth**와 같이) 또는 페인트를 위해 브라우저에 값을 전달하기 전에 DOM에 대한 다른 변경과 동일한 타이밍에 작업을 하면 된다.
→ We must ensure to manipulate the CSS rules at the same time as other changes to the DOM. It can be when React mutates the DOM, before anything is read from the layout and before the content is visible in the browser.
useLayoutEffect 과 비슷,
hook is used to read the layout from the DOM and synchronously re-render.
순서 UseInsertionEffect → useLayoutEffect → useEffect
this hook does not have access to refs and cannot schedule updates.
선택적(Selective) Hydartion 등의 동시성(Concurrent) 기능이 추가
이 파트는 알아두면 좋을듯
새로운 서버 사이드 렌더링 아키텍처가 도입(<Suspense>와 React.lazy를 지원)
및 부분 SSR 지원
React 18에는 렌더링을 위한 3가지 API가 존재
- renderToString: 유지 (제한된 Suspense 지원)
- renderToNodeStream: Deprecated (Full Suspense를 지원하나, 스트리밍되지 않음)
- pipeToNodeWritable: 신규 API, 사용 추천(스트리밍으로 Full Suspense) 지원
ref
https://medium.com/naver-place-dev/react-18을-준비하세요-8603c36ddb25
https://yceffort.kr/2022/04/react-18-changelog#starttransition-usetransition
'Front-end > React' 카테고리의 다른 글
Suspense를 위한 wrapper 만들기 (0) | 2022.07.28 |
---|---|
react 17(개인 공부용) (1) | 2022.06.09 |
react TMI (0) | 2022.04.13 |
drag and drop으로 창 크기 조절 (0) | 2022.03.18 |
redux, redux-saga로 로딩, 에러 페이지 구현 (0) | 2022.02.12 |