Next.js에서 새로운 13 버전이 나왔다.
더 발전할 게 없다고 분명 생각했는데.. 생각보다 많은것들이 달라져서 13 버전 블로그를 참고하며 내용을 정리해봤다.
이번 13버전을 코드로 직접 확인해보고 싶다면 이곳을 참고하면 된다.
최신버전으로 업데이트 하기
npm i next@latest react@latest react-dom@latest eslint-config-next@latest
layout.js
, page.js
아래에서 자세히 설명!pages
와 가장 다른점은, app
내의 파일들은 서버에서 React Server Component 구성요소로 렌더링된다. 이번 Next.js 13 버전에는 app 디렉터리 내에 다양한 파일들이 추가 되었다.
블로그에서는 아래와 같이 설명하고 있다.
<head>
tag for a given route.layout.js
은 subtree간 라우트 세그먼트에 동일한 UI를 제공해준다. 레이아웃은 상태와 상호작용을 유지하고, URL paths에 어떠한 영향을 미치지 않으므로 re-render 되지 않는다.
또한 레이아웃은 nesting 된다. 따라서, 위 그림처럼 app/layout.js 내에 dashboard/layout.js UI가 적용된다.
레이아웃 컴포넌트는 반드시 children
prop를 포함해야한다.
Root layout: Applies to all routes
Regular layout: Applies to specific routes
route segment, 기존 Next.js에서 사용하던 page 내의 파일과 큰 차이가 없어 보인다. 여전히 nesting 방식으로 작동된다.
loading.js
는 layout.js
하단에 위치하여 page.js
파일을 감싸는 <Suspense>
를 만든다.
React에서 Server, Client, Shared 컴포넌트에 대해 새롭게 업데이트 했다. (Server Components RFC 참고)
RFC를 사용하면, React 특징을 사용하면서 점진적으로 Next.js 앱에 React Server Components를 사용해볼 수 있다. (아직 React 내에서는 안정성 문제로 사용을 저어하고있다)
서버 컴포넌트를 사용하면, 클라이언트로 보내는 Javascript를 줄일 수 있어서 페이지 로드를 빠르게 해준다.
.server.js
.client.js
.js
자세한 내용은 이곳에서 확인 가능하다.
“use client” 라고 상위 컴포넌트에 명시되어 있지 않으면, 이는 Server Component로 간주 → React hook, state 사용할 수 없음.
이제 getStaticProps, getServerSideProps 사용 대신, 간편하게
use
hooks 사용으로 SSR을 대체할 수 있어졌다
import { use } from 'react';
async function getData() {
const res = await fetch('...');
const name: string = await res.json();
return name;
}
export default function Page() {
// This value is fully typed
// The return value is *not* serialized
// so you can return Date, Map, Set, etc.
const name = use(getData());
return '...';
}
The new use
hook replaces previous Next.js APIs like getStaticProps
and getServerSideProps
and aligns with the future of React.
use hook을 사용하면 fetch, cache, 데이터 재검증을 컴포넌트 레벨에서 가능해진다.
Introducing Turbopack: Rust-based successor to Webpack - Vercel
next dev --turbo
로 엔진을 실행에 캐시에 저장할 수 있다Next.js 13 introduces a powerful new Image component, allowing you to easily display images without layout shift and optimize files on-demand for increased performance.
alt
를 기본으로 주면서 접근성 향상import Image from 'next/image';
import avatar from './lee.png';
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" />;
}
CSS와 폰트파일은 빌드타임에 다운로드되고, static assets은 self-host 되기때문에 브라우저에서 Google로 요청이 없다.
import { Inter } from '@next/font/google';
const inter = Inter();
<html className={inter.className}>
더이상 <a>
태그를 자식 요소로 포함하지 않아도 된다.
기존에는 <a>
태그가 아닌 다른 태그 요소를 활용시, passHref
라는 속성이 필요했는데, 이제 더이상 사용하지 않아도 된다. (기본으로 포함)
// Next.js 13: `<Link>` always renders `<a>`
<Link href="/about">
About
</Link>