hydrateRoot는 이전에 react-dom/server로 생성된 HTML 콘텐츠를 가진 브라우저 DOM 노드 안에 React 컴포넌트를 표시할 수 있게 해줍니다.
const root = hydrateRoot(domNode, reactNode, options?)레퍼런스
hydrateRoot(domNode, reactNode, options?)
hydrateRoot를 호출하여 이미 서버 환경에서 렌더링된 기존 HTML에 React를 “붙여넣기” 합니다.
import { hydrateRoot } from 'react-dom/client';
const domNode = document.getElementById('root');
const root = hydrateRoot(domNode, reactNode);React는 domNode 내부에 존재하는 HTML에 연결되어, 그 내부의 DOM 관리를 맡게 됩니다. React로 완전히 구축된 앱은 일반적으로 루트 컴포넌트와 함께 하나의 hydrateRoot 호출만 가집니다.
매개변수
-
domNode: 서버에서 루트 요소Element로 렌더링된 DOM 요소. -
reactNode: 기존 HTML에 렌더링하기 위한 “React 노드” 입니다. 주로ReactDOM Server의renderToPipeableStream(<App />)와 같은 메서드로 렌더링된<App />과 같은 JSX 조각들입니다. -
options(선택사항): React 루트에 대한 옵션을 가진 객체입니다.onCaughtError(선택사항): React가 Error Boundary에서 오류를 잡았을 때 호출되는 콜백입니다. Error Boundary에서 잡은error와componentStack을 포함하는errorInfo객체와 함께 호출됩니다.onUncaughtError(선택사항): 오류가 Error Boundary에 의해 잡히지 않았을 때 호출되는 콜백입니다. 발생한error와componentStack을 포함하는errorInfo객체와 함께 호출됩니다.onRecoverableError(선택사항): React가 오류로부터 자동으로 복구될 때 호출되는 콜백입니다. React가 던지는error와componentStack을 포함하는errorInfo객체와 함께 호출됩니다. 복구 가능한 오류는 원본 오류 원인을error.cause로 포함할 수 있습니다.identifierPrefix(선택사항): React가useId에 의해 생성된 ID에 사용하는 문자열 접두사. 같은 페이지에서 여러개의 루트를 사용할 때 충돌을 피하는 데 유용합니다. 서버에서 사용한 값과 반드시 동일한 값이어야 합니다.
반환값
hydrateRoot는 render와 unmount 두 가지 메서드를 포함한 객체를 반환합니다.
주의 사항
hydrateRoot()는 렌더링된 컨텐츠가 서버에서 렌더링된 컨텐츠와 동일할 것을 기대합니다. 따라서 불일치 사항은 버그로 취급하고 수정해야 합니다.- 개발 모드에서는 React가 Hydration 중 불일치에 대해 경고합니다. 불일치가 발생할 경우 속성 차이가 수정될 것이라는 보장은 없습니다. 이는 성능상의 이유로 중요한데, 대부분의 앱에서 불일치는 드물기 때문에 모든 마크업을 검증하는 것은 매우 비효율적이기 때문입니다.
- 앱에서
hydrateRoot호출이 단 한번만 있을 가능성이 높습니다. 프레임워크를 사용한다면, 프레임워크가 이 호출을 대신 수행할 수도 있습니다. - 앱을 사전에 렌더링된 HTML 없이 클라이언트에서 직접 렌더링한다면,
hydrateRoot()는 지원되지 않습니다.createRoot()를 대신 사용해주세요.
root.render(reactNode)
브라우저 DOM 요소 내에서 Hydrate된 React 루트 안의 React 컴포넌트를 업데이트 하려면 root.render를 호출하세요.
root.render(<App />);React는 Hydrate된 root에서 <App />을 업데이트합니다.
매개변수
reactNode: 업데이트하고 싶은 “React 노드”입니다. 주로<App />같은 JSX를 매개변수로 넘기지만,createElement()로 만든 React 요소 혹은 문자열, 숫자,null,undefined를 넘겨도 됩니다.
반환값
root.render는 undefined를 반환합니다.
주의 사항
- 루트가 Hydrate를 완료하기 전에
root.render를 호출하면, React는 서버에서 렌더링된 HTML을 모두 없애고 클라이언트에서 렌더링된 컴포넌트들로 완전히 교체합니다.
root.unmount()
root.unmount를 호출하면 React 루트 내부에서 렌더링된 트리를 삭제합니다.
root.unmount();온전히 React만으로 작성된 앱에는 일반적으로 root.unmount에 대한 호출이 없습니다.
이 함수는 주로 React 루트의 DOM 노드(또는 그 조상 노드)가 다른 코드에 의해 DOM에서 제거될 수 있는 경우에 유용합니다. 예를 들어 DOM에서 비활성 탭을 제거하는 jQuery 탭 패널을 상상해 보세요. 탭이 제거되면 그 안에 있는 모든 것(내부의 React 루트를 포함)이 DOM에서 제거됩니다. 이 경우 root.unmount를 호출하여 제거된 루트의 콘텐츠 관리를 “중지”하도록 React에 지시해야 합니다. 그렇지 않으면 제거된 루트 내부의 컴포넌트는 구독과 같은 전역 리소스를 정리하고 확보하는 법을 모르는 채로 있게 됩니다.
root.unmount를 호출하면 루트에 있는 모든 컴포넌트가 마운트 해제되고, 트리상의 이벤트 핸들러나 State가 제거되며, 루트 DOM 노드에서 React가 “분리”됩니다.
Calling root.unmount will unmount all the components in the root and “detach” React from the root DOM node, including removing any event handlers or state in the tree.
매개변수
root.unmount는 매개변수를 받지 않습니다.
Returns
root.unmount returns undefined.
주의 사항
-
root.unmount를 호출하면 트리의 모든 컴포넌트가 마운트 해제되고 루트 DOM 노드에서 React가 “분리”됩니다. -
root.unmount를 한 번 호출한 후에는 같은 루트에서root.render를 다시 호출할 수 없습니다. 마운트 해제된 루트에서root.render를 호출하려고 하면 “마운트 해제된 루트를 업데이트할 수 없습니다.Cannot update an unmounted root” 오류가 발생합니다.
사용법
서버에서 렌더링된 HTML을 Hydrate하기
react-dom/server로 앱의 HTML을 생성했다면, 클라이언트에서 Hydrate 해주어야 합니다.
import { hydrateRoot } from 'react-dom/client';
hydrateRoot(document.getElementById('root'), <App />);위 코드를 통해 서버 HTML을 브라우저 DOM 노드에서 React 컴포넌트를 이용해 Hydrate 해줄 것 입니다. 주로 앱을 시작할 때 단 한 번 실행할 것입니다. 프레임워크를 사용중이라면 프레임워크가 대신 실행해 줄 것입니다.
앱을 Hydrate 하기 위해서 React는 컴포넌트의 로직을 사전에 서버에서 만들어 진 HTML에 “붙여넣을”것 입니다. Hydration을 통해 서버에서 만들어진 최초의 HTML 스냅샷을 브라우저에서 완전히 인터랙티브한 앱으로 바꿔주게 됩니다.