[React] 리액트로 SSR 구현하기
글 작성자: 망고좋아
반응형
🎯 React를 활용한 Server Side Rendering
📝 ReactDOMServer
- ReactDOMServer를 활용하여, 특정 React Component를 HTML로 빌드
- Node.js 서버에서 JSX를 사용하여 페이지 빌드
📝 ReactDOMServer.renderToString()
- React Component를 HTML로 변환한다.
- 클라이언트의 페이지 요청 시, 변환된 HTML string을 전달한다.
ReactDOMServer.renderToNodeStream
은 readable stream을 생성하고 브라우저가 받아서 점진적으로 페이지를 그린다.
📝 ReactDOM.hydrate
- renderToString으로 생성한 HTML의 root을 기준으로, 받아온 React code를 통해 markup에 이벤트 핸들러를 등록하는 등 컴포넌트화 한다.
- 기존 ReactDOM.render(<App />, rootElement)은 rootElement에 App을 넘겨서 만들었다고 하면
- ReactDOM.hydrate(<App />, rootElement)은 이미 rootElement에 App이 그려져 있다. 그리고 App을 넘겨서 렌더링하고 이미 렌더링 된 것과 비교해서 이벤트 핸들러를 넣어준다.
- 즉, 아무것도 없는 html에 React화 하는 작업이다.
📕 Hydration 시 주의할 점
- 서버에서 생성한 컴포넌트와 브라우저에서 Hydration을 거친 후의 마크업이 다르면, React runtime은 경고를 보냄.
- ex) 현재 시간을 보여주는 컴포넌트 (마크업 된 서로 시간이 다를 수 있다.)
- 경고 발생 시, 어느 부분에서 차이점이 생기는지 반드시 파악해야 한다.
- 데이터 패칭이 실패하는 경우가 생길 수 있다.
- componentDidMount 역할을 하는 useEffect의 경우, SSR시 서버에서 동작하지 않을 수 있다.
- data loading 등의 처리를 별도로 해주어야 할 필요가 있다.
📝 SSR 구현 예제
npm init -y
npm i react react-dom
npm i -D webpack webpack-cli
npm i -D @babel/core @babel/preset-env @babel/preset-react
npm i -D babel-loader #바벨과 웹팩을 연동
npm i express webpack-node-externals
- 앱이 동작 안 됨 => app.js가 만든 html을 리턴했지만 동작하기 위한 리액트 코드를 전송하지는 않았다. ⇒ 템플릿 작성
npm run build
npm run build:server
npm run server
반응형
'프로그래밍 > React' 카테고리의 다른 글
[React] useEffect에서 async/await 사용하는 방법 (0) | 2022.01.19 |
---|---|
[React] 리액트 앱 배포 프로세스 (0) | 2022.01.19 |
[React] React 테스팅 (0) | 2022.01.17 |
[Redux] redux-toolkit (0) | 2022.01.17 |
[Redux] Redux의 구조 (0) | 2022.01.17 |
댓글
이 글 공유하기
다른 글
-
[React] useEffect에서 async/await 사용하는 방법
[React] useEffect에서 async/await 사용하는 방법
2022.01.19 -
[React] 리액트 앱 배포 프로세스
[React] 리액트 앱 배포 프로세스
2022.01.19 -
[React] React 테스팅
[React] React 테스팅
2022.01.17 -
[Redux] redux-toolkit
[Redux] redux-toolkit
2022.01.17