카테고리 없음

next js 13에 대해 알아보자 (1)

썽연 2023. 6. 23. 02:18
728x90

next 13이 업데이트되면서 대규모 업데이트가 되었다

next.js의 13 업데이트 내용이 무엇일까 ?

Next.js 공식문서에 설명하는 변화점들은 다음과 같다.

  • app/ Directory (beta)
    • Laytous
    • React Server Components
    • Streaming
  • Trubopack (alpha)
  • New next/images (stable)
  • New @next/font (beta)
  • Improved next/link

등이 있다.

이번에는 app 디렉토리에 대해 알아보고자 한다.

app/ Directory

app Directory 는 현재 베타버전으로, 프로덕션 환경에서는 사용을 권하질 않는다고 공식홈페이지에선 말하고 있습니다.

next는 주요 라우팅을 pages 폴더 내에서 하고 있었는데,

app Directory가 생기면서 페이지는 물론이고, 레이아웃, 서버사이드렌더링, 데이터 fetch 등을 지원한다.

앱 디렉토리가 탐색 전체에서 상태를 유지하고 재렌더링을 방지하는 고급 라우팅 패턴을 활성화하는 복잡한 인터페이스를 쉽게 배치할 수 있습니다.

레이아웃을 중첩하고 구성 요소, 테스트 및 스타일과 같은 경로와 함께 애플리케이션 코드를 함께 배치할 수 있으며, 앱 디렉토리 내부에 page.js(ts)파일을 생성해야만 사용할 수 있다.

Server Component

앱 디렉토리는 리액트의 새로운 서버 컴포넌트의 아키텍처에 대해 지원한다고 한다.

// app/page.js
async function getData() {
  const res = await fetch('https://api.example.com/...');
  // The return value is *not* serialized
  // You can return Date, Map, Set, etc.
  return res.json();
}

// This is an async Server Component
export default async function Page() {
  const data = await getData();

  return <main>{/* ... */}</main>;
}

기존에는 useEffect 내부에서 data를 fetch하고, 특정 state에 저장하는 방식을 사용했어야 하는 next에서

컴포넌트 내에서 함수를 이용하여 data를 가지고 오고, 데이터를 바로 그릴 수 있다.

fetch에 3가지 옵션이 도입이 되었다고 한다.

  • fetch(URL, {cache : ‘force-cache’ })
    • build시에 가져온 데이터 사용, 직접 데이터 fetch하기 전까지 데이터 캐싱
    • = getStaticProps
  • fetch(URL, {cache: ‘no-store’})
    • 매 요청시마다 새로 fetch
    • = getServerSideProps
  • fetch(URL, {next: {revalidate: 10}});
    • next 옵션을 줌으로, cache되고 있는 data들을 fetch시킬 수 있으며, 초를 의미하여 10초 이후에 데이터가 refetch된다.

next/image

Next.js 13은 강력한 새 이미지 구성 요소를 도입하여 레이아웃의 변경 없이 이미지를 쉽게 표시하고 성능 향상을 위해 필요에 따라 파일을 최적화 할 수 있다.

Next.js 커뮤니티 설문 조사에서 응답자의 70%가 프로덕션 환경에서 next.js 이미지 구성 요소를 사용했으며 결과적으로 Core Web Vitals가 개선되었다.

import Image from 'next/image';
import avatar from './lee.png';
 
export default function Home() {
  // "alt" is now required for improved accessibility
  // optional: image files can be colocated inside the app/ directory
  return <Image alt="leeerob" src={avatar} placeholder="blur" />;
}

@next/font

새로운 글꼴 시스템을 도입한다.

  • 사용자 지정 글꼴을 포함하여 글꼴 자동 최적화
  • 개인 정보 보호 및 성능 향상을 위해 외부 네트워크 요청 제거
  • 모든 글꼴 파일에 대한 자동 자체 호스팅 내장
  • CSS를 사용하여 자동으로 제로 레이아웃 이동

next/link

next/link는 <a> 태그를 수동추가할 필요가 없다.

<Link href="/about">
  <a>About</a>
</Link>

로 사용했던 방식에서,

<Link href="/about">
  About
</Link>

와 같이 사용을 할 수 있다.

og이미지 생성

OG를 원활하게 작동할 수 있도록 @vercel/og 라는 라이브러리 생성

import { ImageResponse } from '@vercel/og';
 
export const config = {
  runtime: 'experimental-edge',
};
 
export default function () {
  return new ImageResponse(
    (
      <div
        style={{
          display: 'flex',
          fontSize: 128,
          background: 'white',
          width: '100%',
          height: '100%',
        }}
      >
        Hello, World!
      </div>
    ),
  );
}

Turbopack

Webpack의 새로운 Rust 기반 후속 제품인 Turbopack이 포함되어있다.

  • Webpack보다 700배 빠른 업데이트
  • Vite보다 10배 빠른 업데이트
  • Webpack보다 4배 빠른 업데이트

[참고자료]

https://nextjs.org/blog/next-13

https://velog.io/@hang_kem_0531/Next.js-13이-나와버렸다

728x90