| name | jikime-framework-nextjs@15 |
| description | Next.js 15 upgrade guide with breaking changes from 14. Async params, Turbopack stable, fetch caching changes. |
| tags | ["framework","nextjs","version","async-params","turbopack","react-19"] |
| triggers | {"keywords":["nextjs 15","next.js 15","async params","turbopack","react 19"],"phases":["run"],"agents":["frontend"],"languages":["typescript"]} |
| progressive_disclosure | {"enabled":true,"level1_tokens":"~100","level2_tokens":"~2022"} |
| type | version |
| framework | nextjs |
| version | 15 |
| previous_version | 14 |
| user-invocable | false |
Next.js 15 Upgrade Guide (from 14)
Next.js 14์์ 15๋ก ์
๊ทธ๋ ์ด๋ ์ ํ์ํ breaking changes์ ๋ง์ด๊ทธ๋ ์ด์
ํจํด์ ์ ์ํฉ๋๋ค.
Version Info
| ํญ๋ชฉ | ๊ฐ |
|---|
| Version | 15.0.0 ~ 15.x |
| Release Date | October 2024 |
| Node.js | 18.18+ (20+ recommended) |
| React | 19 RC |
Base Conventions (from Next.js 14)
๋ค์ ๊ท์น์ Next.js 14๋ถํฐ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค. ์์ธ ๋ด์ฉ์ jikime-framework-nextjs@14๋ฅผ ์ฐธ์กฐํ์ธ์.
| ๊ท์น | ์์ฝ |
|---|
| ํ๋ก์ ํธ ๊ตฌ์กฐ | src/app/ ๊ธฐ๋ฐ App Router, src/app/api/[endpoint]/route.ts API ๋ผ์ฐํธ |
| ๋ค์ด๋ฐ ๊ท์น | ํด๋/ํ์ผ: kebab-case, ์ปดํฌ๋ํธ export: PascalCase |
| UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ | shadcn/ui ํ์ ์ฌ์ฉ, lucide-react ์์ด์ฝ |
| ์คํ์ผ๋ง | Tailwind CSS + CSS variables ๊ธฐ๋ฐ ํ
๋ง |
Project Initialization (Next.js 15)
์ ํ๋ก์ ํธ๋ฅผ ์์ํ ๋๋ ๋ค์ ์์๋ก ์์ฑํฉ๋๋ค:
npx create-next-app@15 my-app --typescript --tailwind --eslint --app --src-dir
cd my-app
npx shadcn@latest init
npx shadcn@latest add button card input form table
CRITICAL: npx shadcn@latest init์ ๊ธฐ์กด Next.js ํ๋ก์ ํธ์์๋ง ์คํํฉ๋๋ค. ํ๋ก์ ํธ ์์ฑ์ ๋ฐ๋์ create-next-app์ผ๋ก ๋จผ์ ํด์ผ ํฉ๋๋ค.
Breaking Changes Summary
| ๋ณ๊ฒฝ ์ฌํญ | ์ํฅ๋ | ์๋ ์์ |
|---|
params/searchParams async | ๐ด High | codemod |
| fetch cache default ๋ณ๊ฒฝ | ๐ก Medium | Manual |
NextRequest.geo/ip ์ ๊ฑฐ | ๐ก Medium | Manual |
next/dynamic ssr ์ต์
| ๐ข Low | codemod |
| Runtime config ์ ๊ฑฐ | ๐ข Low | Manual |
1. Async Params (CRITICAL)
Before (Next.js 14)
type Props = {
params: { slug: string }
searchParams: { [key: string]: string | undefined }
}
export default function PostPage({ params, searchParams }: Props) {
const { slug } = params
const { sort } = searchParams
return <div>Post: {slug}</div>
}
export async function generateMetadata({ params }: Props) {
const post = await getPost(params.slug)
return { title: post.title }
}
After (Next.js 15)
type Props = {
params: Promise<{ slug: string }>
searchParams: Promise<{ [key: string]: string | undefined }>
}
export default async function PostPage({ params, searchParams }: Props) {
const { slug } = await params
const { sort } = await searchParams
return <div>Post: {slug}</div>
}
export async function generateMetadata({ params }: Props) {
const { slug } = await params
const post = await getPost(slug)
return { title: post.title }
}
Layout Props
type LayoutProps = {
children: React.ReactNode
params: { slug: string }
}
type LayoutProps = {
children: React.ReactNode
params: Promise<{ slug: string }>
}
export default async function Layout({ children, params }: LayoutProps) {
const { slug } = await params
return <div>{children}</div>
}
Codemod
npx @next/codemod@canary next-async-request-api .
2. Fetch Caching Default Change
Before (Next.js 14)
const data = await fetch('https://api.example.com/data')
After (Next.js 15)
const data = await fetch('https://api.example.com/data')
const data = await fetch('https://api.example.com/data', {
cache: 'force-cache'
})
const data = await fetch('https://api.example.com/data', {
next: { revalidate: 3600 }
})
Migration Strategy
const data = await fetch(url, { cache: 'force-cache' })
export const fetchCache = 'default-cache'
const nextConfig = {
experimental: {
staleTimes: {
dynamic: 30,
static: 180,
}
}
}
3. NextRequest Changes
geo/ip Removed
export function middleware(request: NextRequest) {
const { geo, ip } = request
const country = geo?.country
}
export function middleware(request: NextRequest) {
const country = request.headers.get('x-vercel-ip-country')
const ip = request.headers.get('x-forwarded-for')
import { geolocation, ipAddress } from '@vercel/functions'
const geo = geolocation(request)
const ip = ipAddress(request)
}
4. Dynamic Import Changes
ssr Option Renamed
const Component = dynamic(() => import('./component'), {
ssr: false
})
const Component = dynamic(() => import('./component'), {
ssr: false
})
import dynamic from 'next/dynamic'
const Component = dynamic(() => import('./component'), {
loading: () => <p>Loading...</p>
})
5. Runtime Config Removed
const nextConfig = {
serverRuntimeConfig: {
mySecret: 'secret'
},
publicRuntimeConfig: {
apiUrl: 'https://api.example.com'
}
}
import getConfig from 'next/config'
const { serverRuntimeConfig, publicRuntimeConfig } = getConfig()
MY_SECRET=secret
NEXT_PUBLIC_API_URL=https:
const apiUrl = process.env.NEXT_PUBLIC_API_URL
6. Turbopack (Stable for Dev)
next dev --turbo
{
"scripts": {
"dev": "next dev --turbo"
}
}
next.config.ts Support
import type { NextConfig } from 'next'
const nextConfig: NextConfig = {
}
export default nextConfig
7. React 19 Compatibility
New Hooks
'use client'
import { useFormStatus, useFormState } from 'react-dom'
import { useOptimistic, use } from 'react'
function SubmitButton() {
const { pending } = useFormStatus()
return <button disabled={pending}>Submit</button>
}
function TodoList({ todos }) {
const [optimisticTodos, addOptimisticTodo] = useOptimistic(
todos,
(state, newTodo) => [...state, newTodo]
)
}
Migration Checklist
Automated (Codemod)
Manual Review
Testing
Upgrade Commands
npm install next@15 react@19 react-dom@19
npx @next/codemod@canary next-async-request-api .
npm install -D @types/react@19 @types/react-dom@19
npm run build
npm run dev
Rollback Plan
If issues occur:
npm install next@14 react@18 react-dom@18
git checkout .
Related Skills
| ์คํฌ | ์ฉ๋ |
|---|
jikime-framework-nextjs@14 | Next.js 14 App Router ๊ธฐ๋ณธ ํจํด, ํ๋ก์ ํธ ๊ตฌ์กฐ, ๋ค์ด๋ฐ ๊ท์น, shadcn/ui |
jikime-framework-nextjs@16 | Next.js 16 ์
๊ทธ๋ ์ด๋ ๊ฐ์ด๋ ('use cache', PPR, updateTag) |
jikime-platform-vercel | Vercel ๋ฐฐํฌ, Edge Functions, ISR |
jikime-library-shadcn | shadcn/ui ์ปดํฌ๋ํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Next.js ํ์) |
Version: 1.1.0
Last Updated: 2026-01-23
Upgrade Path: Next.js 15 โ 16: See jikime-framework-nextjs@16