2024-03-31.md
๐กDIL: ๋ชจ๋ ๋ฆฌ์กํธ ๋ฅ ๋ค์ด๋ธ, 4์ฃผ์ฐจ-7
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์ค๋ ์งํ: ๊ฐ์ธ๊ณต๋ถ
DIL-week4-7_2024-03-31
| DIL ์ฃผ์ฐจ | ๋ฒ์ | ๋ด์ฉ | ์ค๋์ฐจ ์ง๋ | | -------- | ------ | ------------------------------- | ----------- | | 4์ฃผ์ฐจ | 4, 8์ฅ | SSR๊ณผ ESlint, ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ | 270p~.. |
์ค๋ ์ฝ์ ๋ด์ฉ์ markdown์ผ๋ก ๊ฐ๋จํ ๋ฉ๋ชจ
์ฝ์ ์๊ฐ: ์๋ฒฝ ๊ณต๋ถ
์๋ฒ ์ฌ์ด๋ ๋๋๋ง์ ์ํ ๋ฆฌ์กํธ API ์์๋ณด๊ธฐ
- ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์
์ ๋๋๋งํ ์ ์๋ API
- Node.js์ ๊ฐ์ ์๋ฒ ํ๊ฒฝ์์๋ง ์คํํ ์ ์๋ค
- https://github.com/facebook/react/blob/main/packages/react-dom/server.node.js
1. renderToString
- ์ธ์๋ก ๋๊ฒจ๋ฐ์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๋๋๋งํด HTML ๋ฌธ์์ด๋ก ๋ฐํํ๋ค.
- ์ต์ด์ ํ์ด์ง๋ฅผ HTML๋ก ๋จผ์ ๋๋๋ง
const result = ReactDOMServer.renderToString(
React.createElement("div", { id: "root" }, <MyComponent />)
);
2. renderToStaticMarkup
- renderToString๊ณผ ์ ์ฌํ ํจ์
- ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ์ค์ผ๋ก HTML ๋ฌธ์์ด์ ๋ง๋ ๋ค
- data-reactroot๊ณผ ๊ฐ์ ๋ฆฌ์กํธ์์๋ง ์ฌ์ฉํ๋ ์ถ๊ฐ์ ์ธ DOM ์์ฑ์ ๋ง๋ค์ง ์๋๋ค.
- HTML์ ํฌ๊ธฐ๋ฅผ ์ฝ๊ฐ ์ค์ผ ์ ์๋ค
- ๋ธ๋ผ์ฐ์ API๋ฅผ ์คํํ ์ ์๊ณ , hydrate์ ์ํํ๋ฉด ์๋ฒ์ ํด๋ผ์ด์ธํธ์ ๋ด์ฉ์ด ๋ง์ง ์๋ ์๋ฌ
- hydrate์ ์ํํ์ง ์๋๋ค๋ ๊ฐ์ ํ์ HTML์ ๋ฐํ ๋ธ๋ก๊ทธ ๊ธ, ์ํ ์ฝ๊ด ์ ๋ณด ๊ฐ์ ์๋ฌด๋ฐ ์ก์ ์ด ์๋ ์ ์ ์ธ ๋ด์ฉ์ ๋ง๋ค ๋ ์ฌ์ฉ
const result = ReactDOMServer.renderToStaticMarkup(
React.createElement("div", { id: "root" }, <MyComponent />)
);
3. renderToNodeStream
- renderToString๊ณผ ๊ฒฐ๊ณผ๋ฌผ์ด ๋์ผ
- Node.js์ ์์กดํ๊ณ ์์ด, ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅ
- Node.js์ ReadableStream
- ๋ธ๋ผ์ฐ์ ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฒด์ด์ง๋ง, ๋ง๋๋ ๊ณผ์ ์ด ๋ถ๊ฐ๋ฅ
- utf-8์ผ๋ก ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํธ ์คํธ๋ฆผ: Deno, Bun๊ณผ ๊ฐ์ ์๋ฒ ํ๊ฒฝ์์๋ง ์ฌ์ฉํ ์ ์๋ค.
- ์คํธ๋ฆผ์ด๋?
- ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋, ๋ฐ์ดํฐ๋ฅผ ์ฒญํฌ(chunk)๋ก ๋ถํ ํด ์กฐ๊ธ์ฉ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ ์๋ฏธ
- ๋๋ถ๋ถ์ ๋ฆฌ์กํธ ์๋ฒ ์ฌ์ด๋ ๋๋๋ง ํ๋ ์์ํฌ๋ renderToNodeStream์ ์ฑํ
4. renderToStaticNodeStream
- renderToNodeStrea๊ณผ ๊ฒฐ๊ณผ๋ฌผ์ด ๋์ผ
- ๋ฆฌ์กํธ ์์ฑ์ด ์ ๊ณต๋์ง ์๋, hydrate์ ํ ํ์์๋ ์์ HTML ๊ฒฐ๊ณผ๋ฌผ.
5. hydrate
- HTML ์ฝํ ์ธ ์ ์ด๋ฒคํธ์ ํธ๋ค๋ฌ๋ฅผ ๋ถ์ธ๋ค
- render() ๋ฉ์๋
- create-react-app์ผ๋ก ์์ฑ๋ index.js์์ ์ฐพ์๋ณผ ์ ์๋ค
const rootElement = document.getElementById("root"); React.render(<App />, rootElement);
- hydrate()
const element = document.getElementById(containerId); // ์๋ฒ์์ ๋๋๋ง๋ HTML์ ํน์ ์์น ReactDOM.hydrate(<App />, element);
- ๋ ๋ฒ์งธ ์ธ์์๋ ์ด๋ฏธ renderToString ๋ฑ์ผ๋ก ๋๋๋ง๋ ์ ์ HTML ์ ๋ณด๊ฐ ๋ด๊ฒจ ์์ด์ผ ํ๋ค.
- ๋ด๊ฒจ์์ง ์๋ค๋ฉด ๋ถ์ผ์น ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ , hydrate๊ฐ ๋๋๋งํ ๊ธฐ์ค์ผ๋ก ์น ํ์ด์ง๋ฅผ ๊ทธ๋ฆฌ๋ ๋ฐ, ์ฌ์ค์ ์๋ฒ์ ํด๋ผ์ด์ธํธ์์ ๋ ๋ฒ ๋๋๋ง์ ํ๊ฒ ๋๋ค.
- ๋ถ๊ฐํผํ ๊ฒฝ์ฐ (ms๊ฐ ์ฌ์ฉ ๋ฑ) suppressHydrationWarning์ ์ถ๊ฐํด ๊ฒฝ๊ณ ๋ฅผ ๋ ์ ์๋ค.