리액트는 프론트엔드 라이브러리로 브라우저 자바스크립트 환경의 렌더링과 동시에 리액트 애플리케이션 서버에서 렌더링 할 수 있는 API를 제공한다 18버전 이전의 기본 적인 함수을 모던리액ㅌ를 기반으로 정리하며 이외에 18버전 이후에는 어떤 API가 있는지 학습해보고자 한다!
deep dive! 📌
1.React-specific 속성의 역할
(1) Hydration 을 위한 DOM 식별
- 서버에서 생성된 HTM을 클라이언트에서 재활용 하려면 React가 DOM 구조를 정확히 이해 필요 이 속성을 통해 서버에서 생성된 DOM 과 React 의 가상 DOM (virtual DOM)을 연결
(1) 효율적인 업데이트 지원- 초기 Hydration 과정에서는 React는 서버에서 렌더링 된 HTML을 수정하지 않고 유지 하려고 시도함 React-specific 속성을 사용해 DOM 과 React 상태 간의 동기화 빠르게 수행
2.주요속성
(1) data-reactroot- 리액트 컴포넌트의 루트 엘리먼트를 식별, 이는 이후 자바스크립트를 실행하기 위한 hydrate 함수에서 루트를 식별하는 기준점
- Hydration 시 React가 이 루트를 기반으로 DOM 을 다시 구성한다
(2) data-reactid(React 15 및 이전 버전에 사용)- React가 DOM 요소를 식별, 업데이트 효율성 높이기 위해 추가한 내부 ID
- React 16이후부터는 더 이상 사용되지 않음
(3) __reactProps$- React 18에서는 SSR 및 Hydration에서 이벤트 핸들러와 같은 속성을 관리하기 위해 내부적으로 사용되는 속성
- 이 속성은 Hydration이 끝난 후 사라질 수 있음
비슷하게 브라우저에서만 사용되는 메서드인 render 가 있다
1) 컴포넌트와 HTML 요소를 인수로 받는다 이렇게 인수 받은 정보를 바탕으로 HTML의 요소에 해당 컴포넌트를 렌더링하며, 이벤트 핸들러를 붙이는 작업까지 한번에 수행
2) 클라이언트에서만 실행되는,렌더링과 이벤트 핸들러 추가 등 리액트 기반으로 한 온전한 웹페이지를 만드는데 필요한 모든 작업 수행
import React from "react";
import { renderToPipeableStream } from "react-dom/server";
import { Readable } from "stream";
function App() {
return <div>Streaming Content</div>;
}
const { pipe } = renderToPipeableStream(<App />, {
onShellReady() {
console.log("HTML shell is ready!");
// 스트림 데이터를 전송할 준비가 완료됨.
pipe(process.stdout); // Node.js에서는 stdout으로 스트리밍 가능.
},
onError(err) {
console.error("Error during SSR:", err);
},
});
import React from "react";
import { renderToReadableStream } from "react-dom/server";
async function render() {
const stream = await renderToReadableStream(<div>Hello, Readable Stream!</div>);
const reader = stream.getReader();
const result = await reader.read();
console.log(new TextDecoder().decode(result.value));
}
render();