ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Next.js _app, _documnet
    Frontend/NextJS 2023. 5. 1. 14:25

    yarn create next-app --typescript를 통해 next.js 기본설정을 마치다보면 자동으로 _app.tsx, _document.tsx가 설치되어있는 모습을 볼 수 있다. 이 두가지는 next.js에 어떤 역할을 주는지 알아보자! 

     

    1. _app.tsx

     

    기본적으로 Next.js에서는 App의 구성 요소를 사용하여 모든 페이지를 초기화한다.

    따라서 App.tsx를 만들어 기본 App 구성 요소를 덮어 쓸 수 있다.

     

    즉, 모든 페이지에서 공통으로 필요한 처리를 여기에서 작성하여 쓰면 된다. 이를테면

     

    - 페이지 간 공통 레이아웃

    - 전역 State (Store,React-query 설정 등)

    - 글로벌 CSS

    - 각 Route Provider

    - 상태관리 library의 Provider, Redux의 Provider, React-query의 Query ClientProvider, 

     

    등이 있다. 

     

    import { QueryClientProvider, Hydrate } from "@tanstack/react-query";
    import type { AppProps } from "next/app";
    import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
    import { useState } from "react";
    import queryClientInstance from "../lib/queryClient";
    import globalStyles from "@/styles/globals";
    import typography from "@/styles/typography";
    
    export default function App({ Component, pageProps }: AppProps) {
      const [queryClient] = useState(queryClientInstance);
      globalStyles();
      typography();
    
      return (
        <QueryClientProvider client={queryClient}>
          <Hydrate state={pageProps.dehydratedState}>
            <div>어디에서든 나와요.</div>
            <Component {...pageProps} />
            <ReactQueryDevtools initialIsOpen={false} />
          </Hydrate>
        </QueryClientProvider>
      );
    }

    위는 _app.tsx의 예시이다.

    1번인 <div>어디에서든 나와요.</div>를 넣어주면 모든 페이지 상단에 Header가 표시된다.

    또한 gloabal css인 globalStyles()와 typography()를 넣어주었고 상태관리 library는 react-query를 채택해 QueryClientProvider를 전체에 감싸주었다. 

     

     

    2. _document.tsx

    사이트를 만들 때 가장 루트 경로가 되는 파일은 index.html이다.

    next 초기 설정에는 index.html을 볼 수가 없고 이 역할을 _document.tsx가 대신한다.

    Html, Head, Main, NextScript, Link, 스타일시트 링크, 폰트 임포딩 등등의 역할을 담당한다.
     
     

     아래는 기본적인 설정을 적용한 예시이다.

    import { Html, Head, Main, NextScript } from 'next/document';
    import { getCssText } from '../stitches.config';
    
    export default function Document() {
      return (
        <Html lang="en">
          <Head>
            <style
              id="stitches"
              dangerouslySetInnerHTML={{ __html: getCssText() }}
            />
          </Head>
          <body>
            <Main />
            <NextScript />
          </body>
        </Html>
      );
    }

    _documents.tsx를 작성할 대 주의할 점은 오로지 SSR을 위한 소스코드라는 점에 있다.

    즉, 서버에서만 실행되므로 onClick와 같은 이벤트 핸들러와 useEffect등의 클라이언트 측 처리는 되지 않는다.

Designed by Tistory.