Vercelํ์ด Next.js์ 13๋ฒ์ ์ด 2022๋ 10์ 26์ผ Next.js ๊ณต์ ํ์ด์ง์ ์๊ฐ๋์์ง๋ง,
์์ธํ ์ดํด๋ณด์ง๋ฅผ ์์๋๋ฐ ์๋ก ์ด์งํ๊ฒ๋ ํ์ฌ์์ Next13์ผ๋ก ํ๋ก์ ํธ๋ฅผ ์๋ก ์ธํ ํ๊ธฐ๋ก ์ด์ผ๊ธฐ๊ฐ ๋์ด
๊ณต์ ๋ธ๋ก๊ทธ ๋ด์ฉ์ ์ดํด๋ณด์๋ค.
++Next.js 13.4(ํ์ฌ ๊ธฐ์ค ์ต์ ๋ฒ์ )์ ์ฌ์ฉํ๋ ค๋ฉด ์๋์ ๋ช ๋ น์ด๋ฅผ ํตํด ์ค์นํ ์ ์๋ค.
npm i next@latest react@latest react-dom@latest eslint-config-next@latest
์ฑ ๋ผ์ฐํ (App Directory) - Next.13.4(ํ์ฌ)๊ธฐ์ค Stable
๊ธฐ์กด์ pages/ ๋๋ ํ ๋ฆฌ์์ ๋ผ์ฐํ ๋๋ ๋ฐฉ์๊ณผ ๋ค๋ฅด๊ฒ, app/ ๋๋ ํ ๋ฆฌ๋ก ๋ผ์ฐํ ํ๋ ๋ฐฉ์์ด ์ถ๊ฐ๋์๋ค.
- Tree : ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์๊ฐํ ํ๊ธฐ์ํ ๊ท์น์ผ๋ก, ์๋ฅผ ๋ค์ด ์์ ๋ฐ ํ์ ๊ตฌ์ฑ ์์๊ฐ ์๋ ์ปดํฌ๋ํธ ํธ๋ฆฌ, ํด๋ ๊ตฌ์กฐ์ด๋ค.
- Subtree : ์ ๋ฃจํธ(์ฒ์)์์ ์์ํ์ฌ ์(๋ง์ง๋ง)์์ ๋๋๋ ํธ๋ฆฌ์ ์ผ๋ถ์ด๋ค.
- Root : ๋ฃจํธ ๋ ์์ด์๊ณผ ๊ฐ์ ํธ๋ฆฌ ๋๋ ํ์ ํธ๋ฆฌ์ ์ฒซ ๋ฒ์งธ ๋ ธ๋์ด๋ค.
- Leaf: ํ์ ํธ๋ฆฌ์ ํ์ ํญ๋ชฉ์ด ์๋ ๋ ธ๋(์: URL ๊ฒฝ๋ก์ ๋ง์ง๋ง segment.)
๊ธฐ์กด์ pages ๋ผ์ฐํฐ ๋ฐฉ์
/ Pages Router
// pages/about.js
import React from 'react';
export default () => <h1>About us</h1>;
์๋ก์ด ์ฑ ๋ผ์ฐํฐ ๋ฐฉ์
// New: App Router โจ
// app/layout.js
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}
// app/page.js
export default function Page() {
return <h1>Hello, Next.js!</h1>;
}
1. Layouts
์ํ๋ฅผ ์ ์งํ๊ณ , ๋น์ฉ์ด ๋ง์ด ๋๋ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํ๋ฉด์ ๊ฒฝ๋ก ๊ฐ์ UI๋ฅผ ์ฝ๊ฒ ๊ณต์ ํ ์ ์๋ค.
์๋์ ํ์ผ ์์คํ ์ ํตํด ๋ ์ด์์์ ์ ์ํ ์ ์๋ค. ๋ ์ด์์์ ์ฌ๋ฌ ํ์ด์ง ๊ฐ์ UI ๋ฅผ ๊ณต์ ํ๋ค.
๋ค๋น๊ฒ์ด์ ์์์, ๋ ์ด์์์ ์ํ๋ฅผ ์ ์งํ๊ณ , ์ํธ์์ฉํ ์ ์์ผ๋ฉฐ, ๋ฆฌ๋ ๋๋ง ํ์ง ์๋๋ค.
// app/page.js
// This file maps to the index route (/)
export default function Page() {
return <h1>Hello, Next.js!</h1>;
}
// app/blog/layout.js
export default function BlogLayout({ children }) {
return <section>{children}</section>;
}
2. React Server Components
๊ฐ์ฅ ๋์ ์ธ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด ์๋ฒ ์ฐ์ (server-first)์ ๊ธฐ๋ณธ๊ฐ(default)์ผ๋ก ์ค์ ํ๋ค.
app/ ๋๋ ํ ๋ฆฌ๋ React์ ์๋ก์ด Server Components ์ํคํ ์ณ๋ฅผ ์ง์ํ๋. ์๋ฒ ์ปดํฌ๋ํธ์ ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ๋ ๊ฐ๊ฐ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ฅ ์ ํฉํ ์ผ์ ์ฌ์ฉ๋๋ฉฐ, ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์ ๊ฒฝํ์ ํฅ์์ํค๊ณ ๋น ๋ฅด๊ณ ๋งค์ฐ ์ธํฐ๋ํฐ๋ธํ ์ฑ์ ๋จ์ผ ํ๋ก๊ทธ๋๋ฐ ๋ชจ๋ธ๋ก ๊ตฌ์ถํ ์ ์๋ค.
์๋ฒ ๊ตฌ์ฑ์์๋ฅผ ์ฌ์ฉํ๋ฉด, ๋ณต์กํ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๋ ๋์์ ํด๋ผ์ด์ธํธ๋ก ์ ์ก๋๋ JavaScript์ ์์ ์ค์ฌ, ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๋๋ฅผ ๋์ผ ์ ์๋ค.
๊ฒฝ๋ก(route)๊ฐ ๋ก๋๋ ๋, Next.js ๋ฐ React ๋ฐํ์์ด ๋ก๋๋์ด ์บ์๊ฐ ๊ฐ๋ฅํ๊ณ ํฌ๊ธฐ๋ฅผ ์์ธกํ ์ ์๋ค.
์ด ๋ฐํ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ปค์ ธ๋ ํฌ๊ธฐ๊ฐ ์ฆ๊ฐํ์ง ์๊ณ , ๋น๋๊ธฐ๋ก ๋ก๋๋์ด ์๋ฒ๋ก๋ถํฐ HTML์ด ํด๋ผ์ด์ธํธ์์ ์ ์ง์ ์ผ๋ก ๊ฐ์ ๋ ์ ์๋๋ก ํ๋ค.
3. Streaming
๋ ๋๋ง ์ ์ฆ์ ๋ก๋ ์ํ ๋ฐ ์คํธ๋ฆผ์ UI๋จ์๋ก ํ์ํ๋ค. app/ ๋๋ ํ ๋ฆฌ๋ UI์ ๋ ๋๋ง ๋จ์๋ฅผ ์ ์ง์ ์ผ๋ก ๋ ๋๋งํ๊ณ ๋ ๋๋ง๋ ๋จ์๋ฅผ ํด๋ผ์ด์ธํธ๋ก ๋ถ๋ถ์ ์ผ๋ก ์คํธ๋ฆฌ๋ฐํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
Next.js์ Server Components์ ์ค์ฒฉ๋ ๋ ์ด์์์ ์ฌ์ฉํ๋ฉด, ๋ฐ์ดํฐ๋ฅผ ๋ช ์์ ์ผ๋ก ํ์๋กํ์ง ์๋ ํ์ด์ง ๋ถ๋ถ์ ์ฆ์ ๋ ๋๋งํ๊ณ , ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ํ์ด์ง ๋ถ๋ถ์๋ ๋ก๋ฉ ์ํ๋ฅผ ํ์ํ ์ ์๋ค. ์ด ๋ฐฉ์์ ํตํด ์ฌ์ฉ์๋ ์ ์ฒด ํ์ด์ง๊ฐ ๋ก๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆด ํ์ ์์ด, ์ฆ์ ์ํธ ์์ฉํ ์ ์๋ค.
Vercel์ ๋ฐฐํฌ๋ Next.js 13 ์ ํ๋ฆฌ์ผ์ด์ ์ app/ ๋๋ ํ ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ต์ ์คํธ๋ฆฌ๋ฐํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํจ๋ค. ์ด ์คํธ๋ฆฌ๋ฐ์ Node.js ๋ฐ Edge ๋ฐํ์์์ ๋ชจ๋ ์ ์ฉ๋๋ค.
Turbopack (Beta - Next.js 13.4 ํ์ฌ ๊ธฐ์ค)
์ต๋ 700๋ฐฐ ๋น ๋ฅธ Rust๊ธฐ๋ฐ Webpack ๋์ฒด.
Vite๋ณด๋ค 10๋ฐฐ ๋น ๋ฅด๋ค.
New next/image
native ๋ธ๋ผ์ฐ์ ์ ๋๋ฆฐ ๋ก๋ฉ์ผ๋ก ๋์ฑ ๋นจ๋ผ์ง.
Next.js 13 ์์๋ ๊ฐ๋ ฅํ ์๋ก์ด Image ์ปดํฌ๋ํธ๋ฅผ ๋์
ํ์ฌ ๋ ์ด์์ ๋ณ๋ ์์ด ์ด๋ฏธ์ง๋ฅผ ์ฝ๊ฒ ํ์ํ๊ณ , ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ํ์ผ์ ์์ฒญ์ ๋ฐ๋ผ ์ต์ ํํ ์ ์๋ค.
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" />;
}
์ฃผ์ํน์ง
- ํด๋ผ์ด์ธํธ ์ธก JavaScript๊ฐ ๋ ์ ๊ฒ ํฌํจ๋์๋ค.
- ์คํ์ผ๋ง๊ณผ ๊ตฌ์ฑ์ด ๋ ์ฝ๋ค.
- ๊ธฐ๋ณธ์ ์ผ๋ก altํ๊ทธ๊ฐ ํ์ํ์ฌ ์ ๊ทผ์ฑ์ด ๊ฐ์ ๋๋ค.
- ์น ํ๋ซํผ๊ณผ ์ผ์นํ๋ค.
- ๋ค์ดํฐ๋ธ ๋ ์ด์ง ๋ก๋ฉ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ๋นจ๋ผ ์๋ถํ(hydration)๊ฐ ํ์ํ์ง ์๋ค.
New @next/font
๋ ์ด์์ ์ด๋์ด ํ์ ์๋ ์๋ ์์ฒด ํธ์คํ ํฐํธ.
import { Inter } from '@next/font/google';
const inter = Inter();
<html className={inter.className}>
import localFont from '@next/font/local';
const myFont = localFont({ src: './my-font.woff2' });
<html className={myFont.className}>
Next.js 13์์๋ ๋ค์๊ณผ ๊ฐ์ ์๋ก์ด ํฐํธ ์์คํ ์ ๋์ ํ๋ค.
- ์ฌ์ฉ์ ์ ์ ํฐํธ๋ฅผ ํฌํจํ ํฐํธ๋ฅผ ์๋์ผ๋ก ์ต์ ํํ๋ค.
- ๊ฐ์ธ ์ ๋ณด ๋ณดํธ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ธ๋ถ ๋คํธ์ํฌ ์์ฒญ์ ์ ๊ฑฐํ๋ค.
- ํฐํธ ํ์ผ์ ๋ํ ๋ด์ฅ ์๋ ์ ํ ํธ์คํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
- CSS์ size-adjust ์์ฑ์ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ๋ ์ด์์ ๋ณ๋์ ์ ๊ฑฐํ๋ค.
์ด๋ฐ ์๋ก์ด ํฐํธ ์์คํ ์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ๊ณผ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ๋ฅผ ๊ณ ๋ คํ์ฌ ๋ชจ๋ Google Font๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. CSS์ ํฐํธ ํ์ผ์ ๋น๋ ์๊ฐ์ ๋ค์ด๋ก๋ ๋๋ฉฐ, static assets๊ณผ ํจ๊ป ์์ฒด ํธ์คํ ๋๋ค. ๋ธ๋ผ์ฐ์ ์์ Google๋ก ์์ฒญ์ด ์ ์ก๋์ง ์๋๋ค.
Improved next/link
์๋ <a>๋ฅผ ๊ฐ์ธ๋ ๋จ์ํ๋ API
next/link๋ ๋ ์ด์ ์๋์ผ๋ก <a>ํ๊ทธ๋ฅผ ํ์๋ก ์ถ๊ฐํ ํ์๊ฐ ์๋ค. Next.js 13์์ <Link>๋ ํญ์ <a>๋ฅผ ๋ ๋๋งํ๋ค.
import Link from 'next/link'
// Next.js 12: `<a>` has to be nested otherwise it's excluded
<Link href="/about">
<a>About</a>
</Link>
// Next.js 13: `<Link>` always renders `<a>`
<Link href="/about">
About
</Link>
๐ธ ์ถ์ฒ ๐ธ
nextjs.org-Using App Router Docs
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ React ] Suspense๋ ๋ฌด์์ผ๊น? (0) | 2023.07.16 |
---|---|
[ Next.js ] Next13์์ ์ปค์คํ Font ์ธํ ํ๊ธฐ. (App Router ๊ธฐ์ค) (0) | 2023.06.20 |
[ React ] ์ํ ๊ด๋ฆฌ ํด ๋น๊ต ๋ถ์ Recoil vs Zustand (0) | 2023.05.21 |
[ React ] React Props ์์๋ณด๊ธฐ. (0) | 2023.03.20 |
[ webpack ] React(๋ฆฌ์กํธ)์ webpack(์นํฉ) (0) | 2023.03.05 |