Startseite / Artikel

Neun Möglichkeiten, um die Entwicklungsbuilds und Produktionsbündel von Next.js zu beschleunigen

Schnellerer Next.js: Nutzen Sie Turbopack, überspringen Sie Barrel-Dateien, teilen Sie die Typüberprüfung auf, halten Sie Client-Komponenten klein, laden Sie schwere Bibliotheken verzögert und reduzieren Sie die Produktionsbündel.

Verlag: REACTAPP.TOP4 Min. Lesezeit991 Wörter

Quellen: Speeding Up Your Next.js web app: Best Practices

Next.js bietet Ihnen neben React Routing, Server-Rendering, API-Routen sowie Bildoptimierung – und das nahezu ohne zusätzliche Einrichtung – weshalb es, einschließlich AI-generierter Projekte, so beliebt ist. Wenn das Projekt jedoch wächst, tauchen dieselben Probleme auf: Die Kompilierung dauert länger, der Hot Module Replacement funktioniert träge, und selbst kleinste Anpassungen an der Benutzeroberfläche wirken langsam. Zehn Sekunden Kompilierzeit anstelle von einer Sekunde summieren sich monatlich zu Stunden, und das Warten darauf, dass ein AI-Assistent eine Änderung vornimmt, während die Seite neu kompiliert wird, ist obendrein äußerst frustrierend.

Ein AI-Assistent zum Prüfen des Projekts einsetzen

Mit einem KI-basierten Codeeditor müssen Sie nicht jeden Tipp manuell anwenden. Bitten Sie den Assistenten, die Codebasis mit den unten aufgeführten Praktiken zu vergleichen. Eine nützliche Anfrage legt fest, dass er jede Praxis überprüft, erklärt, warum sie wichtig ist, die Auswirkungen auf die Entwicklungszeit, die Build-Zeit oder die Laufzeit abschätzt, die genauen Codeänderungen zeigt und alles mit der aktuellen offiziellen Next.js- sowie React-Dokumentation abgleicht. Er sollte Ratschläge markieren, die veraltet oder nicht mehr empfohlen werden, und stattdessen den neueren Ansatz nennen. Zudem sollten keine spekulativen Optimierungen vorgenommen werden, die in den Dokumentationen nicht unterstützt werden oder nicht zum Projekt passen.

Prüfen Sie alles, was er erstellt, bevor Sie etwas zusammenführen. Frameworks entwickeln sich schnell – das, was vor einem Jahr hilfreich war, kann heute irrelevant sein. Behandeln Sie den Assistenten wie einen erfahrenen Reviewer und nicht wie eine Autorität. Die endgültige Entscheidung fallen lassen die offizielle Dokumentation sowie die Anforderungen der konkreten Anwendung.

Nine Gewohnheiten, die sich auszahlen

1. Entwicklung unter Turbopack ausführen

In neueren Next.js-Versionen ist Turbopack für die lokale Entwicklung stabil. Seine Aktivierung erfolgt über eine Flagge:

next dev --turbopack

Während der ältere, auf webpack basierende Entwicklungsserver den gesamten Projektbereich verarbeitet, rebuildet Turbopack nur die geänderten Module. Bei mittelgroßen und großen Projekten verbessern sich Ladezeiten sowie die Hot-Module-Replacement-Funktion sofort. Für Produktionsbauten wird weiterhin der Standardprozess verwendet, wodurch das Einsatz in der Entwicklung nur geringe Risiken birgt.

2. Schwere Abhängigkeiten vorkompilieren

Die erneute Verarbeitung selten geänderter Drittanbieter-Pakete bei jedem Start ist eine Hauptursache für langsame Ladezeiten. Material UI, Monaco Editor, Three.js, Chart.js sowie große Icon-Sete sind jedes Mal aufwendig zu verarbeiten, wenn der Entwicklungsserver gestartet wird. Next.js kann Importe für benannte Pakete optimieren:

experimental: {
    optimizePackageImports: [
        "@mui/material",
        "@mui/icons-material",
        "lodash"
    ]
}

Vermeiden Sie also das Hinzufügen eines ganzen Pakets, wenn eine einzige Bibliothek ausreicht. Ein kleinererer Abhängigkeitsgraph führt zu einer schnelleren Kompilierung.

3. Überspringen Sie Barrel-Dateien

Eine einzige index.ts-Datei, die alle Komponenten erneut exportiert, sorgt dafür, dass die Imports ordentlich aussehen, zwingt den Compiler aber dazu, viele mehr Dateien zu durchlaufen als nötig. Dieser Import geht über die Barrel-Datei:

import { Button } from "@/components";

Es ist besser, aus dem eigenen Pfad der Komponente zu importieren:

import Button from "@/components/Button";

Es handelt sich um eine kleine Anpassung, die die Modulauflösung verringert, insbesondere in größeren Anwendungen.

4. Halten Sie die Typüberprüfung außerhalb des Entwicklungs Servers

Viele Entwickler deaktivieren in ihrem Entwicklungs Server die TypeScript-Überprüfungen, die bereits vom Editor durchgeführt werden. Starten Sie den Server sowie einen TypeScript-Watcher als zwei separate Prozesse:

next dev --turbopack
tsc --watch

Die Seite lädt sich sofort neu, und Tippfehler werden weiterhin in Echtzeit angezeigt.

5. Halten Sie Client-Komponenten klein

Im App Router landet jede mit "use client" markierte Datei im Browser-Bundle. Überprüfen Sie, ob eine Komponente tatsächlich clientseitige Darstellung benötigt. Statische Layouts, Navigation, Inhaltsseiten sowie das Abrufen von Daten können oft als Server-Komponenten bleiben, wobei Client-Komponenten nur für Teile verwendet werden sollten, die wirklich Interaktivität benötigen. Dadurch wird weniger JavaScript an den Browser gesendet und es müssen während der Entwicklung auch weniger Client-Module neu erstellt werden.

6. Laden Sie schwere Bibliotheken auf Anfrage

Abhängigkeiten, die bei der ersten Darstellung nicht benötigt werden, können warten. Editor, PDF-Viewer, Karten, Diagramm- und Visualisierungs-Pakete eignen sich gut dafür, nur dann geladen zu werden, wenn jemand darauf zugreift:

const Editor = dynamic(() => import("./Editor"), {
    ssr: false
});

Sowohl das ursprüngliche Bundle als auch die Entwicklungs-Neubuilds bleiben deutlich kleiner.

7. Große Komponenten aufteilen

Riesige Seitenkomponenten verlangsamen alle. Eine Seite mit Hunderten von JSX-Zeilen sollte lieber in kleinere, wiederverwendbare Teile aufgeteilt werden – diese lassen sich vom Compiler leichter cachen, sind einfacher zu testen und werden schneller neu gebaut, wenn sich etwas ändert. Wenn eine Datei schwer zu durchforsten ist, ist das in der Regel ein Zeichen, sie aufzuteilen.

8. Unnötige Dienste in der Entwicklung deaktivieren

Analytics-Tools, Logging-Plattformen, Session-Replay-Funktionen, Monitoring-SDKs und Marketing-Skripte sind in der Produktion wichtig, helfen aber selten beim Entwickeln neuer Funktionen. Schalten Sie sie nur ein, wenn Sie in der Produktion arbeiten:

if (process.env.NODE_ENV === "production") {
    initializeAnalytics();
    initializePWA();
}

Weniger Initialisierungen bedeuten eine sauberere lokale Startvorbereitung sowie keine Aufrufe im Netzwerk während der Entwicklung.

9. Optimieren Sie auch die Produktionsversion

Die Entwicklungsgeschwindigkeit ist nur die halbe Geschichte. Verwenden Sie stattdessen das Next.js Image-Komponente anstelle von rohen Bild-Tags, cachen Sie wo immer möglich, komprimieren Sie Ressourcen und nutzen Sie Server Components, um den mitgelieferten JavaScript-Code zu reduzieren. Überprüfen Sie gelegentlich den Bundle mit einem Bundle-Analysewerkzeug, damit überraschend große Abhängigkeiten früh entdeckt werden. Viele kleine Verbesserungen im Laufe der Zeit sind in der Regel besser als eine große Optimierung am Ende.

Wo anzufangen

Das Ziel ist es herauszufinden, wohin die Zeit tatsächlich geht – ob in der Entwicklung, beim Kompilieren oder zur Laufzeit. Beginnen Sie mit den Grundlagen: ein übersichtlicher Abhängigkeitsgraph, sorgfältiges Code-Splitting, minimales Client-Seitiges JavaScript sowie die bereits von Next.js bereitgestellten Tools. Messen Sie, was sich ändert, iterieren Sie und überprüfen Sie die Architektur im Laufe des Wachstums der Anwendung.

Next.js entwickelt sich ständig weiter, und die Empfehlungen ändern sich mit jeder Veröffentlichung. Egal ob die Änderungen von Ihnen oder von einem KI-Assistenten stammen, prüfen Sie sie zunächst im aktuellen offiziellen Next.js- und React-Dokumentation. Die beste Optimierung ist die, die für die Version geeignet ist, auf der Sie gerade arbeiten – nicht die, die letztes Jahr beliebt war.