이번에 Next.js 13.2버전이 나오면서 여러 기능들이 추가됐습니다. 어떤 내용인지 알아봅시다.
Built-in SEO Support
기존의 Next.js 12버전에서는 next/head
를 사용했고 Next.js 13버전에서는 head.js
파일에서 meta
태그나 open graph를 넣어줬죠.
Next.js 13.2에서는 좀 더 쉬운 인터페이스를 사용합니다.
아래 코드와 같이 static, dynamic 메타데이터를 define할 수 있습니다.
// app/layout.tsx
import type { Metadata } from 'next';
// static한 메타데이터
export const metadata: Metadata = {
title: 'Next.js 13.2',
description: 'Welcome to Next.js 13.2',
};
// dynamic한 메타데이터
export async function generateMetadata({ params, searchParams }) {
const product = await getProduct(params.id);
return { title: product.title };
}
Custom Route Handlers
Next.js 13.2 버전에서 api route 기능이 추가됐습니다. 기존 Next.js 12에서는 page/api
디렉토리에 정의해서 이를 사용했습니다. Next.js 13.2버전에서는 app/
디렉토리에 route.ts
라는 이름으로 정의해주면 됩니다. 다만 주의할 점으로 page.ts
와 같은 레벨에 위치할 수 없습니다. page.ts
도 request를 받기 때문에 conflict이 발생합니다. 이럴 경우에는 api/
디렉토리 하위에 넣으면 됩니다.
HTTP 메서드 정의를 함수의 이름으로 정의하면 됩니다.app/api/route.js
export async function GET(request) {
return new Response("Hello, Next.js 13.2!");
}
export async function POST(request) {
// do something
return new Response("Hello, Next.js 13.2!");
}
한가지 더 알아둬야할 점으로는 node.js와 edge runtime에서 Response
라는 추상화된 객체를 사용한다는 점입니다. 기존에는 node.js와 edge runtime에서 response로 사용하는 인터페이스가 달랐죠. 이를 추상화하여 사용하기 더 편하게 만든 것 같은데 DX를 고려한 설계인 것 같습니다.
Statically Typed Links
Link
컴포넌트 href
에 typing이 추가됐습니다. 존재하지 않은 route를 사용하면 typescript error가 발생합니다.
import Link from 'next/link'
// ✅
<Link href="/about" />
// ✅
<Link href="/blog/nextjs" />
// ✅
<Link href={`/blog/${slug}`} />
// ❌ TypeScript errors if href is not a valid route
<Link href="/aboot" />
Improved Error Overlay
에러가 발생했을때 이 에러가 react에서 발생한건지 next에서 발생한건지 더 직관적으로 알 수 있게끔 UI가 업데이트 됐습니다.
Next.js Cache
React server component에서 static, dynamic, revalidate를 fetch
api와 함께 설정할 수 있습니다.
아래 코드에서 보는 것과 같이 fetch
api의 옵션으로 설정하여 해당 데이터에 대한 캐쉬 전략을 다르게 가져갈 수 있습니다. 기존에 관심사가 분리된 인터페이스에서 컴포넌트와 함께 이러한 옵션들을 설정하도록 업데이트가 됐네요.
// app/page.jsx
export default async function Page() {
const [staticData, dynamicData, revalidatedData] = await Promise.all([
// Cached until manually invalidated
fetch(`https://...`),
// Refetched on every request
fetch(`https://...`, { cache: 'no-store' }),
// Cached with a lifetime of 10 seconds
fetch(`https://...`, { next: { revalidate: 10 } }),
]);
return <div>...</div>;
}
MDX for Server Components
mdx는 markdown에서 jsx 문법을 사용할 수 있도록 합니다. Next.js 13.2에서는 mdx를 사용해 content를 렌더링할 수 있습니다. 또는 remote에 있는 마크다운 contents를 가져와서 그릴 수 있는 기능도 있습니다.
Rust MDX Parser
mdx를 parser를 rust로 다시 썼다고 합니다. 기존에는 javascript parser를 사용하고 있었기 때문에 더 빠르게 parsing하겠네요.
Other improvements
https://nextjs.org/blog/next-13-2#other-improvements
마치며
Next.js는 하루가 멀다하고 새로운 기능이 계속해서 추가되고 있네요. 조금만 트렌드를 follow up하지 않으면 현업에서 사용하는 인터페이스가 언제 확 바뀔지 몰라서 계속 polling하면서 변화에 적응해야할 것 같습니다.
'Frontend' 카테고리의 다른 글
단위테스트 책 후기 (0) | 2023.06.08 |
---|---|
React rendering performance optimization (0) | 2023.04.27 |
TypeScript 4.9 버전 정리 (0) | 2023.02.26 |
Next.js proxy를 활용해 Analytics 이벤트를 수집해보자 (0) | 2023.02.21 |
디자인 패턴(Singleton, Facade)을 사용한 Analytics 코드설계 (0) | 2023.01.15 |