renderToStaticNodeStream
renderToStaticNodeStream
์ ์ํธ์์ฉํ์ง ์๋ React ํธ๋ฆฌ๋ฅผ Node.js Readable Stream์ผ๋ก ๋ ๋๋งํฉ๋๋ค.
const stream = renderToStaticNodeStream(reactNode)
์ฐธ์กฐ
renderToStaticNodeStream(reactNode)
์๋ฒ์์ renderToStaticNodeStream
์ ํธ์ถํ์ฌ Node.js Readable Stream์ ๋ถ๋ฌ์ต๋๋ค.
import { renderToStaticNodeStream } from 'react-dom/server';
const stream = renderToStaticNodeStream(<Page />);
stream.pipe(response);
์๋์์ ๋ ๋ง์ ์์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
stream์ React ์ปดํฌ๋ํธ์ ์ํธ์์ฉํ์ง ์๋ HTML ์ถ๋ ฅ์ ์์ฑํฉ๋๋ค.
๋งค๊ฐ๋ณ์
reactNode
: HTML๋ก ๋ ๋๋งํ React ๋ ธ๋. ์๋ฅผ ๋ค์ด<Page />
์ ๊ฐ์ JSX ์๋ฆฌ๋จผํธ.
๋ฐํ๊ฐ
HTML ๋ฌธ์์ด์ ์ถ๋ ฅํ๋ Node.js Readable Stream์ ๋๋ค. ๊ฒฐ๊ณผ HTML์ ํด๋ผ์ด์ธํธ์์ hydrate ํ ์ ์์ต๋๋ค.
์ฃผ์ ์ฌํญ
-
renderToStaticNodeStream
์ ์ถ๋ ฅ๊ฐ์ hydrate ํ ์ ์์ต๋๋ค. -
์ด ๋ฉ์๋๋ ์ถ๋ ฅ๊ฐ์ด ๋ฐํ๋๊ธฐ ์ ์ ๋ชจ๋ Suspense boundaries๊ฐ ์๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค.
-
React 18๋ถํฐ ์ด ๋ฉ์๋๋ ๋ชจ๋ ์ถ๋ ฅ๊ฐ์ ๋ฒํผ๋งํ๊ธฐ ๋๋ฌธ์ ์คํธ๋ฆฌ๋ฐ์ ์ด์ ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
-
๋ฐํ๋ ์คํธ๋ฆผ์ UTF-8๋ก ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํธ ์คํธ๋ฆผ์ ๋๋ค. ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ธ์ฝ๋ฉ๋ ์คํธ๋ฆผ์ด ํ์ํ๋ค๋ฉด, ํธ๋์ค์ฝ๋ฉ์ ์ํ ๋ณํ ์คํธ๋ฆผ์ ์ ๊ณตํ๋ iconv-lite์ ๊ฐ์ ํ๋ก์ ํธ๋ฅผ ์ดํด๋ณด์ธ์.
์ฌ์ฉ๋ฒ
React ํธ๋ฆฌ๋ฅผ ์ ์ HTML๋ก Node.js Readable Stream์ ๋ ๋๋ง ํ๊ธฐ
renderToStaticNodeStream
์ ํธ์ถํ์ฌ ์๋ฒ ์๋ต์ผ๋ก ํ์ดํ ํต์ ํ ์ ์๋ Node.js Readable Stream์ ๋ถ๋ฌ์ต๋๋ค.
import { renderToStaticNodeStream } from 'react-dom/server';
// ๋ผ์ฐํธ ํธ๋ค๋ฌ ๋ฌธ๋ฒ์ ๋ฐฑ์๋ ํ๋ ์์ํฌ์ ๋ฐ๋ผ ๋ค๋ฆ
๋๋ค.
app.use('/', (request, response) => {
const stream = renderToStaticNodeStream(<Page />);
stream.pipe(response);
});
stream์ React ์ปดํฌ๋ํธ์ ์ํธ์์ฉํ์ง ์๋ ์ด๊ธฐ HTML ์ถ๋ ฅ์ ์์ฑํฉ๋๋ค.