Astro für Anfänger · Teil 21TutorialEinsteiger

Astro

Astro-Kurs 21: Dynamische Beitragsseiten

Du erzeugst aus Blogeinträgen automatisch eigene URLs.

Veröffentlicht am

Etappe 2 – Lektion 21 von 22 · Modellbau-Werkstatt
Voraussetzungen: Etappe 1 (Teile 1–11); ab Teil 13 auch die jeweils vorherige Lektion.

Lernziel: Du erzeugst aus Blogeinträgen automatisch eigene URLs.

1. Ein Dateiname – viele Webseiten

Unser Blog hat mehrere Beiträge. Statt für jeden einen eigenen .astro-Seitenbaustein anzulegen, erzeugen wir Seiten aus den Collection-Einträgen.

Wichtig: Entferne src/pages/blog.astro aus Teil 20 und lege stattdessen src/pages/blog/index.astro an. Sonst können zwei Dateien dieselbe Route /blog beanspruchen.

src/pages/blog/index.astro:

---
import BasisLayout from '../../layouts/BasisLayout.astro';
import { getCollection } from 'astro:content';
const posts = (await getCollection('blog')).sort(
  (a, b) => b.data.pubDate.valueOf() - a.data.pubDate.valueOf()
);
---
<BasisLayout title="Blog">
  <h1>Werkstatt-Blog</h1>
  <ul>
    {posts.map(post => (
      <li><a href={`/blog/${post.id}/`}>{post.data.title}</a></li>
    ))}
  </ul>
</BasisLayout>

2. Dynamische Route

Erstelle src/pages/blog/[id].astro:

---
import BasisLayout from '../../layouts/BasisLayout.astro';
import { getCollection, render } from 'astro:content';

export async function getStaticPaths() {
  const posts = await getCollection('blog');
  return posts.map(post => ({
    params: { id: post.id },
    props: { post },
  }));
}

const { post } = Astro.props;
const { Content } = await render(post);
---
<BasisLayout title={post.data.title}>
  <article>
    <p>{post.data.category} · {post.data.pubDate.toLocaleDateString('de-DE')}</p>
    <h1>{post.data.title}</h1>
    <Content />
    <p><a href="/blog/">Zurück zur Übersicht</a></p>
  </article>
</BasisLayout>

getStaticPaths() erzeugt beim statischen Build für jeden Beitrag eine Route. Die id stammt standardmäßig aus dem Dateinamen des Collection-Eintrags. render(post) erzeugt den gerenderten Markdown-Inhalt als <Content />.

3. URL überprüfen

Teste /blog/mein-erster-druck/ und /blog/mein-flugmodell/. Führe danach npm run build aus.

Übung

Füge einen neuen Beitrag servo-reparatur.md in die Collection ein. Kontrolliere, ob die neue Seite ohne Änderung der Routing-Datei erreichbar ist.

Lösungshinweis

Die URL lautet /blog/servo-reparatur/, wenn kein eigener Eintrags-ID-Generator definiert wurde und der Dateiname servo-reparatur.md ist.

Quelle: https://docs.astro.build/de/guides/content-collections/


Alle Beispiele beziehen sich auf ein eigenes Astro-Übungsprojekt. Die Dateipfade sind relativ zum Projekt-Hauptordner angegeben. Die Kursdateien selbst gehören in das Content-Verzeichnis der Know-How-Schmiede, nicht in das Übungsprojekt.