Projektstruktur und Organisation

Diese Seite bietet einen Überblick über alle Ordner- und Dateikonventionen in Next.js sowie Empfehlungen zur Organisation Ihres Projekts.

Ordner- und Dateikonventionen

Top-Level-Ordner

Top-Level-Ordner werden verwendet, um den Code Ihrer Anwendung und statische Assets zu organisieren.

Route-Segmente zu Pfadsegmenten
appApp-Router
pagesPages-Router
publicStatische Assets, die bereitgestellt werden sollen
srcOptionaler Quellordner der Anwendung

Top-Level-Dateien

Top-Level-Dateien werden verwendet, um Ihre Anwendung zu konfigurieren, Abhängigkeiten zu verwalten, Middleware auszuführen, Monitoring-Tools zu integrieren und Umgebungsvariablen zu definieren.

Next.js
next.config.jsKonfigurationsdatei für Next.js
package.jsonProjektabhängigkeiten und Skripte
instrumentation.tsOpenTelemetry- und Instrumentationsdatei
middleware.tsNext.js-Request-Middleware
.envUmgebungsvariablen
.env.localLokale Umgebungsvariablen
.env.productionProduktionsumgebungsvariablen
.env.developmentEntwicklungsumgebungsvariablen
.eslintrc.jsonKonfigurationsdatei für ESLint
.gitignoreGit-Dateien und -Ordner, die ignoriert werden sollen
next-env.d.tsTypeScript-Deklarationsdatei für Next.js
tsconfig.jsonKonfigurationsdatei für TypeScript
jsconfig.jsonKonfigurationsdatei für JavaScript

Routing-Dateien

layout.js .jsx .tsxLayout
page.js .jsx .tsxSeite
loading.js .jsx .tsxLade-UI
not-found.js .jsx .tsxNicht-gefunden-UI
error.js .jsx .tsxFehler-UI
global-error.js .jsx .tsxGlobale Fehler-UI
route.js .tsAPI-Endpunkt
template.js .jsx .tsxNeu gerendertes Layout
default.js .jsx .tsxFallback-Seite für parallele Routen

Verschachtelte Routen

folderRoutensegment
folder/folderVerschachteltes Routensegment

Dynamische Routen

[folder]Dynamisches Routensegment
[...folder]Catch-all-Routensegment
[[...folder]]Optionales Catch-all-Routensegment

Routengruppen und private Ordner

(folder)Routen gruppieren, ohne das Routing zu beeinflussen
_folderOrdner und alle Kindsegmente aus dem Routing ausschließen

Parallele und abgefangene Routen

@folderBenannter Slot
(.)folderAuf gleicher Ebene abfangen
(..)folderEine Ebene höher abfangen
(..)(..)folderZwei Ebenen höher abfangen
(...)folderVon der Wurzel abfangen

Metadaten-Dateikonventionen

App-Icons

favicon.icoFavicon-Datei
icon.ico .jpg .jpeg .png .svgApp-Icon-Datei
icon.js .ts .tsxGeneriertes App-Icon
apple-icon.jpg .jpeg, .pngApple-App-Icon-Datei
apple-icon.js .ts .tsxGeneriertes Apple-App-Icon

Open Graph- und Twitter-Bilder

opengraph-image.jpg .jpeg .png .gifOpen-Graph-Bilddatei
opengraph-image.js .ts .tsxGeneriertes Open-Graph-Bild
twitter-image.jpg .jpeg .png .gifTwitter-Bilddatei
twitter-image.js .ts .tsxGeneriertes Twitter-Bild

SEO

sitemap.xmlSitemap-Datei
sitemap.js .tsGenerierte Sitemap
robots.txtRobots-Datei
robots.js .tsGenerierte Robots-Datei

Organisation Ihres Projekts

Next.js ist nicht vorschreibend darüber, wie Sie Ihre Projektdateien organisieren und zusammenstellen. Es bietet jedoch mehrere Funktionen, die Ihnen bei der Organisation Ihres Projekts helfen.

Komponentenhierarchie

Die in speziellen Dateien definierten Komponenten werden in einer bestimmten Hierarchie gerendert:

  • layout.js
  • template.js
  • error.js (React-Fehlerbegrenzung)
  • loading.js (React-Suspense-Begrenzung)
  • not-found.js (React-Fehlerbegrenzung)
  • page.js oder verschachteltes layout.js
Komponentenhierarchie für Dateikonventionen

Die Komponenten werden rekursiv in verschachtelten Routen gerendert, was bedeutet, dass die Komponenten eines Routensegments innerhalb der Komponenten seines übergeordneten Segments verschachtelt werden.

Verschachtelte Komponentenhierarchie für Dateikonventionen

Colocation

Im app-Verzeichnis definieren verschachtelte Ordner die Routenstruktur. Jeder Ordner repräsentiert ein Routensegment, das einem entsprechenden Segment in einem URL-Pfad zugeordnet ist.

Allerdings ist eine Route nicht öffentlich zugänglich, bis eine page.js- oder route.js-Datei zu einem Routensegment hinzugefügt wird.

Ein Diagramm, das zeigt, wie eine Route erst öffentlich zugänglich wird, wenn eine page.js- oder route.js-Datei zum Routensegment hinzugefügt wird.

Und selbst wenn eine Route öffentlich zugänglich gemacht wird, wird nur der Inhalt, der von page.js oder route.js zurückgegeben wird, an den Client gesendet.

Ein Diagramm, das zeigt, wie page.js- und route.js-Dateien Routen öffentlich zugänglich machen.

Das bedeutet, dass Projektdateien sicher im gleichen Ordner innerhalb von Routensegmenten im app-Verzeichnis platziert werden können, ohne versehentlich routbar zu sein.

Ein Diagramm, das zeigt, dass colokalisierte Projektdateien nicht routbar sind, selbst wenn ein Segment eine page.js- oder route.js-Datei enthält.

Gut zu wissen: Während Sie Ihre Projektdateien in app colokalisieren können, müssen Sie das nicht. Wenn Sie es bevorzugen, können Sie sie außerhalb des app-Verzeichnisses belassen.

Private Ordner

Private Ordner können erstellt werden, indem einem Ordner ein Unterstrich vorangestellt wird: _ordnerName

Dies zeigt an, dass der Ordner ein privates Implementierungsdetail ist und nicht vom Routing-System berücksichtigt werden sollte, wodurch der Ordner und alle seine Unterordner vom Routing ausgenommen werden.

Eine Beispielordnerstruktur mit privaten Ordnern

Da Dateien im app-Verzeichnis standardmäßig sicher colokalisiert werden können, sind private Ordner für die Colokalisierung nicht erforderlich. Sie können jedoch nützlich sein für:

  • Trennung von UI-Logik und Routing-Logik.
  • Konsistente Organisation interner Dateien in einem Projekt und im Next.js-Ökosystem.
  • Sortierung und Gruppierung von Dateien in Code-Editoren.
  • Vermeidung potenzieller Namenskonflikte mit zukünftigen Next.js-Dateikonventionen.

Gut zu wissen:

  • Obwohl keine Framework-Konvention, können Sie auch Dateien außerhalb privater Ordner als "privat" markieren, indem Sie das gleiche Unterstrich-Muster verwenden.
  • Sie können URL-Segmente erstellen, die mit einem Unterstrich beginnen, indem Sie dem Ordnernamen %5F voranstellen (die URL-kodierte Form eines Unterstrichs): %5FfolderName.
  • Wenn Sie keine privaten Ordner verwenden, ist es hilfreich, die speziellen Dateikonventionen von Next.js zu kennen, um unerwartete Namenskonflikte zu vermeiden.

Routengruppen

Routengruppen können erstellt werden, indem ein Ordner in Klammern eingeschlossen wird: (ordnerName)

Dies zeigt an, dass der Ordner nur organisatorischen Zwecken dient und nicht in den URL-Pfad der Route aufgenommen werden sollte.

Eine Beispielordnerstruktur mit Routengruppen

Routengruppen sind nützlich für:

src-Ordner

Next.js unterstützt die Speicherung von Anwendungscode (einschließlich app) in einem optionalen src-Ordner. Dies trennt Anwendungscode von Projektkonfigurationsdateien, die meist im Stammverzeichnis eines Projekts liegen.

Eine Beispielordnerstruktur mit dem `src`-Ordner

Beispiele

Der folgende Abschnitt listet eine sehr hochrangige Übersicht gängiger Strategien. Die einfachste Erkenntnis ist, eine Strategie zu wählen, die für Sie und Ihr Team funktioniert, und diese konsistent im Projekt anzuwenden.

Gut zu wissen: In unseren Beispielen unten verwenden wir components- und lib-Ordner als allgemeine Platzhalter. Deren Benennung hat keine besondere Bedeutung für das Framework, und Ihre Projekte könnten andere Ordner wie ui, utils, hooks, styles usw. verwenden.

Projektdateien außerhalb von app speichern

Diese Strategie speichert den gesamten Anwendungscode in gemeinsamen Ordnern im Stammverzeichnis Ihres Projekts und behält das app-Verzeichnis rein für Routing-Zwecke bei.

Eine Beispielordnerstruktur mit Projektdateien außerhalb von app

Projektdateien in Top-Level-Ordnern innerhalb von app speichern

Diese Strategie speichert den gesamten Anwendungscode in gemeinsamen Ordnern im Stammverzeichnis des app-Verzeichnisses.

Eine Beispielordnerstruktur mit Projektdateien innerhalb von app

Projektdateien nach Feature oder Route aufteilen

Diese Strategie speichert global geteilten Anwendungscode im Stammverzeichnis des app-Verzeichnisses und teilt spezifischeren Anwendungscode in die Routensegmente auf, die sie verwenden.

Eine Beispielordnerstruktur mit Projektdateien nach Feature oder Route aufgeteilt

Routen organisieren, ohne den URL-Pfad zu beeinflussen

Um Routen zu organisieren, ohne die URL zu beeinflussen, erstellen Sie eine Gruppe, um verwandte Routen zusammenzuhalten. Die Ordner in Klammern werden aus der URL ausgelassen (z.B. (marketing) oder (shop)).

Organisation von Routen mit Routengruppen

Obwohl Routen innerhalb von (marketing) und (shop) die gleiche URL-Hierarchie teilen, können Sie für jede Gruppe ein unterschiedliches Layout erstellen, indem Sie eine layout.js-Datei in ihren Ordnern hinzufügen.

Routengruppen mit mehreren Layouts

Bestimmte Segmente für ein Layout auswählen

Um bestimmte Routen für ein Layout auszuwählen, erstellen Sie eine neue Routengruppe (z.B. (shop)) und verschieben Sie die Routen, die das gleiche Layout teilen, in die Gruppe (z.B. account und cart). Die Routen außerhalb der Gruppe teilen das Layout nicht (z.B. checkout).

Routengruppen mit Opt-in-Layouts

Lade-Skelette für eine bestimmte Route auswählen

Um ein Lade-Skeleton über eine loading.js-Datei auf eine bestimmte Route anzuwenden, erstellen Sie eine neue Routengruppe (z.B. /(overview)) und verschieben Sie Ihre loading.tsx in diese Routengruppe.

Ordnerstruktur mit einer loading.tsx und einer page.tsx innerhalb der Routengruppe

Nun wird die loading.tsx-Datei nur auf Ihre Dashboard → Übersichtsseite angewendet, anstatt auf alle Dashboard-Seiten, ohne die URL-Pfadstruktur zu beeinflussen.

Mehrere Root-Layouts erstellen

Um mehrere Root-Layouts zu erstellen, entfernen Sie die layout.js-Datei auf oberster Ebene und fügen Sie eine layout.js-Datei in jede Routengruppe ein. Dies ist nützlich, um eine Anwendung in Abschnitte mit völlig unterschiedlicher UI oder Benutzererfahrung aufzuteilen. Die <html>- und <body>-Tags müssen zu jedem Root-Layout hinzugefügt werden.

Routengruppen mit mehreren Root-Layouts

Im obigen Beispiel haben sowohl (marketing) als auch (shop) ihr eigenes Root-Layout.