Erscheinungsbild
SEO
Der Starter gibt auf jeder Seite vollständige Metadaten aus, zeichnet Organisation, Website und Seite als JSON-LD aus und steuert, was in den Index darf. Die Grundlagen dafür stehen in der Projektkonfiguration; eine einzelne Seite ergänzt nur, was ihr eigen ist.
| Thema | Inhalt |
|---|---|
| Metadaten | Titel, Description, Canonical, Open Graph, X-Karten, hreflang |
| Structured Data | JSON-LD-Builder, Brotkrumen, FAQ |
| Indexierung | Routen-Policy, Umgebungen, robots.txt, Sitemap |
Der Grundsatz
Die Ausgabe behauptet nichts, was es nicht gibt.
Kein Schema ohne sichtbare Entsprechung, kein hreflang ohne gebaute Übersetzung, kein Canonical, der auf eine andere Seite zeigt als die eigene. Metadaten sieht niemand — deshalb bleiben Fehler dort jahrelang stehen. Siehe ADR 0007.
Was eine Seite selbst angibt
Alles läuft über BaseLayout. Eine Seite, die einen Titel oder ein Vorschaubild selbst in den Kopf schreibt, hätte ihn doppelt.
astro
---
import BaseLayout from '../layouts/BaseLayout.astro';
---
<BaseLayout
title="Leistungen"
description="Was wir anbieten."
breadcrumbs={[{ label: 'Startseite', href: '/' }, { label: 'Leistungen' }]}
>
<h1>Leistungen</h1>
</BaseLayout>| Prop | Wirkung |
|---|---|
title | Pflicht; wird in site.titleTemplate eingesetzt |
description | fällt auf site.description zurück |
breadcrumbs | sichtbarer Pfad und BreadcrumbList aus einer Liste |
ogImage | Schlüssel aus dem Asset-Manifest; sonst gilt seo.defaultOgImage |
ogType | website (Vorgabe) oder article |
translations | Sprache → Pfad; erzeugt hreflang |
jsonLd | zusätzliche Knoten aus den Buildern, etwa articleNode() |
noindex | Einzelfall; der Regelweg ist die Routen-Policy |
locale | nur für Seiten, die nicht in der Standardsprache vorliegen |
Wo was liegt
| Datei | Zweck |
|---|---|
src/lib/seo/metadata.ts | Titel, Canonical, Open Graph, Alternates — reine Funktionen |
src/lib/seo/jsonld.ts | typisierte JSON-LD-Builder |
src/lib/seo/indexing.ts | Routen-Policy, robots-Meta, robots.txt |
src/lib/seo/sitemap.ts | Auswahl der Seiten und XML |
src/lib/seo/integration.ts | schreibt die Sitemap nach dem Bauen |
src/components/seo/Seo.astro | gibt die Kopfdaten aus; eingebunden von BaseLayout |
src/components/seo/Faq.astro | sichtbare Fragen samt FAQPage |
src/components/navigation/Breadcrumbs.astro | sichtbarer Brotkrumenpfad |
Die Logik liegt bewusst in src/lib/seo/ und nicht in den Komponenten: Dort ist sie ohne Astro-Laufzeit einzeln testbar. Die Komponenten lösen nur auf, was ohne Astro nicht geht — das Vorschaubild durch die Bildpipeline schicken und die fertigen Tags schreiben.