Next.js 공부
Next.js란?
- Next.js는 React의 SSR(Server Side Rendering)을 쉽게 구현할 수 있게 도와주는 간단한 프레임워크
Next.js의 특징
- 동적 경로 페이지
- pages/posts/[id].js → post/1 ...
- Pre-rendering, static generation(SSG) 와 server-side rendering(SSR) 페이지별 지원
- pre-rendering; 사전 렌더링 → 미리 HTML을 만드는 기능
- 더 빠른 페이지 로드를 위한 자동 코드 분할
- 최적화된 클라이언트 사이드 랜더링
- Built-in CSS(내장 css), Sass, CSS-in-JS 지원
- 개발 환경에서 빠른 새로고침 지원
- React 컴포넌트 편집에 대한 즉각적인 피드백을 제공 → 편집이 즉시 반영됨
- 서버리스 함수로 API 엔드포인드를 빌드하기 위한 API 경로(라우트)
- 완전히 확장 가능
Navigate Between Pages(페이지 간의 네비게이션)
Link(링크)
Next.js 에서는 a태그를 감싸는 Link 리액트 컴포넌트를 사용한다.
Link는 앱 내에서 다른 페이지로 클라이언트-사이드 네비게이션을 할 수 있게 허용해준다.
Code splitting and prefetching(코드 스플리팅과 프리페칭)
Code splitting: 각 페이지는 오직 그 페이지에 필요한 것들만을 불러온다.
prefetching: Link 컴포넌트가 등장할 때는 언제나 Next.js가 백그라운드에서 링크된 페이지를 위해 자동으로 코드를 프리페치한다. → 페이지 전환이 거의 즉시 이루어짐.
Assets, Metadata, and CSS(자산, 메타데이터, CSS)
Next.js 의 정적 Asset(자산) 사용법
최상위 public 디렉토리 하위에 이미지와 같은 정적 파일을 제공할 수 있음.
public/images/logo.png ⇒ /images/logo.png 로 사용 가능.
이미지 최적화
next/image 는 HTML <img> 요소의 확장으로 현대 웹을 위해 발전했다.
이미지 크기 조정 및 최적화가 단순하다.
Metadata(메타데이터)
<title> 태그와 같이 페이지의 메타 데이터를 수정하고 싶을 경우 next/head 모듈로부터 <Head> 컴포넌트를 import 해서 사용함
import Head from 'next/head';
export default function FirstPost() {
return (
<>
<Head>
<title>First Post</title>
</Head>
…
</>
)
}
CSS Styling(CSS 스타일링)
CSS-in-JS
// styled-jsx 라이브러리를 사용한 예제
<style jsx>{`
…
`}</style>
- Next.js에는 styled-jsx에 대한 기본 지원이 있지만 styled-components 또는 emotion 과 같은 다른 인기있는 CSS-in-JS 라이브러리를 사용할 수도 있음.
- Next.js는 내장 css에 대해 지원하며 .css, .scss 를 import 해서 사용 가능하다.
Layout Component(레이아웃 컴포넌트)
Layout Component 생성하기
- 최상위 디렉토리에 components 폴더를 생성
- 하위에 layout.js 파일을 만들고 아래와 같이 작성
// ************ javascript **************
function Layout({ children }) {
return <div>{children}</div>
}
export default Layout;
// ************ typescript **************
import React, { ReactChildren, ReactChild, ReactFragment, ReactPortal } from 'react';
interface AuxProps {
children: ReactChild | ReactChildren | ReactFragment | ReactPortal | boolean | null | undefined;
}
function Layout({ children }: AuxProps) {
return <div>{children}</div>
}
export default Layout;
CSS 추가하기
- components/layout.module.css 에 아래와 같이 작성
.container {
max-width: 36rem;
padding: 0 1rem;
margin: 3rem auto 6rem;
}
- components/layout.js 파일 수정
import styles from './layout.module.css'
export default function Layout({ children }) {
return <div className={styles.container}>{children}</div>}
Global Styles(전역 스타일)
Next.js 에서는, _app.js 로부터 글로벌 CSS 파일들을 가져와 추가할 수 있다. _app.js를 제외한 다른 곳에서 가져올 수 없다.
- 최상위에 styles 디렉토리를 만들고, 안에 global.css 파일을 만들기
- _app.js 에서 가져와 사용하기
import '../styles/global.css'
export default function App({ Component, pageProps }) {
return <Component {...pageProps} />
}
기타 CSS 팁
polishing-layout | Next.jsstyling-tips | Next.js
Pre-rendering and Data Fetching(사전 렌더링과 데이터 가져오기)
Pre-rendering(사전 렌더링)
기본적으로 Next.js 는 모든 페이지를 사전 렌더링한다.
클라이언트 사이드 자바스크립트로 모든 작업을 하는 대신, Next.js가 HTML을 각 페이지들을 위해 미리 생성한다는 것
사전 렌더링의 결과로 더 나은 성능과 SEO(검색엔진 최적화)를 얻을 수 있다.
각 생성된 HTML은 페이지들에 필요한 최소한의 자바스크립트 코드와 연결된다. 페이지가 브라우저에 의해 로드될 때, 자바스크립트가 실행되고 완벽히 상호작용 가능한 페이지를 만들어낸다. (이 작업은 hydration 이라고 부른다.)
- 자바스크립트의 실행 없이도 앱 UI를 볼 수 있게 해준다.
두가지 형태의 사전 렌더링
Static Generation(정적 생성)
- 빌드 시 HTML을 생성하는 사전 렌더링 방법이다. 그런 다음 사전 렌더링 된 HTML은 각 요청에서 재사용된다.
Server-side Rendering(서버 사이드 렌더링)
- 각 요청마다 HTML을 생성하는 사전 렌더링 방법이다.
개발 모드(npm run dev 또는 yarn dev 실행시)에서 모든 페이지는 정적 생성을 사용하는 페이지의 경우에도 각 요청에 대해 사전 렌더링된다.
❓ 언제 정적 생성을 사용해야 하고, 서버 사이드 렌더링을 사용하는지
가능하면 정적 생성(데이터 유무에 관계없이)을 사용하는 것을 추천
CDN 서버에서 페이지를 한 번 빌드하고 제공 할 수 있기 때문에, 매 요청마다 서버 사이드 렌더링을 사용하는 것 보다 훨씬 빠르다.
유저의 요청 전에 페이지를 미리 렌더링 할 수 있을까?
→ Yes 일 경우 정적 생성
→ No 일 경우 서버 사이드 렌더링
❗️ 'getStaticProps' 를 사용한 정적 생성과 데이터
Next.js 에서 페이지 컴포넌트를 내보낼 때, getStaticProps 라는 async 함수 또한 내보낼 수 있다.
- 프로덕션에서 getStaticProps 는 빌드 시 실행된다.
- 개발 모드에서 getStaticProps는 각 요청마다 실행된다.
- 함수 안에 외부 데이터를 가져오고 페이지의 props로 전달할 수 있다.
📌 getStaticProps
→ 서버 사이드에서만 작동함. 외부 api 엔드포인트와의 통신이나 데이터베이스에 직접적으로 쿼리를 날리는 것이 가능.
이 페이지는 데이터 종속성을 가지고 있으니 이 페이지를 Pre-rendering(사전 렌더링) 할 때, 데이터부터 해결해야 한다.
Basic Features: Data Fetching | Next.js
Dynamic Routes(동적 라우트)
외부 데이터에 따른 페이지 경로
동적 경로를 사용하여 페이지를 정적으로 생성하는 방법
pages/posts/[id].js 와 같이 [,] 로 감싼 페이지 생성
📌 getStaticPath
→ 빌드 시 정적으로 렌더링할 경로 설정. 여기서 정의하지 않은 하위 경로는 접근해도 화면이 뜨지 않는다.
동적라우팅 할 때, 라우팅되는 경우의 수를 하나하나 집어넣기
📌 getServerSideProps
→ 페이지가 요청받을 때마다 호출되어 pre-rendering(사전 렌더링) 한다.