next js 사용일지 - 1

정지훈·2022년 5월 3일
0

react로 서비스를 운영해오다가 새로운걸 시도해보고 싶은 마음이 생겼다.

그래서 다음 진행할 프로젝트에 next js 를 도입 하기로 하였다.

처음 next js를 이용하여 setting했을 때 styled components를 사용했는데 이상하게도 새로고침 할때 마다 스타일이 초기화 되었고 구글링 해본 결과 나와 같은 현상이 일어난 분들이 있었다.

import React from "react";
import Document, { Main, NextScript, Head, Html } from "next/document"; //next의 html과 나머지 기타 기능들을 넣어주는 Main과 NextScript
import Helmet from "react-helmet"; // head태그에 넣을 정보를 jsx로 작성할 수 있게 도와준다.
import { ServerStyleSheet, createGlobalStyle } from "styled-components";


// _document.js는 index.html을 꾸며주는거다라고 생각하면 된다.
// class형으로 밖에 못 하는게 조금 아쉽다.
// ServerStyleSheet을 사용하여 서버사이드렌더링을 하게 할 수 있다.
// 전체적으로 css를 주고 싶은 부분은 createGlobalStyle을 사용하여 가능하다.
const GlobalStyles = createGlobalStyle`

       html, body {
            height: 100%;
            /* overflow: auto; */
            box-sizing: border-box;
              font-family: 'Spoqa Han Sans Neo',
    sans-serif;
            padding: 0;
            margin: 0;
            /* font-size: 10px; */
            /* max-width: 450px; */
            /* margin: 0 auto; */
    }
    input {
      -webkit-appearance: none;
      -webkit-border-radius: 0;
    }
    h1,h2,h3,h4 {
      padding: 0;
      margin: 0;
    }
    button {
      background: none;
      border: 0;
      margin: 0;
      padding: 0;
      font-family: 'Spoqa Han Sans Neo',
    sans-serif;
    }
          #__next {
            height: 100%;
          }
`;
class MyDocument extends Document {
  static getInitialProps(context) {
    const sheet = new ServerStyleSheet(); // 서버사이드 렌더링 할 수 있게함.
    const page = context.renderPage(
      (App) => (props) =>
        sheet.collectStyles(
          <>
            <GlobalStyles />
            <App {...props} />
          </>
        )
    ); // 아래의 스타일들을 모아서 페이지를 그려준다. 원래는 <GlobalStyles/> 없이 하는데 글로벌 스타일을 지정해주기 위해 저렇게 적었다.
    const styleTags = sheet.getStyleElement();
    return { ...page, helmet: Helmet.renderStatic(), styleTags };
  }

  render() {
    const { htmlAttributes, bodyAttributes, ...helmet } = this.props.helmet; // helmet으로 부터 받아온다.
    const htmlAttrs = htmlAttributes.toComponent();
    const bodyAttrs = bodyAttributes.toComponent();
    return (
      //html이랑 head, body 부분에 각각 props들을 넣어준다
      <Html {...htmlAttrs} lang="ko-KR">
        <Head>
          {this.props.styleTags}
          {Object.values(helmet).map((el) => el.toComponent())}
          {/* <!-- Global site tag (gtag.js) - Google Analytics --> */}
         
          
        </Head>
        <body {...bodyAttrs}>
          <Main />
          <NextScript />
        </body>
      </Html>
    );
  }
}

export default MyDocument;
  const sheet = new ServerStyleSheet(); // 서버사이드 렌더링 할 수 있게함.

이 부분을 추가해주면 서버사이드 렌더링을 할 수 있게금 할 수 있다.

0개의 댓글