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
: 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
๋ฅผ ํธ์ถํด์ผ ํฉ๋๋ค.