Wir freuen uns, heute Next.js 9.3 vorzustellen, mit folgenden Neuerungen:
- Next-gen Static Site Generation (SSG) Support: Integrierte optimierte statische Generierung durch neue Datenabrufmethoden.
- Preview Mode: Umgehung statisch generierter Seiten zur Anzeige von Entwürfen aus einem CMS.
- Integrierte Sass-Unterstützung für globale Stylesheets: Anwendungen können nun direkt
.scss
-Dateien als globale Stylesheets importieren. - Integrierte Sass-CSS-Modul-Unterstützung für komponentenspezifische Styles: Nutzung der
.module.scss
-Konvention für lokal begrenzte CSS-Definitionen, die überall in der Anwendung importiert werden können. - Automatische statische Optimierung für 404: Verbesserte Geschwindigkeit und Zuverlässigkeit durch statische Bereitstellung der 404-Seite.
- 32 kB kleinere Runtime: Kleinere Runtime-Größe für alle Next.js-Anwendungen durch leistungsstarke Optimierungen.
- Next.js-Community auf GitHub Discussions: Diskussionen und Fragen können nun direkt im Next.js-Repository auf GitHub erfolgen.
Alle diese Verbesserungen sind abwärtskompatibel und brechen nichts existierendes. Für das Update genügt:
Next-gen Static Site Generation (SSG) Support
Beim Erstellen von Websites oder Webanwendungen stehen grundsätzlich zwei Strategien zur Auswahl: Statische Generierung (SSG) oder Server-seitiges Rendering (SSR).
Next.js ist das erste hybride Framework, das Ihnen erlaubt, die beste Technik pro Seite auszuwählen.
Next.js 9.0 führte das Konzept der Automatischen statischen Optimierung ein. Wenn eine Seite keine blockierenden Datenabrufanforderungen wie getInitialProps
hat, wird sie automatisch zur Build-Zeit in HTML gerendert.
Es gibt jedoch mehr Fälle, in denen Sie eine Seite zur Build-Zeit in statisches HTML rendern möchten, selbst mit blockierenden Datenabrufanforderungen. Ein Beispiel hierfür sind Marketingseiten, die von einem (Headless-)Content-Management-System (CMS) betrieben werden, oder der Blog-Bereich einer Website.
Wir haben mit intensiven Nutzern von SSG und next export
wie HashiCorp zusammengearbeitet und ausführlich mit der Community im meistkommentierten RFC der Next.js-Geschichte die richtigen Einschränkungen diskutiert, um eine neue einheitliche Methode für Datenabruf und statische Generierung zu schaffen.
Heute freuen wir uns sehr, zwei neue Datenabrufmethoden anzukündigen: getStaticProps
und getServerSideProps
. Zudem bieten wir eine Möglichkeit, Parameter für die statische Generierung dynamischer Routen bereitzustellen: getStaticPaths
.
Diese neuen Methoden haben viele Vorteile gegenüber dem getInitialProps
-Modell, da klar zwischen SSG und SSR unterschieden wird.
-
getStaticProps
(Statische Generierung): Datenabruf zur Build-Zeit. -
getStaticPaths
(Statische Generierung): Angabe dynamischer Routen für das Prerendering basierend auf Daten. -
getServerSideProps
(Server-seitiges Rendering): Datenabruf bei jeder Anfrage. -
Diese Verbesserungen sind API-Erweiterungen. Alle neuen Funktionen sind vollständig abwärtskompatibel und können schrittweise übernommen werden. Es werden keine Verwerfungen eingeführt, und
getInitialProps
wird weiterhin wie bisher funktionieren. Wir empfehlen jedoch die Verwendung dieser neuen Methoden für neue Seiten und Projekte.
getStaticProps
Wenn Sie eine async
-Funktion namens getStaticProps
von einer Seite exportieren, wird Next.js diese Seite zur Build-Zeit vorrendern. Dies ist besonders nützlich, wenn Sie bestimmte statische Seiten aus einem CMS rendern möchten.
getStaticProps
läuft immer im Node.js-Kontext, und der Code wird automatisch aus den Browser-Bundles entfernt (Tree-Shaking), wodurch weniger Code an den Browser gesendet wird. So müssen Sie sich keine Gedanken über die Ausführung des Datenabruf-Codes in beiden Umgebungen (Node.js und Browser) machen, die einige Inkonsistenzen aufweisen.
Dies ermöglicht die Verwendung jeder asynchronen oder sogar synchronen Datenabruftechnik, einschließlich fetch
, REST, GraphQL oder sogar direktem Datenbankzugriff.
Der context
-Parameter ist ein Objekt mit folgenden Schlüsseln:
params
: Enthält die Routenparameter für Seiten mit dynamischen Routen. Beispiel: Wenn der Seitenname[id].js
lautet, siehtparams
wie{ id: ... }
aus. Weitere Informationen finden Sie in der Dokumentation zu dynamischem Routing. Dies sollte zusammen mitgetStaticPaths
verwendet werden, das wir später erklären werden.
Hier ein Beispiel, das getStaticProps
verwendet, um eine Liste von Blogposts aus einem CMS abzurufen:
Wann sollte ich getStaticProps verwenden?
Sie sollten getStaticProps
verwenden, wenn:
- Die zum Rendern der Seite erforderlichen Daten zur Build-Zeit vor einer Benutzeranfrage verfügbar sind.
- Die Daten aus einem Headless-CMS stammen.
- Die Daten öffentlich zwischengespeichert werden können (nicht benutzerspezifisch).
- Die Seite für SEO-Zwecke vorgerendert werden muss und sehr schnell sein soll —
getStaticProps
generiert HTML- und JSON-Dateien, die beide von einem CDN für bessere Performance zwischengespeichert werden können.
Weitere Informationen zu getStaticProps
finden Sie in der Datenabruf-Dokumentation.
getStaticPaths
Wenn eine Seite dynamische Routen verwendet und getStaticProps
nutzt, muss sie eine Liste der Pfade definieren, die zur Build-Zeit in HTML gerendert werden sollen.
Wenn Sie eine async
-Funktion namens getStaticPaths
von einer Seite mit dynamischen Routen exportieren, wird Next.js alle von getStaticPaths
angegebenen Pfade statisch vorrendern.
Der paths-Schlüssel (erforderlich)
Der paths-Schlüssel bestimmt, welche Pfade vorgerendert werden. Angenommen, Sie haben eine Seite mit dynamischen Routen namens pages/posts/[id].js
. Wenn Sie getStaticPaths
von dieser Seite exportieren und Folgendes für paths zurückgeben:
Dann wird Next.js posts/1
und posts/2
zur Build-Zeit statisch mit der Seitenkomponente in pages/posts/[id].js
generieren.
Beachten Sie, dass der Wert für jedes params
mit den in der Seitenbezeichnung verwendeten Parametern übereinstimmen muss:
- Wenn die Seitenbezeichnung
pages/posts/[postId]/[commentId]
lautet, sollteparams
postId
undcommentId
enthalten. - Wenn die Seitenbezeichnung Catch-all-Routen verwendet, z.B.
pages/[...slug]
, sollteparams
slug
enthalten, das ein Array ist. Beispiel: Wenn dieses Array['foo', 'bar']
ist, generiert Next.js die Seite statisch unter/foo/bar
.
Der fallback-Schlüssel (erforderlich)
Das von getStaticPaths zurückgegebene Objekt muss einen booleschen fallback-Schlüssel enthalten.
Fallback: false
Wenn fallback
false
ist, führt jeder nicht von getStaticPaths
zurückgegebene Pfad zu einer 404-Seite. Dies ist nützlich, wenn Sie wissen, dass alle Pfade zur Build-Zeit bekannt sein werden.
Hier ein Beispiel, das einen Blogpost pro Seite namens pages/posts/[id].js
vorrendert. Die Liste der Blogposts wird aus einem CMS abgerufen und von getStaticPaths
zurückgegeben. Dann werden für jede Seite die Post-Daten aus einem CMS mit getStaticProps
abgerufen.
Fallback: true
Wenn fallback
true
ist, ändert sich das Verhalten von getStaticProps
. Next.js rendert die angegebenen Pfade zur Build-Zeit in HTML. Wenn ein Pfad nicht zur Build-Zeit generiert wurde, wird er bei einer Benutzeranfrage on-demand generiert.
Dies ist nützlich, wenn Ihre Anwendung viele Routen hat, die statisch generiert werden können, Sie aber nicht erhöhte Build-Zeiten für Seiten in Kauf nehmen möchten, indem Sie nur eine Teilmenge zur Build-Zeit generieren.
Der Benutzer, der die Generierung der Seite auslöst, erhält ein Fallback-HTML, in der Regel eine Seite mit einem Ladezustand. Der Grund dafür ist, dass statisches HTML von einem CDN bereitgestellt werden kann, wodurch die Seite immer schnell ist, selbst wenn sie noch nicht generiert wurde.
Ein Beispiel für die on-demand statische Generierung zusätzlicher Seiten:
Weitere Informationen zu getStaticPaths
finden Sie in der Datenabruf-Dokumentation.
getServerSideProps
Wenn Sie eine async
-Funktion namens getServerSideProps
aus einer Seite exportieren, wird Next.js diese Seite bei jeder Anfrage rendern (Server-seitiges Rendering (SSR)).
getServerSideProps
läuft immer serverseitig und der Code wird automatisch aus den Browser-Bundles entfernt (Tree-Shaking), wodurch weniger Code an den Browser gesendet wird. So müssen Sie sich keine Gedanken über die Ausführung des Datenabruf-Codes in sowohl Server- als auch Browser-Umgebungen machen, die einige Inkonsistenzen aufweisen. Dies verbessert in vielen Fällen die Leistung, da der Server in der Regel eine schnellere Verbindung zur Datenquelle hat. Es erhöht auch die Sicherheit, indem weniger der Datenabruflogik offengelegt wird.
Dadurch können Sie jede asynchrone oder sogar synchrone Datenabruftechnik verwenden, einschließlich fetch
, REST, GraphQL oder sogar den direkten Zugriff auf eine Datenbank.
Wenn Sie zwischen Seiten mit next/link
navigieren, anstatt getServerSideProps
im Browser auszuführen, führt Next.js einen Fetch zum Server durch, der das Ergebnis des Aufrufs von getServerSideProps
zurückgibt.
Der context
-Parameter ist ein Objekt mit den folgenden Schlüsseln:
params
: Wenn diese Seite eine dynamische Route verwendet, enthältparams
die Routenparameter. Wenn der Seitenname[id].js
lautet, siehtparams
wie{ id: ... }
aus. Weitere Informationen finden Sie in der Dokumentation zu dynamischen Routen.req
: Das HTTP-Anfrageobjekt.res
: Das HTTP-Antwortobjekt.query
: Die Query-String-Parameter.
Hier ist ein Beispiel, das getServerSideProps
verwendet, um Daten zum Zeitpunkt der Anfrage abzurufen und sie darzustellen:
Weitere Informationen zu getServerSideProps
finden Sie in der Dokumentation zum Datenabruf.
Vorschaumodus (Preview Mode)
Wie bereits früher in diesem Beitrag erwähnt, ist statische Generierung (Static Generation) nützlich, wenn Ihre Seiten Daten von einem Headless-CMS abrufen. Sie ist jedoch nicht ideal, wenn Sie einen Entwurf in Ihrem Headless-CMS schreiben und diesen sofort auf Ihrer Seite vorschauen möchten. Da die Ausgabe statisch ist, wird die Vorschau von Änderungen schwieriger, da Sie die statische Seite neu generieren müssten.
Die Einführung von getStaticProps
in Next.js eröffnet neue Möglichkeiten, wie die Nutzung der On-Demand-Rendering-Fähigkeiten von Next.js unter bestimmten Bedingungen.
Wenn Sie beispielsweise einen Entwurf aus Ihrem Headless-CMS vorschauen möchten, sollten Sie das statische Rendering umgehen und die Seite stattdessen mit dem Entwurfsinhalt anstelle des veröffentlichten Inhalts on-demand rendern. Sie möchten, dass Next.js die statische Generierung nur für diesen speziellen Fall umgeht.
Wir freuen uns, eine neue integrierte Funktion von Next.js vorzustellen, die diesen Bedarf abdeckt: den Vorschaumodus (Preview Mode).
Der Vorschaumodus ermöglicht es Benutzern, die statisch generierte Seite zu umgehen und eine Entwurfsseite on-demand (SSR) von beispielsweise einem CMS zu rendern.
Sie sind jedoch nicht nur auf bestimmte CMS-Systeme beschränkt. Der Vorschaumodus integriert sich direkt mit sowohl getStaticProps
als auch getServerSideProps
, sodass er mit jeder Art von Datenabruflösung verwendet werden kann.
Der Vorschaumodus ist bereits verfügbar, wenn Sie next start
verwenden oder nahtlos durch Bereitstellung im Vercel Edge Network.
Probieren Sie den Vorschaumodus selbst auf https://next-preview.vercel.app/ aus.
Erfahren Sie mehr über den Vorschaumodus, indem Sie die Dokumentation konsultieren.
Zusammenarbeit mit CMS-Anbietern
getStaticProps
ermöglicht es Ihnen, Daten aus beliebigen Datenquellen abzurufen, einschließlich CMS-Systemen.
Wir arbeiten aktiv mit vielen wichtigen Akteuren im CMS-Ökosystem zusammen, um Beispiele und Anleitungen für die Integration mit Next.js bereitzustellen.
Beispiele, an denen derzeit aktiv gearbeitet wird, umfassen:
Wenn Ihr Unternehmen im CMS-Ökosystem aktiv ist, würden wir uns freuen, mit Ihnen zusammenzuarbeiten! Zögern Sie nicht, unser Team per E-Mail oder Twitter zu kontaktieren.
Integrierte Sass-Unterstützung für globale Stylesheets
Next.js 9.2 führte die integrierte Unterstützung für globale CSS-Stylesheets ein, um das Plugin next-css
mit besseren Standardeinstellungen zu ersetzen und ein optimierteres Ergebnis zu liefern.
Kurz nach der Veröffentlichung wurden wir zunehmend gebeten, die Sass-Unterstützung zu integrieren, da viele Unternehmen, die zu Next.js wechseln, ein bestehendes Design-System auf Basis von Sass haben.
Bei der Untersuchung der Next.js-Plugin-Nutzung stellten wir fest, dass etwa 30 % der Next.js-Anwendungen heute next-sass
verwenden. Im Vergleich dazu nutzen 44 % Vanilla CSS und 6 % Less.
Darüber hinaus hatte next-sass
die gleichen fehlenden Einschränkungen wie next-css
. Das bedeutet, dass Sie eine Sass-Datei in jeder Datei des Projekts importieren konnten, diese importierte Sass-Datei jedoch global für die gesamte Anwendung galt.
Nach Berücksichtigung dieser Statistiken und des Feedbacks freuen wir uns, bekannt zu geben, dass Next.js jetzt eine integrierte Unterstützung für den Import von Sass-Stylesheets bietet.
Um mit globalen Sass-Imports in Ihrer Anwendung zu beginnen, installieren Sie sass
:
Importieren Sie dann die Sass-Datei in pages/_app.js
.
Beispielsweise betrachten Sie das folgende Stylesheet mit dem Namen styles.scss
im Stammverzeichnis Ihres Projekts:
Erstellen Sie eine pages/_app.js
-Datei, falls noch nicht vorhanden. Importieren Sie dann die Datei styles.scss
:
Da Stylesheets globaler Natur sind, müssen sie in der benutzerdefinierten <App>
-Komponente importiert werden. Dies ist notwendig, um Konflikte bei Klassennamen und der Reihenfolge für globale Styles zu vermeiden.
In der Entwicklung ermöglicht diese Art der Stylesheet-Definition, dass Ihre Styles automatisch auf der Seite aktualisiert werden, während Sie sie bearbeiten.
In der Produktion werden alle Sass- und CSS-Dateien automatisch in eine einzige minimierte .css
-Datei zusammengeführt. Diese CSS-Datei wird über ein <link>
-Tag geladen und automatisch in das standardmäßige HTML-Markup eingefügt, das Next.js generiert.
Diese neue Funktion ist vollständig abwärtskompatibel. Wenn Sie @zeit/next-sass
oder andere CSS-bezogene Plugins verwenden, ist die Funktion deaktiviert, um Konflikte zu vermeiden.
Wenn Sie derzeit @zeit/next-sass
verwenden, empfehlen wir, das Plugin aus Ihrer next.config.js
und package.json
zu entfernen und nach dem Upgrade auf die integrierte Sass-Unterstützung umzusteigen.
Integrierte Sass-CSS-Modul-Unterstützung für komponentenspezifische Styles
Next.js unterstützt jetzt CSS-Module mit Sass-Dateien unter Verwendung der Namenskonvention [name].module.scss
.
Im Gegensatz zur zuvor in Next.js 5+ mit next-sass
verfügbaren Unterstützung können globale Sass- und CSS-Module jetzt koexistieren – next-sass
erforderte, dass alle .scss
-Dateien in Ihrer Anwendung entweder global oder lokal behandelt werden, aber nicht beides.
CSS-Module begrenzen Sass lokal, indem sie automatisch eindeutige Klassennamen erstellen. Dies ermöglicht es Ihnen, denselben Sass-Klassennamen in verschiedenen Dateien zu verwenden, ohne sich über Kollisionen Gedanken machen zu müssen.
Dieses Verhalten macht CSS-Module zur idealen Möglichkeit, komponentenspezifisches Sass einzubinden. CSS-Modul-Dateien können überall in Ihrer Anwendung importiert werden.
Um mit Sass-CSS-Modulen in Ihrer Anwendung zu beginnen, stellen Sie sicher, dass Sie sass
installiert haben:
Betrachten Sie nun eine wiederverwendbare Button
-Komponente im Ordner components/
:
Erstellen Sie zunächst components/Button.module.scss
mit folgendem Inhalt:
Erstellen Sie dann components/Button.js
, importieren Sie die obige CSS-Datei und verwenden Sie sie:
CSS-Module für Sass-Dateien sind eine optionale Funktion und werden nur für Dateien mit der Erweiterung .module.scss
aktiviert. Reguläre <link>
-Stylesheets und globale Sass-Styles werden weiterhin unterstützt.
In der Produktion werden alle CSS-Modul-Dateien automatisch in viele minimierte und code-aufgeteilte .css
-Dateien zusammengeführt. Diese .css
-Dateien repräsentieren Hot-Execution-Pfade in Ihrer Anwendung und stellen sicher, dass die minimale Menge an CSS pro Seite geladen wird, damit Ihre Anwendung gerendert werden kann.
Wie oben ist diese neue Funktion vollständig abwärtskompatibel. Wenn Sie @zeit/next-sass
oder andere CSS-bezogene Plugins verwenden, ist die Funktion deaktiviert, um Konflikte zu vermeiden.
Wenn Sie derzeit @zeit/next-sass
verwenden, empfehlen wir, das Plugin aus Ihrer next.config.js
und package.json
zu entfernen und auf die integrierte Sass-Unterstützung umzusteigen.
Automatische statische Optimierung für 404
Die Veröffentlichung von Next.js 9 führte das Konzept der automatischen statischen Optimierung (Automatic Static Optimization) ein: Wenn eine Seite keine blockierenden Datenanforderungen hat, generiert Next.js die Seite automatisch als statisches HTML zur Build-Zeit. Allerdings gab es eine Seite, die nicht automatisch als statisches HTML gerendert wurde: die 404-Seite. Der Hauptgrund, warum die 404-Seite nicht automatisch statisch gemacht wurde, war, dass die /_error
-Seite, die 404 bedient, mehr als nur 404 handhabte, zum Beispiel Fehler.
Da 404-Seiten für nicht existierende Routen gerendert werden, könnte das On-Demand-Rendering der Seite zu höheren Kosten und Serverlast führen.
Wir haben uns zum Ziel gesetzt, Sie in zwei Punkten zu unterstützen:
- Die standardmäßige Next.js-Erfahrung generiert eine statische 404-Seite
- Bei der Anpassung der 404-Seite wird weiterhin sichergestellt, dass Sie eine statische Seite erhalten
Diese Funktion ist vollständig abwärtskompatibel. Wenn Sie derzeit eine benutzerdefinierte pages/_error.js
haben, wird diese weiterhin für die 404-Seite verwendet, bis Sie pages/404.js
hinzufügen.
Statische 404-Seite standardmäßig
Wenn Ihre Anwendung keine benutzerdefinierte pages/_error.js
-Seite hat, generiert Next.js automatisch eine statische 404-Seite und verwendet diese, wenn eine 404-Seite bereitgestellt werden muss. Dies geschieht automatisch und erfordert keine Änderungen.
Benutzerdefinierte 404-Seite mit pages/404.js
Um die standardmäßige 404-Seite zu überschreiben, können Sie jetzt eine pages/404.js
erstellen, die weiterhin automatisch zur Build-Zeit statisch optimiert wird. Diese Seite wird anstelle von pages/_error.js
verwendet, um eine 404-Seite darzustellen, falls Ihre Anwendung eine solche hat.
32+ kB kleinere Laufzeit (15 kB+ Gzip)
Next.js unterstützt die gleichen Browser wie React selbst, ohne erforderliche Konfiguration. Dazu gehören Internet Explorer 11 (IE11) und alle gängigen Browser (Edge, Firefox, Chrome, Safari, Opera usw.).
Als Teil dieser Kompatibilität kompilieren wir Ihre Anwendung auch so, dass sie IE11-kompatibel ist: Dies ermöglicht es Ihnen, sicher ES6+-Syntax-Funktionen, Async/Await, Object Rest/Spread Properties und mehr zu verwenden – alles ohne erforderliche Konfiguration.
Ein Teil dieses Kompilierungsprozesses beinhaltet auch das transparente Einfügen der notwendigen Feature-Polyfills (z. B. Array.from
oder Symbol
). Diese Polyfills sind jedoch nur für weniger als 10 % des Webverkehrs notwendig, in den meisten Fällen zur Unterstützung von IE11.
Ab Next.js 9.3 lädt Next.js automatisch die Polyfills, die zur Unterstützung von Legacy-Browsern benötigt werden, und lädt diese Polyfills nur in diesen Legacy-Browsern.
In der Praxis bedeutet dies, dass 32 kB oder mehr von Ihrer First Load-Größe für 90 %+ Ihrer Benutzer eliminiert werden.
Diese Größeneinsparungen sind sogar noch größer für größere Anwendungen, die auf noch mehr Browser-Features angewiesen sind.
Diese Optimierung erfolgt vollautomatisch und erfordert keine Änderungen an Ihrer Anwendung, um davon zu profitieren!
Community
Wir freuen uns sehr über das weiterhin wachsende Interesse an Next.js:
- Wir hatten über 927 unabhängige Mitwirkende.
- Auf GitHub wurde das Projekt über 46.600 Mal mit einem Stern versehen.
- Das Beispielverzeichnis enthält über 226 Beispiele.
Die Next.js-Community hat jetzt über 15.250 Mitglieder. Die Community findet sich jetzt auf GitHub-Diskussionen, einem neuen Ort für die Community, um zu diskutieren und Fragen zu stellen! Machen Sie mit!
Wir sind unserer Community und all dem externen Feedback und den Beiträgen dankbar, die diese Veröffentlichung mitgestaltet haben.
Besonderer Dank geht an Jeff Escalante für wertvolles Feedback zu den neuen Datenabrufmethoden.
Ein riesiges Dankeschön an alle, die zu dieser Veröffentlichung beigetragen haben: @arcanis, @lgordey, @ijjk, @martpie, @jaywink, @fabianishere, @dijs, @TheRusskiy, @quinnturner, @timneutkens, @lfades, @vvo, @adithwip, @rafaelalmeidatk, @bmathews, @Spy-Seth, @EvgeniyKumachev, @chibicode, @piglovesyou, @HaNdTriX, @Timer, @janicklas-ralph, @devknoll, @prateekbh, @ethanryan, @MoOx, @rifaidev, @msweeneydev, @motiko und @balazsorban44 für die Hilfe!