Next.js Compiler
Der Next.js Compiler, geschrieben in Rust mit SWC, ermöglicht es Next.js, Ihren JavaScript-Code für die Produktion zu transformieren und zu minimieren. Dies ersetzt Babel für einzelne Dateien und Terser für die Minimierung von Ausgabebündeln.
Die Kompilierung mit dem Next.js Compiler ist 17x schneller als mit Babel und seit Next.js Version 12 standardmäßig aktiviert. Wenn Sie eine bestehende Babel-Konfiguration haben oder nicht unterstützte Funktionen verwenden, wird Ihre Anwendung den Next.js Compiler nicht nutzen und weiterhin Babel verwenden.
Warum SWC?
SWC ist eine erweiterbare, Rust-basierte Plattform für die nächste Generation schneller Entwicklertools.
SWC kann für Kompilierung, Minimierung, Bundling und mehr verwendet werden – und ist für Erweiterungen konzipiert. Es ist etwas, das Sie aufrufen können, um Code-Transformationen durchzuführen (entweder eingebaut oder benutzerdefiniert). Die Ausführung dieser Transformationen erfolgt über höhere Tools wie Next.js.
Wir haben uns aus mehreren Gründen für SWC entschieden:
- Erweiterbarkeit: SWC kann als Crate innerhalb von Next.js verwendet werden, ohne die Bibliothek forken oder Designbeschränkungen umgehen zu müssen.
- Leistung: Durch den Wechsel zu SWC konnten wir ~3x schnelleres Fast Refresh und ~5x schnellere Builds in Next.js erreichen, wobei noch weiteres Optimierungspotenzial besteht.
- WebAssembly: Rusts Unterstützung für WASM ist entscheidend, um alle möglichen Plattformen zu unterstützen und Next.js-Entwicklung überall hin zu bringen.
- Community: Die Rust-Community und das Ökosystem sind großartig und wachsen weiter.
Unterstützte Funktionen
Styled Components
Wir arbeiten daran, babel-plugin-styled-components
auf den Next.js Compiler zu portieren.
Aktualisieren Sie zunächst auf die neueste Version von Next.js: npm install next@latest
. Aktualisieren Sie dann Ihre next.config.js
-Datei:
Für erweiterte Anwendungsfälle können Sie einzelne Eigenschaften für die styled-components-Kompilierung konfigurieren.
Hinweis: Die
ssr
- unddisplayName
-Transformationen sind die Hauptvoraussetzung für die Verwendung vonstyled-components
in Next.js.
Jest
Der Next.js Compiler transpiliert Ihre Tests und vereinfacht die Konfiguration von Jest mit Next.js, einschließlich:
- Automatisches Mocking von
.css
,.module.css
(und ihren.scss
-Varianten) sowie Bildimporten - Automatische Einrichtung von
transform
mit SWC - Laden von
.env
(und allen Varianten) inprocess.env
- Ignorieren von
node_modules
bei der Testauflösung und Transformation - Ignorieren von
.next
bei der Testauflösung - Laden von
next.config.js
für Flags, die experimentelle SWC-Transformationen ermöglichen
Aktualisieren Sie zunächst auf die neueste Version von Next.js: npm install next@latest
. Aktualisieren Sie dann Ihre jest.config.js
-Datei:
Relay
Um Relay-Unterstützung zu aktivieren:
Gut zu wissen: In Next.js werden alle JavaScript-Dateien im Verzeichnis
pages
als Routen betrachtet. Fürrelay-compiler
müssen Sie daher dieartifactDirectory
-Konfiguration außerhalb vonpages
angeben, darelay-compiler
sonst Dateien neben der Quelldatei im Verzeichnis__generated__
generiert, und diese Datei als Route betrachtet wird, was Produktionsbuilds unterbricht.
React Properties entfernen
Ermöglicht das Entfernen von JSX-Properties. Dies wird oft für Tests verwendet. Ähnlich wie babel-plugin-react-remove-properties
.
Um Properties zu entfernen, die auf den Standard-Regex ^data-test
passen:
Um benutzerdefinierte Properties zu entfernen:
Console entfernen
Diese Transformation ermöglicht das Entfernen aller console.*
-Aufrufe im Anwendungscode (nicht in node_modules
). Ähnlich wie babel-plugin-transform-remove-console
.
Entfernen Sie alle console.*
-Aufrufe:
Entfernen Sie console.*
-Ausgaben außer console.error
:
Legacy Decorators
Next.js erkennt automatisch experimentalDecorators
in jsconfig.json
oder tsconfig.json
. Legacy Decorators werden häufig mit älteren Versionen von Bibliotheken wie mobx
verwendet.
Dieses Flag wird nur für die Kompatibilität mit bestehenden Anwendungen unterstützt. Wir empfehlen nicht, Legacy Decorators in neuen Anwendungen zu verwenden.
Aktualisieren Sie zunächst auf die neueste Version von Next.js: npm install next@latest
. Aktualisieren Sie dann Ihre jsconfig.json
oder tsconfig.json
-Datei:
importSource
Next.js erkennt automatisch jsxImportSource
in jsconfig.json
oder tsconfig.json
und wendet dies an. Dies wird häufig mit Bibliotheken wie Theme UI verwendet.
Aktualisieren Sie zunächst auf die neueste Version von Next.js: npm install next@latest
. Aktualisieren Sie dann Ihre jsconfig.json
oder tsconfig.json
-Datei:
Emotion
Wir arbeiten daran, @emotion/babel-plugin
auf den Next.js Compiler zu portieren.
Aktualisieren Sie zunächst auf die neueste Version von Next.js: npm install next@latest
. Aktualisieren Sie dann Ihre next.config.js
-Datei:
Minimierung
Der SWC-Compiler von Next.js wird seit v13 standardmäßig für die Minimierung verwendet. Dies ist 7x schneller als Terser.
Gut zu wissen: Ab v15 kann die Minimierung nicht mehr über
next.config.js
angepasst werden. Die Unterstützung für dasswcMinify
-Flag wurde entfernt.
Modultranspilierung
Next.js kann Abhängigkeiten aus lokalen Paketen (wie Monorepos) oder externen Abhängigkeiten (node_modules
) automatisch transpilieren und bündeln. Dies ersetzt das Paket next-transpile-modules
.
Modularisierte Imports
Diese Option wurde durch optimizePackageImports
in Next.js 13.5 ersetzt. Wir empfehlen ein Upgrade, um die neue Option zu verwenden, die keine manuelle Konfiguration von Importpfaden erfordert.
Define (Variablen während des Builds ersetzen)
Die define
-Option ermöglicht es Ihnen, Variablen in Ihrem Code statisch zur Build-Zeit zu ersetzen.
Die Option nimmt ein Objekt als Schlüssel-Wert-Paare entgegen, wobei die Schlüssel die Variablen sind, die durch die entsprechenden Werte ersetzt werden sollen.
Verwenden Sie das Feld compiler.define
in next.config.js
, um Variablen für alle Umgebungen (Server, Edge und Client) zu definieren. Oder verwenden Sie compiler.defineServer
, um Variablen nur für serverseitigen Code (Server und Edge) zu definieren:
Build-Lifecycle-Hooks
Der Next.js Compiler unterstützt Lifecycle-Hooks, die es Ihnen ermöglichen, benutzerdefinierten Code an bestimmten Punkten während des Build-Prozesses auszuführen. Derzeit wird der folgende Hook unterstützt:
runAfterProductionCompile
Eine Hook-Funktion, die nach Abschluss der Produktionsbuild-Kompilierung, aber vor der Ausführung von Post-Kompilierungsaufgaben wie Typüberprüfung und statischer Seitengenerierung, ausgeführt wird. Dieser Hook bietet Zugriff auf Projektmetadaten, einschließlich des Projektverzeichnisses und des Build-Ausgabeverzeichnisses, was ihn für Drittanbietertools nützlich macht, um Build-Ausgaben wie Sourcemaps zu sammeln.
Der Hook empfängt ein Objekt mit den folgenden Eigenschaften:
distDir
: Das Build-Ausgabeverzeichnis (standardmäßig.next
)projectDir
: Das Stammverzeichnis des Projekts
Experimentelle Funktionen
SWC-Trace-Profiling
Sie können SWCs interne Transform-Traces im Trace-Event-Format von Chromium generieren.
Einmal aktiviert, generiert SWC eine Trace-Datei namens swc-trace-profile-${timestamp}.json
unter .next/
. Chromiums Trace-Viewer (chrome://tracing/, https://ui.perfetto.dev/) oder kompatible Flamegraph-Viewer (https://www.speedscope.app/) können die generierten Traces laden und visualisieren.
SWC-Plugins (experimentell)
Sie können die SWC-Transformation konfigurieren, um die experimentelle Plugin-Unterstützung von SWC, die in wasm geschrieben ist, zu verwenden und das Transformationsverhalten anzupassen.
swcPlugins
akzeptiert ein Array von Tupeln zur Konfiguration von Plugins. Ein Tupel für das Plugin enthält den Pfad zum Plugin und ein Objekt für die Plugin-Konfiguration. Der Pfad zum Plugin kann ein npm-Modul-Paketname oder ein absoluter Pfad zur .wasm
-Binärdatei selbst sein.
Nicht unterstützte Funktionen
Wenn Ihre Anwendung eine .babelrc
-Datei enthält, wird Next.js automatisch auf die Verwendung von Babel für die Transformation einzelner Dateien zurückfallen. Dies gewährleistet Abwärtskompatibilität mit bestehenden Anwendungen, die benutzerdefinierte Babel-Plugins nutzen.
Wenn Sie ein benutzerdefiniertes Babel-Setup verwenden, teilen Sie uns bitte Ihre Konfiguration mit. Wir arbeiten daran, so viele häufig verwendete Babel-Transformationen wie möglich zu portieren sowie zukünftig Plugins zu unterstützen.
Versionsverlauf
Version | Änderungen |
---|---|
v13.1.0 | Modultranspilierung und Modularisierte Imports stabil. |
v13.0.0 | SWC-Minimierung standardmäßig aktiviert. |
v12.3.0 | SWC-Minimierung stabil. |
v12.2.0 | SWC-Plugins experimentelle Unterstützung hinzugefügt. |
v12.1.0 | Unterstützung für Styled Components, Jest, Relay, React Properties entfernen, Legacy Decorators, Console entfernen und jsxImportSource hinzugefügt. |
v12.0.0 | Next.js Compiler eingeführt. |