EN

Wie Webseiten in Hugo aufgebaut sind

Webseiten folgen in ihrem Aufbau einem Muster. Je nach eigenen Anforderungen lässt sich ihre Komplexität schrittweise steigern. Hugo bietet Entwicklern und Autoren nützliche Hilfsmittel, um Besuchern auch umfangreiche Inhalte auf eine übersichtliche Weise zugänglich zu machen.

Ein zentraler Aspekt dieser Inhaltsverwaltung ist die Zuweisung von Arten (kinds) und Typen (types) zu Inhalten. In Hugo erfolgt diese Zuweisung meist automatisch, basierend auf den Dateinamen und der Position der Dateien im Verzeichnisbaum. Die Zuordnung zu einer bestimmten Art oder einem Typ entscheidet über das Layout, das für einen gegebenen Hauptinhalt angewendet wird. Arten und Typen spielen auch eine wesentliche Rolle, wenn neue Inhalte mithilfe von Archetypen erstellt werden.

In diesem Teil der Serie geben wir einen Überblick über die Arten und Typen, die Hugo standardmäßig vergibt. An späterer Stelle wird zudem erläutert, wie man Typen manuell zuweist.

Flache Hierarchien

Zunächst zum einfachsten Fall. Von einem One-Pager spricht man bezüglich Webseiten, die nur eine einzige Hauptseite umfassen. In Hugo wird der Hauptinhalt dieser Seite in der Datei content/_index.md gespeichert. Diese Seite ist über die Basis-URL (z.B. https://example.com/) erreichbar. Da ihr automatisch die Art home zugewiesen wird, wird für sie das home-Layout angewendet.

Viele Webseiten umfassen mehrere Einzelseiten, die unabhängig voneinander bestehen. Auf der Webseite eines Handwerksbetriebs finden sich etwa Unterseiten wie Startseite, Leistungen, Über uns und Kontakt. In Hugo legt man für jede dieser Seiten eine separate Markup-Datei im content/-Verzeichnis an, etwa content/leistungen.md. Diese Seiten werden als Einzelseiten (single pages) behandelt – das bedeutet, dass sie eigenständige Hauptinhalte darstellen. Solche Seiten erhalten automatisch die Art page und verwenden das single-Layout.

Sie sind abzugrenzen von Überblicksseiten, die Einzelseiten auflisten. Allgemein werden sie als Listenseiten (list pages) bezeichnet. Ihnen werden differenziertere Arten zugeordnet (dazu gleich mehr), während ein list-Layout als Fallback definiert werden kann.

Zusätzlich unterscheidet Hugo besondere Arten von Einzelseiten: 404 für eine 404-Fehlerseite, sitemap für die sitemap.xml und robotstxt für die robots.txt. Diese Seiten werden automatisch erzeugt und können durch jeweils gleichnamige Layouts gestaltet werden.

Sektionen

Obwohl viele Inhalte als Einzelseiten für sich stehen, eignen sie sich nicht für die Hauptnavigation. Blogbeiträge sind ein typisches Beispiel, ebenso wie Zeitungsartikel oder einzelne Tutorials auf einem Tech-Portal. Solche Inhalte bilden spezifische Typen von Einzelseiten – Blogbeitrag, Artikel oder Tutorial.

Hugo spricht in diesem Kontext von Sektionen der Webseite. Es handelt sich um Bereiche, deren Inhalte in der Regel thematisch oder stilistisch zusammenpassen. Praktisch werden sie dadurch definiert, dass direkte oder indirekte Unterverzeichnisse im content/-Ordner erstellt werden. Dabei unterscheidet man zwei grundlegende Fälle.

Wird ein Verzeichnis direkt unter content/ erstellt, so ergibt sich daraus ein gleichnamiger Typ von Einzelseite. Typen verhalten sich ähnlich wie Arten, sind aber etwas spezifischer. Zum Beispiel ist der Inhalt von content/blog/post-1.md von der Art page und vom Typ blog. Daraus folgt, dass für post-1.md das blog-Layout angewendet wird, sofern es existiert. Dies gilt auch für Inhalte auf tieferen Ebenen. So ist auch content/blog/2024/post-1.md seinem Typ nach ein Blogpost.

Verzeichnisse, die sich auf tieferen Ebenen des Verzeichnisbaums befinden, repräsentieren dann eine Sektion der Webseite, wenn sie eine Datei namens _index.md enthalten. Diese Markup-Datei erzeugt meist eine Überblicksseite. So würde content/blog/_index.md eine Seite generieren, Blogbeiträge auflistet und über domain.com/blog/ aufgerufen wird. Das section-Layout bestimmt dabei, wie die Einzelseiten des entsprechenden Typs dargestellt werden.

Layouts für Sektionen lassen sich auf vielfache Weise definieren, wobei die folgenden wahrscheinlich am ehesten verwendet würden: layouts/blog/list.html, layouts/_default/blog.html, layouts/_default/section.html. Oder auch das sehr allgemeine layout/_default/list.html, das als Fallback nicht nur für Sektionen, sondern auch für andere Übersichtsseiten fungiert (etwa für Taxonomien).

Mehr Kontrolle über die präsentierten Inhalte einer Sektion

Verzeichnisse direkt unter content/ – Hugo nennt sie: top-level content directorieskönnen eine _index.md enthalten. Anders als bei Sektionen der anderen Art, entscheidet das aber nicht darüber, ob eine entsprechende Überblicksseite verfügbar ist. Falls nicht ausdrücklich deaktiviert (dazu gleich mehr), erzeugt Hugo für alle Top-Level-Sektionen automatisch eine Überblicksseite.

Das ist jedoch nicht immer gewünscht. Nehmen wir die Blog-Section als Beispiel: Statt alle Blogbeiträge auf einer Seite zu präsentieren, könnten wir sie nach Veröffentlichungsjahr strukturieren. Dann könnten wir beispielsweise content/blog/2024/_index.md und content/blog/2023/_index.md anlegen, um für die Sektionen der tieferen Ebenen Überblicksseiten zu generieren. Hugo wird jedoch standardmäßig auch domain.com/blog/ verfügbar machen.

Wollen wir das nicht, so kann content/blog/_index.md genutzt werden, um die Überblicksseite zu deaktivieren.

---
title: "Blog"
_build:
  render: never
  list: never
---

Diese Einstellung bewirkt, dass domain.com/blog/ auf die 404-Fehlerseite führt, während domain.com/blog/2023/ und domain.com/blog/2024/ erreichbar bleiben.

Sektionen sind hilfreich, um Besuchern systematisch die Inhalte eines bestimmten Typs zu präsentieren, besonders wenn es sehr viele Inhalte dieses Typs gibt. In anderen Szenarien, in denen Unterverzeichnisse tieferer Ebenen keine _index.md haben, dienen sie lediglich der Strukturierung von Dateipfaden und URLs. Deshalb haben in Hugo auch Unterverzeichnisse ihren Platz, die keine Sektionen repräsentieren.

Sektionen für die gesamte Webseite deaktivieren

Falls keine Sektionen auf der Seite benötigt werden, lassen sich diese global in der Hauptkonfiguration (hugo.yaml) deaktivieren:

disableKinds: ['section']

Damit werden für Verzeichnisse direkt unter content/ keine automatischen Überblicksseiten mehr erstellt. Wollen wir dennoch eine Überblicksseite nutzen, so können wir für sie weiterhin eine _index.md erzeugen.

Natürlich hat es praktische Konsequenzen, Sektionen grundsätzlich zu deaktivieren. Zu den Funktionen, die daraufhin nicht mehr genutzt werden können, gehören spezifische Layouts (unter layouts/SECTION/), eigene Template-Variablen (.Section und .CurrentSection) und Section-Menüs.

Übrigens können auch andere Arten von automatisch erstellten Inhalten in Hugo auf diese Weise deaktiviert werden. Von den bereits genannten Arten von Inhalten sind das: 404, home, page, robotstxt, rss und sitemap. Im Kontext der Verschlagwortung werden zwei weitere Arten besprochen werden.

Artikel vom 27. September 2024.