Next.js 14からNext.js 15への移行を検討している方向けに、Next.js 15.xの全バージョンの変更点を網羅的にまとめました。
リリース日程
cookies()、headers()、params が非同期化
// Before
const cookieStore = cookies()
const token = cookieStore.get('token')
// After
const cookieStore = await cookies()
const token = cookieStore.get('token')
fetch リクエスト、GET Route Handler、クライアントナビゲーションがデフォルトでキャッシュされない
開発環境でのTurbopackが安定版としてリリース
レスポンス完了後にタスクを実行するAPIが安定版に
import { after } from 'next/server'
export default function Layout({ children }) {
after(() => {
// ログ記録、分析などの二次的タスク
log()
})
return children
}
開発中にルートが静的か動的かを視覚的に表示
# 自動アップグレードCLI
npx @next/codemod@canary upgrade latest
# 手動アップグレード
npm install next@latest react@rc react-dom@rc
Pages RouterとApp Routerの両方でReact 19の安定版をサポート
セルフホストNext.jsサーバーのサポート改善、Server ActionsとRoute Handlersでの runtime API サポート
ソースマップの改善、ignoreListプロパティの実装によりアプリケーションコードに焦点を当てた表示
unauthorized と forbidden API の実験的サポート追加
import { unauthorized } from 'next/server'
export function GET() {
const user = getUser()
if (!user) {
unauthorized()
}
return Response.json({ user })
}
generateMetadata完了前に初期UIを送信可能に(ボットは除く)
最大57.6%のコンパイル時間短縮、30%のメモリ使用量削減
新デザインのエラーメッセージ、React owner stacksによる高精度エラー報告
Middlewareでの Node.js ランタイムサポート(実験的)
99.3%の統合テストが通る本番ビルドでのTurbopackサポート
パフォーマンス向上 CPUコア数に応じたスケールアップ: 4コア28%、16コア60%、30コア83%高速化
next build --turbopack
experimental.turbo から turbopack キーに移動
const nextConfig = {
turbopack: {
rules: {
'*.svg': {
loaders: ['@svgr/webpack'],
as: '*.js',
},
},
},
}
instrumentation-client.js|ts でフロントエンドコード実行前の監視設定が可能
onNavigate と useLinkStatus の追加
// onNavigate
<Link href="/page" onNavigate={(url) => {
console.log('Navigating to:', url)
}}>
Link
</Link>
// useLinkStatus
function MyComponent() {
const { pending } = useLinkStatus()
return <div>{pending ? 'Loading...' : 'Ready'}</div>
}
大規模コードベースでの60%のレスポンス時間改善、フリーズやクラッシュの解消
96%のテストが通るWebpack互換バンドラーnext-rspackのコミュニティサポート
next build --turbopack が8298の統合テスト全てをパス、vercel.comで実戦投入
Node.js Middleware(安定版)、Deployment Adapters(アルファ版)の準備
Dynamic IO、use cache、Partial Prerenderingを統合した cacheComponents フラグ
Node.js 18サポート、AMPサポート、一部のnext/image APIが非推奨化
本番ビルドでのTurbopackがベータ版に昇格、vercel.com、v0.app、nextjs.orgで実戦投入
パフォーマンス結果 顧客サイト: 4コアマシンで2倍、14コアマシンで2.2倍高速化
15.2で実験的だったNode.jsランタイムサポートが安定版に
export const config = {
runtime: 'nodejs', // Now stable!
}
TurbopackでのフルType Safetyとコンパイル時のリンクチェック
const nextConfig = {
typedRoutes: true, // Now stable!
}
PageProps、LayoutProps、RouteContextの自動生成
// Before: Manual typing
interface Props {
params: Promise<{ slug: string }>
children: React.ReactNode
}
// After: Automatic typing
export default function Layout(props: LayoutProps<'/dashboard'>) {
return <div>{props.children}</div>
}
next dev/build なしでの型生成が可能
next typegen && tsc --noEmit
Next.js 16でnext lintが削除、ESLintやBiomeへの移行推奨
# Migration codemod
npx @next/codemod@latest next-lint-to-eslint-cli .
legacyBehavior、AMP、next/image設定の非推奨警告追加
すべての request-specific API が非同期化されました:
// Next.js 14
export async function generateMetadata({ params }) {
const slug = params.slug // 同期
return { title: slug }
}
// Next.js 15
export async function generateMetadata({ params }) {
const slug = (await params).slug // 非同期
return { title: slug }
}
デフォルトでキャッシュされなくなった項目:
fetch() リクエストオプトインでキャッシュする方法:
// fetch with cache
fetch('/api/data', { cache: 'force-cache' })
// Route Handler with cache
export const dynamic = 'force-static'
// Client cache with staleTimes
const nextConfig = {
experimental: {
staleTimes: {
dynamic: 30,
static: 180,
},
},
}
NextRequest.geoNextRequest.ip@next/font パッケージnpx @next/codemod@canary upgrade latest
npm install next@latest react@latest react-dom@latest
npm install @types/react@latest @types/react-dom@latest
// Use the provided codemod or update manually
import { cookies } from 'next/headers'
export async function MyComponent() {
const cookieStore = await cookies()
const token = cookieStore.get('token')
return <div>{token}</div>
}
// Force caching where needed
const nextConfig = {
experimental: {
staleTimes: {
dynamic: 30,
static: 180,
},
},
}
予定されている主要変更:
この資料を参考に、プロジェクトの要件に応じてNext.js 15への移行計画を立てることをお勧めします。特に非同期APIとキャッシュの変更は影響が大きいため、十分なテストを行ってください。