Next.js 16 Turbopack Production Builds: Was sich geändert hat und wie wir migrierten
Wir beobachteten, wie Turbopack seit seiner Ankündigung 2022 reifte, führten es seit Next.js 14 im Dev-Modus aus und beäugten vorsichtig jene „turbo"-Flags in CI. Als Next.js 16 Anfang 2025 mit Turbopack als Standard-Production-Bundler eingeführt wurde, wussten wir, dass die Migration nicht länger warten konnte. Wir hatten drei Client-Projekte auf Next.js 15, die ein Upgrade brauchten, und ich werde dich durch jede signifikante Änderung, die Fallstricke, auf die wir stießen, und die Performance-Zahlen auf der anderen Seite führen.
Das ist keine Umarbeitung der Release Notes. Das ist, was tatsächlich passierte, als wir next build mit Turbopack auf echten Codebases mit echter Komplexität ausführten.
Inhaltsverzeichnis
- Warum Next.js 16 ein großes Ding ist
- Was sich tatsächlich mit Turbopack in Production geändert hat
- Build-Performance-Benchmarks
- Breaking Changes, die du kennen musst
- Unser Migrationsprozess Schritt für Schritt
- Webpack-Config-Übersetzungen
- Mit Third-Party-Paketen umgehen
- CSS und Tailwind-Überlegungen
- Deployment- und CI-Pipeline-Updates
- Wann du NICHT noch migrieren solltest
- FAQ

Warum Next.js 16 ein großes Ding ist
Next.js 16 ist nicht nur ein Versionssprung. Es stellt die bedeutendste Änderung der Build-Infrastruktur dar, seit das Framework vom Pages zum App Router wechselte. Das Headline-Feature ist offensichtlich: Turbopack ersetzt webpack als Standard-Bundler sowohl für Development- als auch für Production-Builds.
Aber es passiert noch mehr. Next.js 16 wird auch geliefert mit:
- React 19 als Mindestversion — keine React 18-Kompatibilität mehr
- Verbesserte Streaming und Partial Prerendering-Reife
- Neue Caching-Standards, die tatsächlich sinnvoll sind (sie lernten aus dem Next.js 15 Caching-Backlash)
- Async Request APIs vollständig erzwungen —
cookies(),headers()undparamssind jetzt alle async ohne Legacy-Sync-Support - Node.js 20 Mindestanforderung — Node 18-Support ist weg
Für Agenturen wie unsere, die Next.js-Entwicklung betreiben, ist das die Art von Release, die alles berührt. Du kannst nicht einfach eine Versionsnummer erhöhen und es einen Tag nennen.
Was sich tatsächlich mit Turbopack in Production geändert hat
Lass uns konkret werden. Während Next.js 14 und 15 war Turbopack für next dev mit dem --turbo-Flag verfügbar. Production-Builds verwendeten immer noch webpack. Next.js 15.3 führte ein experimentelles --turbopack-Flag für next build ein, und bis 16 geliefert wurde, wurde es zur Standard.
Hier ist, was grundlegend unterschiedlich ist, wie Turbopack Production-Builds im Vergleich zu webpack verarbeitet:
Inkrementelle Compilierungs-Architektur
Webpack verarbeitet dein gesamtes Dependency-Graph bei jedem Build. Turbopack verwendet ein Function-Level-Caching-System, das auf der Turbo-Engine (geschrieben in Rust) aufgebaut ist. In der Praxis bedeutet das, dass nachfolgende Builds nur neu kompilieren, was sich tatsächlich geändert hat. Dein erster Build ist möglicherweise nicht dramatisch schneller, aber dein zweiter, dritter und zehnter Build werden es sein.
Tree Shaking-Verbesserungen
Turbopack's Tree Shaking arbeitet auf einer granulareren Ebene als webpack's. Wir beobachteten, dass unsere Client-Bundles durchschnittlich 8-15% kleiner waren, ohne Code-Änderungen. Die größten Gewinne kamen aus der Barrel-File-Behandlung — Turbopack ist wirklich besser darin, ungenutzte Re-Exporte aus Index-Dateien zu eliminieren.
Modul-Auflösung
Turbopack löst Module anders auf. Es ist schneller, aber auch strenger. Wenn du irgendwelche schlampigen Import-Pfade hattest, die webpack stillschweigend auflöste (wie fehlende Datei-Erweiterungen in bestimmten Grenzfällen oder Pfade, die auf macOS case-insensitiv sind, aber auf Linux brechen), wird Turbopack sie finden. Das verursachte etwa 30% unserer Migrationsprobleme.
Code-Splitting-Strategie
Der Chunk-Splitting-Algorithmus ist neu. Turbopack erstellt standardmäßig mehr, kleinere Chunks. Das verbessert im Allgemeinen die Ladeperformance für moderne Browser mit HTTP/2, kann aber die Gesamtzahl der Anfragen erhöhen. Wir sahen, dass die Chunk-Anzahl um ungefähr 40% stieg, während die Gesamtgröße des Bundles sank.
SWC ist jetzt obligatorisch
Wenn du immer noch an einer Babel-Konfiguration hängtest, ist sie weg. Turbopack verwendet ausschließlich SWC für die Transformation. Das war bereits die Richtung, die die Dinge nahmen, aber Next.js 16 entfernt jeden Fallback zu Babel vollständig.
Build-Performance-Benchmarks
Hier sind echte Zahlen aus unseren drei Migrationsprojekten. Dies sind keine synthetischen Benchmarks — sie stammen aus echten Client-Anwendungen, die in unserer CI-Pipeline auf GitHub Actions (Ubuntu, 4 vCPU, 16GB RAM-Runner) laufen.
| Metrik | Projekt A (E-Commerce) | Projekt B (SaaS Dashboard) | Projekt C (Content Site) |
|---|---|---|---|
| Seiten/Routes | 847 | 124 | 2.340 |
| webpack build (Next 15) | 4m 32s | 1m 48s | 6m 15s |
| Turbopack build (Next 16, cold) | 3m 10s | 1m 22s | 4m 44s |
| Turbopack build (Next 16, warm cache) | 1m 05s | 28s | 1m 52s |
| Bundle-Größenänderung | -12% | -8% | -14% |
| JS First Load (Homepage) | -18KB | -7KB | -22KB |
| Build-Speicherspitze | 3.8GB → 2.9GB | 1.6GB → 1.2GB | 4.2GB → 3.1GB |
Die Zahlen des warmen Cache sind die echte Geschichte. Einmal, wenn Turbopack dein Projekt gebaut hat, sind inkrementelle Wiederaufbau dramatisch schneller. Für unser content-schweres Projekt C (das ein Headless-CMS mit Tausenden statisch generierter Seiten verwendet), war der Wechsel von 6+ Minuten auf unter 2 Minuten bei gecachten Builds signifikant. Das ist echtes Geld, das bei CI-Minuten gespart wird.
Speichernutzungsverbesserungen waren ebenfalls bedeutsam. Projekt A war gelegentlich auf OOM-Fehler auf kleineren CI-Runnern mit webpack stoßen. Dieses Problem verschwand mit Turbopack.

Breaking Changes, die du kennen musst
Hier ist eine laufende Liste von allem, was während unserer Migrationen tatsächlich brach. Das Next.js 16-Upgrade-Handbuch behandelt einige dieser, aber ein paar überraschten uns.
1. Custom Webpack-Konfiguration
Das ist das große. Wenn du einen webpack-Schlüssel in deiner next.config.js hast, funktioniert er nicht mehr. Turbopack hat seine eigene Konfigurations-API unter turbopack in der Next.js-Config. Nicht alles hat eine 1:1-Zuordnung.
// next.config.js — VOR (Next.js 15 mit webpack)
module.exports = {
webpack: (config) => {
config.module.rules.push({
test: /\.svg$/,
use: ['@svgr/webpack'],
});
return config;
},
};
// next.config.js — NACH (Next.js 16 mit Turbopack)
module.exports = {
turbopack: {
rules: {
'*.svg': {
loaders: ['@svgr/webpack'],
as: '*.js',
},
},
},
};
2. Synchrone Request-APIs entfernt
Next.js 15 missbilligte synchrone Zugriffe auf cookies(), headers(), params und searchParams. Next.js 16 entfernt sie vollständig. Wenn du diese Veraltungswarnungen ignoriert hast, wirst du eine schlechte Zeit haben.
// VOR — das stürzt in Next.js 16 ab
export default function Page({ params }) {
const { slug } = params;
return <div>{slug}</div>;
}
// NACH
export default async function Page({ params }) {
const { slug } = await params;
return <div>{slug}</div>;
}
Das scheint trivial zu sein, aber es berührte über 200 Komponenten in unseren Projekten. Wir schrieben einen Codemod, um die meisten davon zu handhaben (mehr dazu unten).
3. React 18 wird nicht mehr unterstützt
Next.js 16 erfordert React 19. Wenn du Abhängigkeiten auf React 18 gepinnt hast, müssen sie aktualisiert werden. Die meisten gut verwalteten Bibliotheken hatten React 19-Support bis Mitte 2025, aber wir stießen auf ein paar Nachzügler.
4. Node.js 18 wurde gestrichen
Minimum ist Node.js 20. Aktualisiere deine Docker-Images, CI-Konfigurationen und .nvmrc-Dateien.
5. next/image-Änderungen
Das onLoadingComplete-Prop ist vollständig entfernt (wurde seit Next.js 14 missbilligt). Verwende stattdessen onLoad. Die Bildoptimierungs-Pipeline verwendet auch eine neue zugrunde liegende Bibliothek, was bedeutet, dass deine gecachten optimierten Bilder beim ersten Request regeneriert werden.
Unser Migrationsprozess Schritt für Schritt
Hier ist der tatsächliche Prozess, dem wir folgten. Wir taten zuerst Projekt B (das kleinste) als Test-Durchlauf, dann nahmen wir A und C an.
Schritt 1: Audit der Abhängigkeiten
Vor dem Anfassen von Next.js audiierten wir jede Abhängigkeit auf React 19 und Node.js 20-Kompatibilität. Wir verwendeten ein einfaches Skript:
npx npm-check-updates --target latest --filter '/react|next/'
Wir überprüften auch manuell unsere kritischsten Pakete: unser Headless-CMS-SDK, die Authentifizierungsbibliothek und die UI-Komponentenbibliothek.
Schritt 2: Node.js aktualisieren
Wir aktualisierten unsere .nvmrc auf 20.18.0 (neueste LTS zu dieser Zeit), aktualisierten Dockerfiles und verifizierten CI-Runner. Einfach, aber leicht zu vergessen.
Schritt 3: React zuerst aktualisieren
npm install react@19 react-dom@19 @types/react@19 @types/react-dom@19
Wir führten hier die vollständige Test-Suite aus, bevor wir fortfuhren. React 19 hat seine eigenen Breaking Changes (entfernte forwardRef als Notwendigkeit, ref ist jetzt ein reguläres Prop, use() Hook ist stabil). Wir behobenen diese Probleme isoliert, damit wir keine React- und Next.js-Probleme gleichzeitig debuggten.
Schritt 4: Führe den Next.js-Codemod aus
Next.js bietet einen Upgrade-Codemod, der viele der mechanischen Änderungen verarbeitet:
npx @next/codemod@latest upgrade
Dies verarbeitete etwa 70% der Async-API-Migrationen automatisch. Es ist nicht perfekt — es kämpfte mit einigen unserer komplexeren Server-Komponenten-Muster — aber es sparte uns Stunden.
Schritt 5: Next.js aktualisieren
npm install next@16
Schritt 6: Migriere next.config.js
Das war der zeitaufwendigste Schritt für Projekt A, das eine signifikante webpack-Anpassung hatte. Ich werde die spezifischen Übersetzungen im nächsten Abschnitt behandeln.
Schritt 7: Behebe Build-Fehler iterativ
Wir führten next build aus und arbeiteten uns durch Fehler einzeln vor. Die Fehlermeldungen von Turbopack sind tatsächlich besser als webpack's in den meisten Fällen — spezifischer, mit klareren Dateipfaden und Vorschlägen.
Schritt 8: Visual Regression Testing
Wir verwenden Playwright für E2E-Tests und führten unsere Visual-Regression-Suite durch, um Rendering-Unterschiede zu erkennen. Wir fanden zwei Probleme: ein CSS-Ordering-Unterschied (Turbopack verarbeitet CSS-Importe in einer leicht anderen Reihenfolge als webpack) und einen dynamischen Import, der sich nicht korrekt aufteilte.
Schritt 9: Performance-Validierung
Wir verglichen Lighthouse-Scores und Core Web Vitals vorher und nachher. Jedes Projekt verbesserte sich oder blieb neutral. Keine Regressionenen.
Webpack-Config-Übersetzungen
Dieser Abschnitt ist für Teams mit benutzerdefinierten webpack-Konfigurationen. Hier ist, wie häufige Muster zu Turbopack übersetzt werden.
Benutzerdefinierte Loader
// Turbopack-Äquivalent für benutzerdefinierte Loader
module.exports = {
turbopack: {
rules: {
'*.md': {
loaders: ['raw-loader'],
as: '*.js',
},
'*.graphql': {
loaders: ['graphql-tag/loader'],
as: '*.js',
},
},
},
};
Modul-Aliase
// Resolve-Aliase funktionieren ähnlich
module.exports = {
turbopack: {
resolveAlias: {
'old-package': 'new-package',
// Du kannst auch auf lokale Dateien zeigen
'@legacy/utils': './src/utils/legacy.ts',
},
},
};
Was sich nicht übersetzt
Einige webpack-Plugins haben einfach noch keine Turbopack-Äquivalente:
webpack.DefinePlugin— Verwendeenvin next.config.js oder Umgebungsvariablen direktBundleAnalyzerPlugin— Das@next/bundle-analyzer-Paket funktioniert mit Turbopack ab v16, aber das Ausgabeformat hat sich geändert- Benutzerdefinierte Chunk-Aufteilung über
splitChunks— Turbopack verarbeitet dies automatisch und setzt dieselbe Kontrollebene nicht aus. Ehrlich gesagt sind die Standards für die meisten Projekte gut genug. webpack.IgnorePlugin— VerwenderesolveAlias, um Importe zu leeren Modulen zu zeigen
Mit Third-Party-Paketen umgehen
Ein paar Pakete verursachten während der Migration Probleme:
@sentry/nextjs — Benötigte v9+ für Turbopack-Kompatibilität. Frühere Versionen hookten sich in webpack-Interna. Das Upgrade war einfach, aber erforderte Config-Änderungen.
next-intl — Funktionierte nach der Aktualisierung auf die neueste Version gut. Die Plugin-API passte sich sauber an.
@vanilla-extract/next-plugin — Das war unser größtes Kopfzerbrechen auf Projekt B. Vanilla Extract's webpack-Plugin hatte bis zu ihrer 2.0-Version kein Turbopack-Äquivalent. Wir mussten entweder darauf warten oder Alternativen betrachten. Wir warteten.
Barrel-File-Pakete — Jedes Paket, das Hunderte von Komponenten aus einer einzigen Index-Datei exportiert (wir schauen dich an, Icon-Bibliotheken), wird jetzt viel aggressiver tree-geshaakt. Das ist eine gute Sache, aber wir sahen einen Fall, in dem ein dynamisch referenziertes Icon nicht einbezogen wurde. Wir wechselten von string-basierten Icon-Lookups zu direkten Importen, was sowieso eine bessere Praxis ist.
CSS und Tailwind-Überlegungen
Wenn du Tailwind CSS verwendest (und die meisten unserer Projekte tun das), ist die Migration größtenteils schmerzlos. Tailwind v4 funktioniert großartig mit Turbopack. Aber es gibt ein paar Dinge zum Beobachten:
CSS-Import-Reihenfolge
Turbopack verarbeitet CSS-Importe in einer deterministischen, aber anderen Reihenfolge als webpack. Wenn du dich auf die Import-Reihenfolge für Spezifität verlässt (und du solltest das nicht tun, aber lass uns ehrlich sein — wir alle landen dort irgendwann), könntest du visuelle Unterschiede sehen. Wir hatten ein Projekt, in dem ein Global-Reset von einer Komponenten-CSS-Datei überschrieben wurde, weil sich die Import-Reihenfolge umkehrte.
Der Fix war explizite @layer-Verwendung in unserem CSS, das wir ohnehin schon hätten tun sollen.
CSS-Module
CSS-Module funktionieren identisch. Keine Änderungen erforderlich. Die generierten Klassennamen sehen anders aus (kürzer, tatsächlich), aber das ist kosmetisch, es sei denn, du tust etwas Seltsames, wie das Zielsetzen von generierten Klassennamen in Tests.
PostCSS
PostCSS-Konfigurationsdateien werden immer noch berücksichtigt. Deine postcss.config.js funktioniert weiterhin. Keine Änderungen erforderlich hier.
Deployment- und CI-Pipeline-Updates
Unsere Deployment-Ziele sind primär Vercel und AWS (über SST/OpenNext). Hier ist, was sich geändert hat:
Vercel: Erkannte automatisch Next.js 16 und verwendete Turbopack. Die Build-Cache-Integration funktioniert sofort. Unsere Build-Zeiten auf Vercel fielen noch dramatischer ab als lokale CI, weil Vercel eine tiefe Integration mit Turbopack's Caching-Layer hat. Projekt C ging von ~8 Minuten auf ~2,5 Minuten auf Vercel.
AWS/OpenNext: Erforderlich Aktualisierung auf OpenNext 4.x, das Turbopack-Ausgabe-Support hinzufügte. Das Ausgabeformat änderte sich leicht — die .next-Verzeichnisstruktur wird reorganisiert — also mussten alle Post-Build-Skripte, die auf bestimmte Dateipfade verwiesen, aktualisiert werden.
Docker-Builds: Wenn du Next.js in Docker baust, aktualisiere dein Basis-Image auf Node 20+ und beachte, dass Turbopack's Cache-Verzeichnis (.next/cache/turbopack) in deiner Docker-Layer-Caching-Strategie enthalten sein sollte. Wir fügte eine spezifische COPY-Layer dafür hinzu.
# Optimiere Docker-Layer-Caching für Turbopack
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
# Cache-Mount für Turbopack
RUN --mount=type=cache,target=/app/.next/cache \
npm run build
Wann du NICHT noch migrieren solltest
Ich möchte das nicht als nur Rosen darstellen. Es gibt legitime Gründe, jetzt auf Next.js 15 zu bleiben:
- Schwere webpack-Plugin-Abhängigkeit: Wenn dein Build auf 3+ benutzerdefinierten webpack-Plugins basiert, die keine Turbopack-Äquivalente haben, könnte die Migrations-Kosten es nicht wert sein.
- Monorepo mit gemeinsamer webpack-Konfiguration: Wenn du webpack-Konfiguration über Next.js und nicht-Next.js-Projekte in einem Monorepo teilst, ist das Aufteilen dieser Konfiguration zusätzliche Arbeit.
- Stabilitäts-Anforderungen: Next.js 16.0 ist stabil, aber 16.1 und 16.2 behobenen echte Bugs. Ich würde warten, bis mindestens 16.2+ vor dem Migrieren von etwas, das du keine Ausfallzeiten hast.
- Legacy-Abhängigkeiten, die auf React 18 hängen: Wenn eine kritische Abhängigkeit React 19-Support nicht hinzugefügt hat, bist du unabhängig davon blockiert.
Für Teams, die Headless-CMS-Entwicklung betreiben, ist die Migration im Allgemeinen reibungsloser, weil CMS-betriebene Seiten dazu neigen, einfachere Build-Konfigurationen zu haben.
FAQ
Ist Turbopack stabil genug für Production in Next.js 16? Ja. Turbopack befindet sich über drei Jahre in der Entwicklung, wurde in Dev-Mode über Millionen von Next.js-Projekten getestet und durchlief eine erweiterte Beta in Production-Builds während Next.js 15.3-15.5. Wir führen es seit der 16.0-Freigabe in Production über mehrere Client-Sites aus, ohne bundler-bezogene Probleme. Wenn du speziell auf 16.0 bist, aktualisiere auf 16.2+, wo mehrere Edge-Case-Bugs behoben wurden.
Kann ich immer noch webpack mit Next.js 16 verwenden? Nicht als primärer Bundler, nein. Turbopack ist der einzige unterstützte Bundler in Next.js 16. Wenn du webpack absolut brauchst, musst du auf Next.js 15 bleiben, das bis Anfang 2026 Sicherheits-Patches erhält. Vercel hat klargemacht, dass webpack-Support in Next.js vorbei ist.
Wie viel schneller ist Turbopack im Vergleich zu webpack für Production-Builds? Bei kalten Builds (kein Cache) sahen wir 20-30% Verbesserungen. Bei warmen/gecachten Builds springt die Verbesserung auf 50-70%. Die genauen Zahlen hängen stark von der Projektgröße, der Anzahl der Routes und der Menge der statischen Generierung ab. Die Speichernutzung sank auch durchgehend 20-30% über unsere Projekte.
Muss ich meine next.config.js für Turbopack umschreiben?
Wenn du benutzerdefinierte webpack-Konfiguration in deiner next.config.js hast, ja — diese Blöcke müssen in das turbopack-Konfigurations-Format übersetzt werden. Wenn du nur Standard-Next.js-Konfigurations-Optionen (Bilder, Redirects, Rewrites, Umgebungsvariablen) verwendest, funktionieren diese alle genau gleich. Der Migrations-Aufwand ist proportional zu wie viel benutzerdefinierte webpack-Konfiguration du hast.
Funktioniert meine bestehende CI/CD-Pipeline mit Next.js 16?
Größtenteils ja. Die Hauptdinge zum Aktualisieren sind: Node.js-Version (Minimum 20), alle Skripte, die auf webpack-spezifische Output-Dateien verweisen, und alle Caching-Strategien, die .next/cache/webpack ansprechen. Du wirst stattdessen .next/cache/turbopack cachen wollen. Wenn du auf Vercel bereitstellst, wird alles automatisch verwaltet.
Unterstützt Turbopack alle gleichen Features wie webpack in Next.js? Für Next.js-spezifische Features ja — App Router, Pages Router, API Routes, Middleware, ISR, SSG, SSR alles funktioniert. Für benutzerdefinierte webpack-Konfiguration gibt es etwa 90% Feature-Parität. Die verbleibenden Lücken sind größtenteils um Nische webpack-Plugins und hochgradig benutzerdefinierte Chunk-Splitting-Strategien. Überprüfe die Turbopack-Kompatibilitäts-Dokumentation für deinen spezifischen Use Case.
Sollte ich zu Next.js 16 migrieren oder Alternativen wie Astro betrachten? Es hängt von deinem Use Case ab. Wenn du hochgradig interaktive Anwendungen mit komplexem State Management baust, ist Next.js 16 eine starke Wahl und die Turbopack-Verbesserungen machen die DX deutlich besser. Wenn du content-schwere Sites mit minimaler Interaktivität baust, bleibt Astro eine ausgezeichnete Alternative mit seinem Partial-Hydration-Modell. Wir bauen mit beiden und wählen basierend auf Projektanforderungen. Wenn du unsicher bist, kontaktiere uns und wir können dir helfen, zu evaluieren.
Was ist die Mindestzeit, die benötigt wird, um eine mittlere Next.js 15-App zu 16 zu migrieren? Für eine typische mittlere Anwendung (50-200 Routes, Standard-Abhängigkeiten, minimale benutzerdefinierte webpack-Konfiguration), budget 2-4 Tage Entwickler-Zeit. Das beinhaltet Abhängigkeits-Updates, Async-API-Migrationen, Testing und Deployment-Verifikation. Wenn du umfangreiche benutzerdefinierte webpack-Konfiguration oder Legacy-Abhängigkeiten hast, könnte es eine Woche oder mehr dauern. Unser Team bei Social Animal bietet Migration-Services an, wenn du nicht dein Team's Sprint auf Infrastruktur-Arbeit verbrennen möchtest.