Upgrade dari Next.js 15 ke Next.js 16 paling cepat dilakukan lewat codemod
resmi npx @next/codemod@canary upgrade latest, yang otomatis memperbarui
konfigurasi Turbopack, mengganti middleware jadi proxy, dan menghapus
prefix unstable_ yang sudah stabil. Setelah itu, langkah manual yang wajib
dicek: breaking change Turbopack sebagai bundler default dan akses asinkron
penuh untuk params/searchParams/cookies()/headers().
Ringkasan cepat:
- Cara tercepat upgrade: jalankan codemod resmi
npx @next/codemod@canary upgrade latest, yang otomatis membenahi konfigurasi Turbopack, migrasimiddlewarekeproxy, dan menghapus prefixunstable_yang sudah stabil. - Turbopack jadi bundler default untuk
next devmaupunnext build, bukan lagi opt-in lewat flag — proyek denganwebpack()kustom dinext.configperlu dimigrasikan atau memakai flag--webpack. - Akses
params,searchParams,cookies(),headers(), dandraftMode()wajib lewatawait; mode kompatibilitas sinkron dari Next.js 15 sudah dihapus total. - Flag eksperimental
dynamicIO/pprdigantikan opsi stabilcacheComponents, danrevalidateTagsekarang butuh argumen kedua berupa profilcacheLife. - Setelah semua langkah dijalankan,
npm run buildwajib dipakai untuk menangkap breaking change yang tidak selalu tertangkap codemod, seperti konfigurasiwebpackkustom atau parallel routes tanpadefault.js.
Apa yang Berubah Besar di Next.js 16?
Tiga perubahan paling berdampak untuk kebanyakan proyek App Router: Turbopack
jadi bundler default untuk next dev maupun next build (bukan lagi opt-in
lewat flag), dukungan akses sinkron sementara untuk params/searchParams/
cookies()/headers() yang diperkenalkan di Next.js 15 sudah dihapus total,
dan flag eksperimental dynamicIO/ppr digantikan opsi stabil
cacheComponents. Menurut dokumentasi resmi upgrade Next.js 16,
proyek juga perlu Node.js minimal 20.9 dan TypeScript minimal 5.1.
Opsi cacheComponents ini yang membuat Partial Prerendering (PPR) jadi
stabil — static shell
sebuah route diprerender saat build, lalu bagian dinamis di-stream
belakangan lewat batas <Suspense>.
Situs ini sendiri (irfanramadhan.com) masih berjalan di Next.js 15.5 saat artikel ini ditulis, jadi langkah-langkah di bawah adalah urutan yang sama yang akan dijalankan saat proyek ini nanti dimigrasikan.
Ringkasan Perubahan yang Perlu Dicek
- Turbopack default untuk dev dan build, proyek dengan konfigurasi
webpackkustom dinext.configakan gagal build kecuali dimigrasikan atau memakai flag--webpack. - Opsi
turbopackpindah dariexperimental.turbopackke level atasnext.config. params,searchParams,cookies(),headers(),draftMode()wajib diakses denganawait, tidak ada lagi mode kompatibilitas sinkron.experimental.dynamicIOdanexperimental.pprdihapus, digantikan opsi stabilcacheComponents: true.revalidateTagsekarang butuh argumen kedua berupa profilcacheLife(mis.revalidateTag('posts', 'max')), bukan lagi argumen tunggal.- File
middleware.tsdiganti nama jadiproxy.tsdengan fungsi bernamaproxy(runtimeedgetidak didukung diproxy, hanyanodejs). - Fitur lama dihapus total: dukungan AMP, perintah
next lint,serverRuntimeConfig/publicRuntimeConfig, dan beberapa opsidevIndicators.
Dokumentasi resmi menjelaskan perubahan revalidateTag ini secara
eksplisit, termasuk konsekuensinya kalau argumen kedua tidak ditambahkan:
revalidateTag now requires a second argument specifying a cacheLife profile. The single-argument form is deprecated and will produce a TypeScript error.
Diringkas dalam tabel, tujuh perubahan di atas beserta tindakan yang perlu dilakukan:
| Perubahan | Tindakan yang Diperlukan |
|---|---|
| Turbopack default untuk dev & build | Migrasikan konfigurasi webpack kustom, atau pakai flag --webpack |
Opsi turbopack pindah level | Dari experimental.turbopack ke level atas next.config |
Akses params/searchParams/cookies()/headers() | Wajib lewat await, mode sinkron sudah dihapus total |
experimental.dynamicIO/experimental.ppr dihapus | Ganti ke opsi stabil cacheComponents: true |
revalidateTag butuh argumen kedua | Tambahkan profil cacheLife, mis. revalidateTag('posts', 'max') |
middleware.ts jadi proxy.ts | Ganti nama file dan fungsi, edge runtime tidak didukung di proxy |
| Fitur lama dihapus total | AMP, next lint, serverRuntimeConfig/publicRuntimeConfig, sebagian devIndicators |
Bagaimana Cara Upgrade ke Next.js 16 Langkah demi Langkah?
Urutan berikut mengikuti panduan resmi Next.js, dari cara tercepat (codemod otomatis) sampai verifikasi manual untuk breaking change yang tidak selalu tertangkap otomatis.
1. Jalankan Codemod Upgrade Resmi
npx @next/codemod@canary upgrade latestCodemod ini memperbarui next.config untuk memakai konfigurasi turbopack
baru, memigrasikan konvensi middleware yang sudah deprecated ke proxy,
menghapus prefix unstable_ dari API yang sudah stabil (mis. cacheLife,
cacheTag), dan menghapus Route Segment Config experimental_ppr yang
sudah tidak berlaku.
Kalau proyek masih memakai akses sinkron ke params, searchParams,
cookies(), headers(), atau draftMode() dari masa kompatibilitas
Next.js 15, jalankan juga codemod terpisah untuk API asinkron:
npx @next/codemod@canary next-async-request-api .2. Atau Instal Paket Secara Manual
Kalau lebih suka kontrol manual daripada codemod otomatis:
npm install next@latest react@latest react-dom@latestKalau proyek memakai TypeScript, perbarui juga @types/react dan
@types/react-dom ke versi terbaru supaya tipe params/searchParams
(sekarang berbasis Promise) tidak menimbulkan error tipe yang membingungkan.
3. Sesuaikan Skrip Turbopack di package.json
Karena Turbopack sudah jadi default, flag --turbopack yang sebelumnya
ditulis manual di skrip dev/build tidak lagi diperlukan:
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
}
}Kalau proyek masih punya konfigurasi webpack kustom di next.config dan
belum sempat dimigrasikan ke opsi Turbopack yang setara, next build akan
gagal secara sengaja untuk mencegah salah konfigurasi. Tiga opsi yang
tersedia: migrasikan konfigurasi webpack ke opsi Turbopack, jalankan
next build --turbopack untuk mengabaikan config webpack lama, atau tetap
pakai next build --webpack untuk opt-out dari Turbopack sepenuhnya.
If your project has a custom webpack configuration and you run next build (which now uses Turbopack by default), the build will fail to prevent misconfiguration issues.
4. Perbaiki Akses Sinkron ke Params dan SearchParams
Ini penyebab error paling umum setelah upgrade. Semua akses ke params,
searchParams, cookies(), dan headers() sekarang wajib lewat await:
// Sebelum (Next.js 15, mode kompatibilitas sinkron - sudah tidak berlaku)
export default function Page({ params }: { params: { slug: string } }) {
return <h1>{params.slug}</h1>;
}
// Sesudah (Next.js 16, wajib async)
export default async function Page({
params,
}: {
params: Promise<{ slug: string }>;
}) {
const { slug } = await params;
return <h1>{slug}</h1>;
}Untuk mempermudah migrasi tipe, jalankan npx next typegen agar Next.js
menghasilkan helper tipe global (PageProps, LayoutProps,
RouteContext) yang sudah otomatis membungkus params/searchParams
sebagai Promise.
5. Verifikasi Build dan Jalankan Aplikasi
Setelah semua langkah di atas, jalankan build produksi untuk memastikan tidak ada breaking change yang terlewat:
npm run build
npm run startPerhatikan log build untuk peringatan terkait konfigurasi images
(domains yang deprecated jadi remotePatterns, minimumCacheTTL default
berubah dari 60 detik jadi 4 jam) dan parallel routes yang sekarang wajib
punya file default.js eksplisit di setiap slot, kalau tidak build akan
gagal.
Kalau build masih gagal setelah codemod (mis. error webpack config found, akses params/searchParams sinkron, atau parallel routes tanpa
default.js), artikel cara memperbaiki error upgrade Next.js
16 membahas keempat error
paling sering muncul beserta perbaikannya satu per satu.
Kenapa Turbopack Jadi Default Berdampak Besar?
Turbopack menjadi bundler default untuk next dev maupun next build mulai
Next.js 16, bukan lagi eksperimen di balik flag --turbopack. Dampak
praktisnya: proyek yang mengandalkan webpack() kustom di next.config
untuk hal seperti loader tambahan atau alias resolusi modul perlu
memigrasikan konfigurasi itu ke opsi turbopack yang setara sebelum build
produksi berhasil tanpa flag --webpack.
Rincian klaim performa (build 2-5x lebih cepat, Fast Refresh hingga 10x)
dan cara opt-out lewat flag --webpack dibahas lebih dalam di artikel
khusus Turbopack jadi default di Next.js 16.
Perubahan ini melanjutkan arah yang sudah dibahas di artikel React
Compiler Next.js sebelumnya.
Next.js 16 juga menstabilkan dukungan React Compiler bawaan (opsi
reactCompiler naik dari status eksperimental), sehingga proyek yang sudah
memakainya di Next.js 15 tinggal melanjutkan tanpa perubahan tambahan.
Ringkasan: Codemod Resmi, Breaking Change Wajib Cek, dan Verifikasi Build
- Cara tercepat upgrade adalah codemod resmi
npx @next/codemod@canary upgrade latest, yang menangani sebagian besar perubahan mekanis (konfigurasi Turbopack, migrasimiddlewarekeproxy, penghapusan prefixunstable_) secara otomatis. - Dua breaking change yang paling sering bikin build gagal: konfigurasi
webpackkustom yang belum dimigrasikan ke Turbopack, dan akses sinkron keparams/searchParams/cookies()/headers()yang sekarang wajibawait. - Kalau proyek masih memakai
revalidateTagdengan argumen tunggal, itu juga perlu diperbarui. Perbandingan lengkap opsi caching Next.js App Router sudah dibahas di artikel revalidatePath vs revalidateTag. - Selalu jalankan
npm run buildsetelah migrasi untuk menangkap breaking change yang tidak selalu terlihat lewat codemod saja. Kalau butuh bantuan audit atau migrasi proyek Next.js, lihat layanan web development yang ditawarkan. - Setelah migrasi selesai, dev server Next.js 16 membuka endpoint
/_next/mcpyang bisa disambungkan ke AI coding assistant lewat Next.js Devtools MCP — fitur ini tidak tersedia di Next.js 15.
