-> 인수로 넘겨받은 리액트 컴포넌트를 HTML 문자열로 반환
-> 서버 사이드 렌더링을 구현하기 위한 가장 기초적인 API
-> 최초의 페이지를 HTML로 렌더링할 때 사용
-> Ex.
{ fruits.map((fruit)=>{<li>{fruit}</li>}) }
라는 코드에 renderToString을 사용하면
<li>apple</li><li>banana</li><li>peach</li>
를 반환한다. 이 때, 이벤트나 핸들러는 포함하지 않는다.
-> renderToString 함수와 거의 같은 값은 반환
-> 하지만 data-reactroot와 같은 react에서만 사용하는 추가적인 DOM 속성을 만들지 않음. => HTML 크기를 아주 조금이지만 줄일 수 있다.
-> 이 때문에 hydrate(이벤트 리스너 등록하는 함수)를 실행할 때 에러 발생.
-> 따라서 이벤트가 없다는 가정하에 사용하기 좋다!
-> renderToString과 결과문이 완전히 동일.
-> 브라우저에서 사용하는 것이 완전히 불가능하다는 점이 다르다.
-> ReadableStream을 반환하기 때문에 서버 환경에서만 사용할 수 있다.
-> 생성하는 HTML 결과물의 크기가 클 경우에는 chunk로 나눠서 처리해야하기 때문에 renderToNodeStream이 필요하다.
-> 따라서 대부분 서버 사이드 렌더링 프레임워크는 renderToString 대신 renderToNodeStream을 사용한다.
-> renderToStaticMarkup과 동일하게 renderToStaticNodeStream 에서 리액트 속성이 제공되지 않는다.
-> 마찬가지로 hydrate가 필요없을 때 사용 가능하다.
-> 생성된 HTML 콘텐츠에 자바스크립트 핸들러나 이벤트를 붙인다.
-> render함수와 인수를 넘기는 것이 거의 유사하다. 차이점은 hydrate 는 이미 렌더링된 HTML이 있다는 가정하에 수행된다는 점.
-> static 함수로 생성된 정보를 넘겨줄 경우에는 에러가 나며, 렌더링은 실행된다. 이 때 에러는 hydrate함수가 단순히 이벤트를 추가하는 것 이 아니라, 렌더링을 한 번 수행하면서 받은 결과와 렌더링한 결과를 비교하는데, 이때 나는 것이다. 불일치가 발생하면 에러를 내고 hydrate함수가 렌더링한 기준으로 페이지를 그린다.
-> 하지만 제대로 된 페이지를 그린다고 다른 값을 주면 항상 렌더링을 2번씩 하게 되어 서버 사이드 렌더링을 사용하는 의미가 사라지므로 주의하자!
.
.
.
.
.
'모던 리액트 Deep Dive'를 읽고!