Next.js (2) - Page Router

새벽로즈·2023년 12월 19일
1

TIL

목록 보기
64/72
post-thumbnail

Installation

  • 'npx create-next-app [프로젝트 이름]'으로 프로젝트 생성 시, App Router 대신 Pages Router 선택 가능

개발 모드와 프로덕션 모드

  • npm run dev: 개발 모드 실행 (Hot reloading 등 개발 환경 기능 지원)
  • npm run build: 제품 배포용으로 프로젝트 빌드
  • npm run start: build된 프로젝트 실행 (운영 서버 배포와 동일한 환경)

Next.js에서의 페이지란?

  • 'pages' 디렉토리에 있는 React Component로 페이지 생성
  • 폴더 구조에 따라 자동으로 URL이 결정되는 파일 기반 라우팅 시스템 사용

Index Routes

  • 간단한 페이지 예시:
    'pages/index.js', 'pages/about/index.js', 'pages/about.js'
  • URL은 폴더 구조에 따라 자동으로 결정됨

Nested Routes

  • 중첩된 폴더 사용 가능: 'pages/blog/first-post/index.js'

Dynamic Routes

  • 동적 URL 처리 가능: 'pages/posts/[postId].js'
  • 내장된 router를 사용하여 query parameter에 접근
  • React의 'react-router-dom' 대체: 'next/link', 'next/router' 사용
  • 'next/link'로 링크 생성, 'next/router'로 프로그래밍 방식의 페이지 이동.

API Routes

  • 복잡한 서버 설정 없이 API 생성 및 배포 가능
  • 'pages/api' 디렉토리에 파일 기반 라우팅 시스템과 동일한 경로 사용

Dynamic API Route

  • Dynamic route 지원: 'pages/api/test/[id].js'

사용 사례 - 외부 API 주소 마스킹(masking)

  • 'pages/api' 아래의 파일들은 빌드 시 클라이언트 번들에 포함되지 않음
  • 외부 API 주소 은닉화를 통해 개발자 도구의 네트워크 탭에서 주소를 확인하지 못하도록 함

Pages Router의 Data Fetching 및 Rendering

  • Pages Router에서 Data Fetching과 Rendering은 페이지 단위로 이루어짐

Server-Side Rendering (SSR) -'getServerSideProps'

  • 'getServerSideProps' 함수는 Server에서만 실행되며, Browser에서는 실행되지 않음
  • Runtime에서 실행되며, context 객체를 통해 URL Query 파라미터에 접근 가능
  • 반환 값은 해당 페이지의 props로 전달됨

Static-Site Generation (SSG) - 'getStaticProps', 'getStaticPaths'

  • 'getStaticProps': SSG를 원하는 페이지에 추가하여 해당 페이지가 빌드될 때 렌더링
  • Server에서만 실행되며, build 시에만 실행됨
  • 반환 값은 해당 페이지의 props로 전달됨
  • 'getStaticPaths': dynamic routes를 제공하기 위한 것으로,
    미리 어떤 paths를 Static Site Generation 할 지 정함
  • 'getStaticPaths'에 의존하므로 'getStaticProps'가 함께 사용되어야 함
  • 반환 값은 'getStaticProps'의 props로 전달됨
  • 'fallback' 옵션: 동적 경로를 처리할 때 동작 방식 결정
  • 'false': 'getStaticPaths'에 없는 페이지는 404로 연결
  • 'true': 'getStaticPaths'에 없는 페이지 요청 시,
    fallback 페이지를 보여주고 서버에서 생성 후 보여줌
  • 'blocking': 서버에서 페이지 생성 후 보여줌

Incremental Static Regeneration (ISR)

  • 'getStaticProps'에 'revalidate' 속성을 추가하여 사용
  • 페이지 요청 시마다 최대 10초 간격으로 해당 페이지를 다시 빌드하여 업데이트함

_app.js

  • Next.js의 root component
  • 모든 페이지에서 공통적으로 적용되는 레이아웃, 글로벌 CSS, 초기값 설정 등을 포함
  • 예시: 모든 페이지의 공통 레이아웃, 글로벌 CSS 적용

_document.js

  • HTML 구조를 커스터마이징할 때 사용하는 파일
  • Server Side에서만 렌더링되며, 초기 HTML 렌더링 시에 CSS와 같은 스타일이 적절하게 적용될 수 있도록 도움
  • 예시: styled-components를 사용할 때 초기 깜빡임을 방지하는 용도
import Document from 'next/document'
import { ServerStyleSheet } from 'styled-components'

class MyDocument extends Document {
  static async getInitialProps(ctx) {
    const sheet = new ServerStyleSheet()
    const originalRenderPage = ctx.renderPage

    try {
      ctx.renderPage = () =>
        originalRenderPage({
          enhanceApp: App => props => sheet.collectStyles(<App {...props} />)
        })

      const initialProps = await Document.getInitialProps(ctx)
      return {
        ...initialProps,
        styles: (
          <>
            {initialProps.styles}
            {sheet.getStyleElement()}
          </>
        )
      }
    } finally {
      sheet.seal()
    }
  }
}

export default MyDocument
  • ServerStyleSheet을 사용하여 styled-components로부터 생성된 스타일이 HTML 초기 렌더링에 포함되도록 함

404.js

  • 페이지를 찾을 수 없을 때 나타나는 커스텀 404 페이지
  • 예시: 404 페이지 커스터마이징
// pages/404.js
export default function Custom404() {
  return <h1>404 - Page Not Found</h1>
}
profile
귀여운 걸 좋아하고 흥미가 있으면 불타오릅니다💙 최근엔 코딩이 흥미가 많아요🥰

0개의 댓글