[모던 리액트 딥다이브] 10장 리액트 17 vs 리액트 18

2024. 9. 4. 22:39· FE/리뷰

 

 

리액트 17
  • 점진적인 업그레이드를 지원하기 위한 리액트의 일부 컴포넌트를 다른 버전으로 변경 가능
  • 이벤트 위임 방식의 변경
    • 기존 16에서는 이벤트 위임이 모두 document에서 수행 => 이미 모든 이벤트가 document에 있으므로 e.stopPropatation() 실행이 무색함
    • 17부터는 리액트 컴포넌트 최상단 트리인 루트 요소로 바뀜
  • import 구문 없이도 JSX 변환 가능
    • import React가 필요 없고, 불필요한 import문을 삭제해 번들링 크기를 약간 줄일 수 있음
  • 이벤트 풀링 제거
    • 이벤트 풀링 : SyntheticEvent 풀을 만들어서 이벤트가 발생할 때마다 가져오는 것
    • 이벤트 핸들러 내부에서 이벤트 객체에 접근할 때 비동기든 동기든 상관없이 일관적으로 코딩할 수 있음
  • useEffect 클린업 함수의 비동기 실행
    • 클린업 함수가 동기로 실행되기 때문에 완료되기 전까지 다른 작업을 방해하므로 불필요한 성능 저하로 이어짐
    • 17부터 클린업 함수가 비동기적으로 실행 => 컴포넌트의 커밋 단계가 완료될 때까지 지연됨
  • 컴포넌트의 undefined 반환에 대한 일관적인 에러 처리

 

 

리액트 18
  • 새로운 훅 추가
    • useId
      • 컴포넌트별로 유니크한 값을 생성하는 훅
      • 공통으로 사용하는 컴포넌트여도 서로 인스턴스가 다르면 다른 랜덤한 값을 만들어 냄
    • useTransition
      • UI 변경을 가로막지 않고 상태를 업데이트할 수 있는 리액트 훅
      • 상태 업데이트를 긴급하지 않은 것으로 간주해 무거운 렌더링 작업을 조금 미룰 수 있음
      • 아무것도 인수로 받지 않고 isPending, startTransition이 담긴 배열을 반환함
      • isPending : 상태 업데이트가 진행 중인지를 확인하는 boolean
      • startTransition : 긴급하지 않은 상태 업데이트로 간주할 set 함수를 넣어둘 수 있는 함수를 인수로 받음
      • '동시성'을 다룰 수 있는 새로운 훅
      • 느린 렌더링 과정에서 로딩 화면을 보여주거나 혹은 지금 진행 중인 렌더링을 버리고 새로운 상태값으로 다시 렌더링하는 등의 작업을 할 수 있음
      • 주의할 점
        • startTransition 내부는 반드시 setState와 같은 상태를 업데이트하는 함수와 관련된 작업만 넘길 수 있음
        • startTransition으로 넘겨주는 상태 업데이트는 다른 모든 동기 업데이트로 인해 실행이 지연될 수 있음
        • startTransition으로 넘겨주는 함수는 반드시 동기 함수여야 함
    • useDeferredValue
      • 리액트 컴포넌트 트리에서 리렌더링이 급하지 않은 부분을 지연할 수 있게 도와주는 훅
      • 디바운스와 비슷하지만 고정된 지연 시간 없이 첫 번째 렌더링이 완료된 이후에 useDeferredValue로 지연된 렌더링을 수행함
      • 지연된 렌더링은 중단할 수 있고, 사용자의 인터렉션을 차단하지도 않음
    • useSyncExternalStore
      • useSubscription의 대체 훅
      • 리액트 외부 데이터 소스에 리액트에서 추구하는 동시성 처리가 추가돼 있지 않다면 테어링 현상이 발생할 수 있고, 이를 해결하기 위한 훅
      • 첫 번째 인수는 subscribe로 콜백 함수를 받아 스토어에 등록하는 용도로 사용
      • 두 번째 인수는 컴포넌트에 필요한 현재 스토어의 데이터를 반환하는 함수
      • 마지막 인수는 옵셔널 값으로, 서버 사이드 렌더링 시에 내부 리액트를 하이드레이션하는 도중에만 사용됨
      • 외부 데이터 값의 변경 여부를 확인해 리렌더링을 발생시킬 수 있음
    • useInsertionEffect
      • CSS-in-js 라이브러리를 위한 훅
      • DOM이 실제로 변경되기 전에 동기적으로 실행됨
      • useLayoutEffect가 모든 DOM의 변경 작업이 다 끝난 이후에 실행되었다면 useInsertionEffect는 이러한 DOM 변경 작업 이전에 실행됨
  • react-dom/client
    • createRoot : render 메서드를 대체할 새로운 메서드
    • hydrateRoot : 서버 사이드 렌더링 애플리케이션에서 하이드레이션을 하기 위한 새로운 메서드
  • react-dom/sercer
    • renderToPipeableStream
      • 리액트 컴포넌트를 HTML로 렌더링하는 메서드
      • 스트림을 지원하는 메서드
      • HTML을 점진적으로 렌더링하고 클라이언트에서는 중간에 script를 삽입하는 등의 작업을 할 수 있음
      • 서버에서는 Suspense를 사용해 빠르게 렌더링이 필요한 부분을 먼저 렌더링할 수 있고, 값비싼 연산으로 구성된 부분은 이후에 렌더링되게끔 할 수 있음
      • 순서나 오래 걸리는 렌더링에 영향받을 필요 없이 빠르게 렌더링 수행 가능
    • renderToReadableStream
      • renderToPipeableStream이 Node.js 환경에서의 렌더링을 위해 사용된다면 renderToReadableStram은 웹 스트림을 기반으로 작동
  • 자동 배치
    • 리액트가 여러 상태 업데이트를 하나의 리렌더링으로 묶어서 성능을 향상시키는 방법
  • 더욱 엄격해진 엄격 모드
    • 엄격모드 : 리액트 애플리케이션에서 발생할 수도 있는 잠재적인 버그를 찾는 데 도움이 되는 컴포넌트
    • 더 이상 안전하지 않은 특정 생명주기를 사용하는 컴포넌트에 대한 경고 로그가 기록됨
    • 문자열 ref 사용 금지
    • findDOMNode에 대한 경고 출력
    • 구 Context API 사용 시 발생하는 경고
    • 예상치 못한 부작용 검사
  • Suspense 기능 강화
    • Suspense : 컴포넌트를 동적으로 가져올 수 있게 도와주는 기능
    • 애플리케이션에서 상대적으로 중요하지 않은 컴포넌트를 분할해 초기 렌더링 속도를 향상시키는 데 많은 도움을 줌
    • Suspense로 인해 컴포넌트가 보이거나 사라질 때도 effect가 정상적으로 실행됨
    • Suspense를 서버에서도 실행 가능
    • Suspense 내에 스로톨링 추가됨
엄격 모드에서 두 번씩 실행되는 이유 :
리액트의 컴포넌트에서 항상 순수한 결과물을 내고 있는지 개발자에게 확인시켜 주기 위함
리액트에서는 state, props, context가 변경되지 않으면 항상 동일한 JSX를 반환해야 하고, 이러한 규칙을 위배하는 컴포넌트는 잠재적으로 버그가 존재할 수 있다고 판단함. 따라서 엄격 모드에서는 순수해야 하는 함수, 메서드 등을 두 번 실행해 이러한 내용을 사전에 개발자가 파악할 수 있도록 유도하는 것

 

 

동시성 렌더링
  • 리액트 18 버전의 핵심
  • 과거 렌더링 과정은 중간에 일시 중지를 하거나 렌더링 도중에 해당 렌더링 결과물을 포기해야한다는 매커니즘이 없었음
  • 하지만 리액트 18의 렌더링은 중간에 일시 중지한 다음, 나중에 여유가 있을 때 다시 시작하거나, 진행 중인 렌더링 작업을 포기하고 새로 다시 시작할 수 있음
  • 이 과정에서 UI가 일관되게 표시할 수 있도록 보장함

 

'FE > 리뷰' 카테고리의 다른 글

[모던 리액트 딥다이브] 12장 핵심 웹 지표  (1) 2024.09.18
[모던 리액트 딥다이브] 11장 Next.js 13과 리액트 18  (1) 2024.09.10
[모던 리액트 딥다이브] 9장  (2) 2024.09.04
[모던 리액트 딥다이브] 8장 ESLint와 테스트 라이브러리  (3) 2024.09.04
[모던 리액트 딥다이브] 7장 크롬 개발자 도구를 활용한 애플리케이션 분석  (0) 2024.08.17
'FE/리뷰' 카테고리의 다른 글
  • [모던 리액트 딥다이브] 12장 핵심 웹 지표
  • [모던 리액트 딥다이브] 11장 Next.js 13과 리액트 18
  • [모던 리액트 딥다이브] 9장
  • [모던 리액트 딥다이브] 8장 ESLint와 테스트 라이브러리
따봉치치
따봉치치
김치치의개발블로그따봉치치 님의 블로그입니다.
따봉치치
김치치의개발블로그
따봉치치
전체
오늘
어제
  • 분류 전체보기 (359)
    • 면접질문 (4)
    • CS (50)
    • FE (116)
      • Javascipt (16)
      • Typescipt (6)
      • React (16)
      • CSS (5)
      • Nextjs (1)
      • 리뷰 (70)
    • Algorithm (181)
    • ETC (3)
      • Bootcamp (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 모던 리액트 딥다이브
  • BOJ
  • dp
  • 백트래킹
  • react
  • Fe
  • 투 포인터
  • C++
  • BFS
  • Greedy
  • 그래프 탐색
  • 그리디
  • CS
  • typescript
  • 자바스크립트
  • 자료구조
  • 완전탐색
  • javascript
  • 스택
  • 우선순위 큐
  • 누적합
  • 모던 자바스크립트 딥다이브
  • 데이터베이스
  • 리액트
  • 백준
  • 문자열
  • TOPCIT
  • 알고리즘
  • Stack
  • 탐욕 알고리즘

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
따봉치치
[모던 리액트 딥다이브] 10장 리액트 17 vs 리액트 18
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.