SSR : SEO 최적화, 초기 구동 속보다 CSR보다 빠름

Next.js는 React기반으로 라우팅과 SSR을 간편하게 적용하기 위해 나온 프레임워크로 SSR이 필요한 페이지는 getServerSideProps를 이용하면 된다.

  • 참고로 getStaticProps, getStaticPaths(였나) 함수도 있는데, 대부분 사용하지 않는다. 정적인 데이터나 화면을 사용할 경우엔 사용해도 된다.

사용하기

import React, { useEffect } from 'react';
import { END } from 'redux-saga';
import axios from 'axios';
import 스토어 from '../store/configureStore';
// ...그리고 그외의 필요한 컴포넌트
const Index = () => {

  const { 필요한 변수 } = useSelector((state) => state.리듀서);

  return (
    <Layout>
      { 변수 && <컴포넌트 /> }
    </Layout>
  );
};

// 서버사이드 렌더링 : 프론트 서버가 직접 요청하기 때문에 withCredentials문제 다시 발생하므로 브러우저 대신 cookie를 보내줘야함.
export const getServerSideProps = 스토어.getServerSideProps(async (context) => {
  console.log('start');
  const cookie = context.req ? context.req.headers.cookie : '';
  axios.defaults.headers.Cookie = '';
  // 서버일때와 쿠키가 있을 때만 cookie 넣어놓기
  if (context.req && cookie) {
    axios.defaults.headers.Cookie = cookie;
  }
  context.store.dispatch(액션());
  context.store.dispatch(END);
  console.log('end');
  await context.store.sagaTask.toPromise();
});

export default Index;
  1. store, action, END, axios는 필수로 import한다.
  2. req.headers에서 cookie값을 가져와서 axios에 defaults값으로 설정한다. 기존에는 해당 역할을 브라우저가 대신 해주어서 rootSaga에서 한번에 withCredential: true;를 적용했었다. 하지만 SSR은 프론트엔드가 axios를 직접하기 때문에 따로 담아주어야한다.
  3. context.store.dispatch를 통해서 action을 dispatch하고
  4. END와 toPromise를 통해서 끝낸다.
  5. 페이지에서 불러온 변수를 사용하는 방법은 기존에 사용하던 방법과 똑같이 useSelector, useDispatch를 사용하면 된다.

Leave a comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다