renderToNodeStream
renderToNodeStream
React ํธ๋ฆฌ๋ฅผ Node.js Readable Stream.์ผ๋ก ๋ ๋๋งํฉ๋๋ค.
const stream = renderToNodeStream(reactNode)
์ฐธ์กฐ
renderToNodeStream(reactNode)
์๋ฒ์์ renderToNodeStream
์ ํธ์ถํ์ฌ ์๋ต์ผ๋ก ํ์ดํํ ์ ์๋ Node.js Readable Stream์ ๊ฐ์ ธ์ต๋๋ค.
import { renderToNodeStream } from 'react-dom/server';
const stream = renderToNodeStream(<App />);
stream.pipe(response);
ํด๋ผ์ด์ธํธ์์ hydrateRoot
๋ฅผ ํธ์ถํ์ฌ ์๋ฒ์์ ์์ฑ๋ HTML์ ์ธํฐ๋ํฐ๋ธํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
์๋ ์์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
ํ๋ผ๋ฏธํฐ
reactNode
: A React node you want to render to HTML. For example, a JSX element like<App />
. HTML๋ก ๋ ๋๋งํ๋ ค๋ React ๋ ธ๋์ ๋๋ค. ์๋ฅผ ๋ค์ด,<App />
๊ณผ ๊ฐ์ JSX ์๋ฆฌ๋จผํธ์ ๋๋ค.
๋ฐํ
HTML ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ Node.js Readable Stream๋ฅผ ๋ฐํํฉ๋๋ค.
์ฃผ์์ฌํญ
-
์ด ๋ฉ์๋๋ ์ถ๋ ฅ์ ๋ฐํํ๊ธฐ ์ ์ ๋ชจ๋ Suspense boundaries)๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค.
-
React 18๋ถํฐ ์ด ๋ฉ์๋๋ ๋ชจ๋ ์ถ๋ ฅ์ ๋ฒํผ๋งํ๋ฏ๋ก ์ค์ ๋ก ์คํธ๋ฆฌ๋ฐ ์ด์ ์ ์ ๊ณตํ์ง ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋์
renderToPipeableStream
์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. -
๋ฐํ๋ ์คํธ๋ฆผ์ utf-8๋ก ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํธ ์คํธ๋ฆผ์ ๋๋ค. ๋ค๋ฅธ ์ธ์ฝ๋ฉ์ผ๋ก ๋ ์คํธ๋ฆผ์ด ํ์ํ ๊ฒฝ์ฐ ํ ์คํธ ํธ๋์ค์ฝ๋ฉ์ ์ํ ํธ๋์คํผ ์คํธ๋ฆผ์ ์ ๊ณตํ๋ iconv-lite์ ๊ฐ์ ํ๋ก์ ํธ๋ฅผ ์ดํด๋ณด์ธ์.
์ฌ์ฉ๋ฒ
React ํธ๋ฆฌ๋ฅผ HTML๋ก Node.js Readable Stream์ ๋ ๋๋งํ๊ธฐ
renderToNodeStream
์ ํธ์ถํ์ฌ ์๋ฒ ์๋ต์ผ๋ก ํ์ดํํ ์ ์๋ Node.js Readable Stream์ ๊ฐ์ ธ์ต๋๋ค.
import { renderToNodeStream } from 'react-dom/server';
// ๋ผ์ฐํธ ํธ๋ค๋ฌ ๊ตฌ๋ฌธ์ ๋ฐฑ์๋ ํ๋ ์์ํฌ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค.
app.use('/', (request, response) => {
const stream = renderToNodeStream(<App />);
stream.pipe(response);
});
์คํธ๋ฆผ์ React ์ปดํฌ๋ํธ์ ์ด๊ธฐ์ ์ํธ์์ฉํ์ง ์๋ HTML ๊ฒฐ๊ณผ๋ฌผ์ ์์ฑํฉ๋๋ค. ํด๋ผ์ด์ธํธ์์๋ ์๋ฒ์์ ์์ฑ๋ HTML์ hydrate ์ฒ๋ฆฌํ๊ณ ์ํธ์์ฉํ๋๋ก ๋ง๋ค๊ธฐ ์ํด hydrateRoot
๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.