diff --git a/src/content/docs/de/tutorial/5-astro-api/1.mdx b/src/content/docs/de/tutorial/5-astro-api/1.mdx new file mode 100644 index 0000000000000..691395d535ab0 --- /dev/null +++ b/src/content/docs/de/tutorial/5-astro-api/1.mdx @@ -0,0 +1,251 @@ +--- +type: tutorial +title: Blog-Beitragsarchiv erstellen +description: |- + Tutorial: Erstelle deinen ersten Astro-Blog — + Nutze import.meta.glob(), um auf Daten aus Dateien in deinem Projekt zuzugreifen +i18nReady: true +--- + +import Box from '~/components/tutorial/Box.astro'; +import Checklist from '~/components/Checklist.astro'; +import MultipleChoice from '~/components/tutorial/MultipleChoice.astro'; +import Option from '~/components/tutorial/Option.astro'; +import PreCheck from '~/components/tutorial/PreCheck.astro'; +import { Steps } from '@astrojs/starlight/components'; + +Jetzt, wo du ein paar Blog-Beiträge hast, die du verlinken kannst, ist es Zeit, die Blog-Seite so einzurichten, dass automatisch eine Liste davon erstellt wird! + + + - Greife mit `import.meta.glob()` auf die Daten aller deiner Beiträge gleichzeitig zu + - Zeige eine dynamisch generierte Liste der Beiträge auf deiner Blog-Seite an + - Überarbeite den Code, um für jedes Listenelement eine ``-Komponente zu verwenden + + +## Dynamische Anzeige einer Liste von Beiträgen + + +1. Füge den folgenden Code zu `blog.astro` hinzu, um Infos zu all deinen Markdown-Dateien zurückzugeben. + `import.meta.glob()` gibt ein Array von Objekten zurück, wobei jedes einem Blogbeitrag entspricht. + + ```astro title="src/pages/blog.astro" ins={3} + --- + import BaseLayout from '../layouts/BaseLayout.astro' + const allPosts = Object.values(import.meta.glob('./posts/*.md', { eager: true })); + const pageTitle = "Mein Astro-Lernblog"; + --- + +

Hier werde ich über meine Erfahrungen beim Lernen von Astro berichten.

+ +
+ ``` + +2. Um die ganze Liste der Beiträge dynamisch zu erstellen, indem du die Beitragstitel und URLs nutzt, ersetze deine einzelnen `
  • `-Tags durch den folgenden Astro-Code: + + ```astro title="src/pages/blog.astro" del={9,10,11} ins= {13} + --- + import BaseLayout from '../layouts/BaseLayout.astro' + const allPosts = Object.values(import.meta.glob('./posts/*.md', { eager: true })); + const pageTitle = "Mein Astro-Lernblog"; + --- + +

    Hier werde ich über meine Erfahrungen beim Lernen von Astro berichten.

    + +
    + ``` + + Deine ganze Liste von Blog-Beiträgen wird jetzt dynamisch mit der integrierten TypeScript-Unterstützung von Astro generiert, indem das von `import.meta.glob()` zurückgegebene Array zugeordnet wird. + +3. Füge einen neuen Blogbeitrag hinzu, indem du eine neue Datei `post-4.md` in `src/pages/posts/` erstellst und einige Markdown-Inhalte hinzufügst. + Achte darauf, dass du mindestens die unten verwendeten Frontmatter-Eigenschaften einfügst. + + ```markdown + --- + layout: ../../layouts/MarkdownPostLayout.astro + title: Mein vierter Blogbeitrag + author: Astro-Lernender + description: "Dieser Beitrag wird eigenständig angezeigt!" + image: + url: "https://docs.astro.build/default-og-image.png" + alt: "Das Wort 'astro' vor einer Illustration von Planeten und Sternen." + pubDate: 2022-08-08 + tags: ["astro", "successes"] + --- + Dieser Beitrag sollte zusammen mit meinen anderen Blogbeiträgen angezeigt werden, weil `import.meta.glob()` eine Liste aller meiner Beiträge zurückgibt, um meine Liste zu erstellen. + ``` + +4. Schau dir deine Blog-Seite in der Browser-Vorschau unter `http://localhost:4321/blog` an und such nach einer aktualisierten Liste mit vier Einträgen, darunter dein neuer Blogbeitrag! + + + + +## Challenge: Erstelle eine BlogPost-Komponente + +Versuch selbst, alle notwendigen Änderungen an deinem Astro-Projekt vorzunehmen, damit du stattdessen den folgenden Code verwenden kannst, um deine Liste mit Blogbeiträgen zu erstellen: + +```astro title="src/pages/blog.astro" del={2} ins={3} + +``` + +
    +Erweitere, um die Schritte anzuzeigen + + +1. Erstelle eine neue Komponente in `src/components/`. + +
    + Zeige den Dateinamen an + ``` + BlogPost.astro + ``` +
    + +2. Schreib die Codezeile in deine Komponente, damit sie einen `title` und eine `url` als `Astro.props` empfangen kann. + +
    + Code anzeigen + ```astro + --- + // src/components/BlogPost.astro + const { title, url } = Astro.props; + --- + ``` +
    + +3. Füge die Vorlage hinzu, mit der du jedes Element in deiner Blogpost-Liste erstellst. + +
    + Code anzeigen + ```astro + +
  • {title}
  • + ``` +
    + +4. Importiere die neue Komponente in deine Blog-Seite. + +
    + Code anzeigen + ```astro title="src/pages/blog.astro" ins={3} + --- + import BaseLayout from '../layouts/BaseLayout.astro'; + import BlogPost from '../components/BlogPost.astro'; + const allPosts = Object.values(import.meta.glob('../pages/posts/*.md', { eager: true })); + const pageTitle = "Mein Astro-Lernblog"; + --- + ``` +
    + +5. Überprüfe es selbst: Schau dir den fertigen Komponentencode an. + +
    + Code anzeigen + ```astro title="src/components/BlogPost.astro" + --- + const { title, url } = Astro.props + --- +
  • {title}
  • + ``` + ```astro title="src/pages/blog.astro" ins={3,10} + --- + import BaseLayout from '../layouts/BaseLayout.astro'; + import BlogPost from '../components/BlogPost.astro'; + const allPosts = Object.values(import.meta.glob('../pages/posts/*.md', { eager: true })); + const pageTitle = "Mein Astro-Lernblog"; + --- + +

    Hier werde ich über meine Erfahrungen beim Lernen von Astro berichten.

    +
      + {allPosts.map((post: any) => )} +
    +
    + ``` +
    +
    +
    +
    + + + +### Test dein Wissen + +Wenn deine Astro-Komponente die folgende Codezeile enthält: + +```astro +--- +const myPosts = Object.values(import.meta.glob('./posts/*.md', { eager: true })); +--- +``` + +Wähle die Syntax, die du schreiben könntest, um Folgendes darzustellen: + +1. Den Titel deines dritten Blogbeitrags. + + + + + + + +2. Einen Link zur URL deines ersten Blogbeitrags. + + + + + + + +3. Eine Komponente für jeden Beitrag, die das Datum der letzten Aktualisierung anzeigt. + + + + + + + + + +## Checkliste + + + + +- [ ] Ich kann Daten aus meinen lokalen Dateien abfragen. +- [ ] Ich kann eine Liste aller meiner Blog-Beiträge anzeigen. + + + +### Ressourcen + +- [Importieren von Glob-Mustern in Astro](/de/guides/imports/#astroglob) diff --git a/src/content/docs/de/tutorial/5-astro-api/2.mdx b/src/content/docs/de/tutorial/5-astro-api/2.mdx new file mode 100644 index 0000000000000..d8d1a33c84e7a --- /dev/null +++ b/src/content/docs/de/tutorial/5-astro-api/2.mdx @@ -0,0 +1,348 @@ +--- +type: tutorial +title: Tag-Seiten erstellen +description: |- + Tutorial: Erstelle deinen ersten Astro-Blog — + Verwende getStaticPaths(), um mehrere Seiten (Routen) gleichzeitig zu erstellen +i18nReady: true +--- + +import Box from '~/components/tutorial/Box.astro'; +import Checklist from '~/components/Checklist.astro'; +import MultipleChoice from '~/components/tutorial/MultipleChoice.astro'; +import Option from '~/components/tutorial/Option.astro'; +import PreCheck from '~/components/tutorial/PreCheck.astro'; +import { Steps } from '@astrojs/starlight/components'; + + + - Erstelle eine Seite, um mehrere Seiten zu generieren + - Gib an, welche Seitenrouten erstellt werden sollen, und gib jeder Seite ihre eigenen Props + + +## Dynamisches Seiten-Routing + +Du kannst ganze Seitensätze dynamisch erstellen, indem du `.astro`-Dateien verwendest, die eine `getStaticPaths()`-Funktion exportieren. + +## Seiten dynamisch erstellen + + +1. Erstelle eine neue Datei unter `src/pages/tags/[tag].astro`. + (Du musst einen neuen Ordner erstellen.) + Beachte, dass der Dateiname (`[tag].astro`) eckige Klammern enthält. + Füge den folgenden Code in die Datei ein: + + ```astro title="src/pages/tags/[tag].astro" + --- + import BaseLayout from '../../layouts/BaseLayout.astro'; + + export async function getStaticPaths() { + return [ + { params: { tag: "astro" } }, + { params: { tag: "successes" } }, + { params: { tag: "community" } }, + { params: { tag: "blogging" } }, + { params: { tag: "setbacks" } }, + { params: { tag: "learning in public" } }, + ]; + } + + const { tag } = Astro.params; + --- + +

    Beiträge mit dem Tag {tag}

    +
    + ``` + + Die Funktion `getStaticPaths` gibt ein Array von Seitenrouten zurück, und alle Seiten unter diesen Routen verwenden dieselbe Vorlage, die in der Datei definiert ist. + +2. Wenn du deine Blog-Beiträge angepasst hast, ersetze die einzelnen Tag-Werte (z. B. „astro”, „successes”, „community” usw.) durch die Tags, die du in deinen eigenen Beiträgen verwendest. + +3. Stell sicher, dass jeder Blogbeitrag mindestens ein Tag enthält, das als Array geschrieben ist, z. B. `tags: ["blogging"]`. + +4. Ruf `http://localhost:4321/tags/astro` in deiner Browser-Vorschau auf. + Du solltest eine Seite sehen, die dynamisch aus `[tag].astro` generiert wurde. + Überprüfe, ob du auch Seiten für jedes deiner Tags unter `/tags/successes`, `/tags/community` und `/tags/learning%20in%20public` usw. oder unter jedem deiner benutzerdefinierten Tags erstellt hast. + Möglicherweise musst du zuerst den Entwicklungsserver beenden und neu starten, um diese neuen Seiten anzuzeigen. +
    + +## Verwende Props in dynamischen Routen + + +1. Füge die folgenden Props zu deiner Funktion `getStaticPaths()` hinzu, um die Daten aus all deinen Blog-Beiträgen für jede Seitenroute verfügbar zu machen. + + Achte darauf, jeder Route in deinem Array die neuen Props zuzuweisen und diese Props dann außerhalb deiner Funktion für deine Komponentenvorlage verfügbar zu machen. + + ```astro title="src/pages/tags/[tag].astro" ins={5,18} ins="props: {posts: allPosts}" + --- + import BaseLayout from '../../layouts/BaseLayout.astro'; + + export async function getStaticPaths() { + const allPosts = Object.values(import.meta.glob('../posts/*.md', { eager: true })); + + return [ + {params: {tag: "astro"}, props: {posts: allPosts}}, + {params: {tag: "successes"}, props: {posts: allPosts}}, + {params: {tag: "community"}, props: {posts: allPosts}}, + {params: {tag: "blogging"}, props: {posts: allPosts}}, + {params: {tag: "setbacks"}, props: {posts: allPosts}}, + {params: {tag: "learning in public"}, props: {posts: allPosts}} + ]; + } + + const { tag } = Astro.params; + const { posts } = Astro.props; + --- + ``` + +2. Filtere deine Liste der Beiträge mit der integrierten TypeScript-Unterstützung von Astro, um nur Beiträge aufzunehmen, die das eigene Tag der Seite enthalten. + + ```astro title="src/pages/tags/[tag].astro" ins={4} + --- + const { tag } = Astro.params; + const { posts } = Astro.props; + const filteredPosts = posts.filter((post: any) => post.frontmatter.tags?.includes(tag)); + --- + ``` + +3. Jetzt kannst du deine HTML-Vorlage aktualisieren, um eine Liste aller Blog-Beiträge anzuzeigen, die das Tag der Seite enthalten. Füge den folgenden Code zu `[tag].astro` hinzu: + + ```astro title="src/pages/tags/[tag].astro" ins={3-5} + +

    Posts tagged with {tag}

    + +
    + ``` + +4. Du kannst das sogar umgestalten, um stattdessen deine ``-Komponente zu verwenden! + (Vergiss nicht, diese Komponente oben in `[tag].astro` zu importieren.) + + ```astro title="src/pages/tags/[tag].astro" del={4} ins={5} + +

    Posts tagged with {tag}

    + +
    + ``` + +5. Schau dir die Vorschau deiner einzelnen Tag-Seiten in deinem Browser an. Du solltest jetzt eine Liste aller deiner Blog-Beiträge sehen, die dieses bestimmte Tag enthalten. +
    + + + +### Analysiere das Muster + +Gib für jeden der folgenden Punkte an, ob der Code **innerhalb** der Funktion `getStaticPaths()` oder **außerhalb** dieser Funktion geschrieben ist. + +1. Der Aufruf `import.meta.glob()`, um Infos über alle deine `.md`-Dateien zu bekommen, die an jede Seitenroute weitergegeben werden sollen. + + + + + + +2. Die Liste der Routen, die von `getStaticPaths()` generiert (zurückgegeben) werden sollen. + + + + + + +3. Die empfangenen Werte von `props` und `params`, die in der HTML-Vorlage verwendet werden sollen. + + + + + + + +:::note[Kerngedanke] +Wenn du Infos zum Erstellen der Seitenrouten brauchst, schreib sie **innerhalb** von `getStaticPaths()`. + +Um Infos in der HTML-Vorlage einer Seitenroute zu bekommen, schreib sie **außerhalb** von `getStaticPaths()`. +::: + + +## Fortgeschrittenes JavaScript: Seiten aus vorhandenen Tags generieren + +Deine Tag-Seiten sind jetzt statisch in `[tag].astro` definiert. +Wenn du einem Blogbeitrag ein neues Tag hinzufügst, musst du auch diese Seite erneut aufrufen und deine Seitenrouten aktualisieren. + +Das folgende Beispiel zeigt, wie du deinen Code auf dieser Seite durch Code ersetzen kannst, der automatisch nach jedem auf deinen Blog-Seiten verwendeten Tag sucht und Seiten dafür generiert. + +:::note +Auch wenn es schwierig aussieht, kannst du versuchen, die Schritte zu befolgen, um diese Funktion selbst zu erstellen! +Wenn du dich jetzt nicht mit dem erforderlichen JavaScript befassen möchtest, kannst du direkt zur [fertigen Version des Codes](#endgültiges-codebeispiel) springen und ihn direkt in deinem Projekt verwenden, indem du den vorhandenen Inhalt ersetzt. +::: + + + +1. Überprüfe, ob alle deine Blog-Beiträge Tags enthalten + + Schau dir alle deine bestehenden Markdown-Seiten noch einmal an und stell sicher, dass jeder Beitrag ein `tags`-Array in seinem Frontmatter enthält. + Auch wenn du nur einen Tag hast, sollte dieser als Array geschrieben werden, z. B. `tags: ["blogging"]`. + +2. Erstelle ein Array aller deiner vorhandenen Tags mit der integrierten TypeScript-Unterstützung von Astro. + + Füge den folgenden Code hinzu, um eine Liste aller in deinen Blog-Beiträgen verwendeten Tags zu erhalten. + + ```astro title="src/pages/tags/[tag].astro" ins={7} + --- + import BaseLayout from '../../layouts/BaseLayout.astro'; + + export async function getStaticPaths() { + const allPosts = Object.values(import.meta.glob('../posts/*.md', { eager: true })); + + const uniqueTags = [...new Set(allPosts.map((post: any) => post.frontmatter.tags).flat())]; + } + ``` + +
    + Erzähl mir genauer, was diese Codezeile macht! + + Es ist okay, wenn du das selbst noch nicht geschrieben hättest! + + Sie geht jeden Markdown-Beitrag einzeln durch und kombiniert jedes Array von Tags zu einem einzigen größeren Array. + Dann erstellt sie aus allen gefundenen einzelnen Tags ein neues `Set` (um doppelte Werte zu ignorieren). + Schließlich wandelt sie dieses Set in ein Array (ohne Duplikate), das du verwenden kannst, um eine Liste von Tags auf deiner Seite anzuzeigen. +
    + + Du hast jetzt ein Array `uniqueTags` mit den Elementen `"astro"`, `"successes"`, `"community"`, `"blogging"`, `"setbacks"`, `"learning in public"` + +3. Ersetze den `return`-Wert der Funktion `getStaticPaths` + + ```js title="src/pages/tags/[tag].astro" del={1-8} ins={10-16} + return [ + {params: {tag: "astro"}, props: {posts: allPosts}}, + {params: {tag: "successes"}, props: {posts: allPosts}}, + {params: {tag: "community"}, props: {posts: allPosts}}, + {params: {tag: "blogging"}, props: {posts: allPosts}}, + {params: {tag: "setbacks"}, props: {posts: allPosts}}, + {params: {tag: "learning in public"}, props: {posts: allPosts}} + ] + + return uniqueTags.map((tag) => { + const filteredPosts = allPosts.filter((post: any) => post.frontmatter.tags.includes(tag)); + return { + params: { tag }, + props: { posts: filteredPosts }, + }; + }); + ``` + +4. Eine `getStaticPaths`-Funktion sollte immer eine Liste von Objekten zurückgeben, die `params` (wie jede Seitenroute heißen soll) und optional `props` (Daten, die du an diese Seiten übergeben willst) enthalten. + Vorher hast du jeden Tag-Namen definiert, von dem du wusstest, dass er in deinem Blog verwendet wird, und die ganze Liste der Beiträge als props an jede Seite übergeben. + + Jetzt erstellst du diese Liste von Objekten automatisch, indem du dein Array `uniqueTags` benutzt, um jeden Parameter zu definieren. + + Und jetzt wird die Liste aller Blog-Beiträge gefiltert, **bevor** sie als Props an jede Seite gesendet wird. + Vergiss nicht, die vorherige Codezeile zu entfernen, die die Beiträge filtert, und aktualisiere deine HTML-Vorlage, damit sie `posts` anstelle von `filteredPosts` verwendet. + + ```astro title="src/pages/tags/[tag].astro" del={3,7} ins={8} + const { tag } = Astro.params; + const { posts } = Astro.props; + const filteredPosts = posts.filter((post) => post.frontmatter.tags?.includes(tag)); + --- + +
      + {filteredPosts.map((post: any) => )} + {posts.map((post: any) => )} +
    + ``` + +
    + +### Endgültiges Codebeispiel + +Um deine Arbeit zu überprüfen oder wenn du einfach nur einen vollständigen, korrekten Code zum Kopieren in `[tag].astro` haben möchtest, sollte deine Astro-Komponente wie folgt aussehen: + +```astro title="src/pages/tags/[tag].astro" +--- +import BaseLayout from '../../layouts/BaseLayout.astro'; +import BlogPost from '../../components/BlogPost.astro'; + +export async function getStaticPaths() { + const allPosts = Object.values(import.meta.glob('../posts/*.md', { eager: true })); + + const uniqueTags = [...new Set(allPosts.map((post: any) => post.frontmatter.tags).flat())]; + + return uniqueTags.map((tag) => { + const filteredPosts = allPosts.filter((post: any) => post.frontmatter.tags.includes(tag)); + return { + params: { tag }, + props: { posts: filteredPosts }, + }; + }); +} + +const { tag } = Astro.params; +const { posts } = Astro.props; +--- + +

    Posts tagged with {tag}

    +
      + {posts.map((post: any) => )} +
    +
    +``` + +Jetzt solltest du in der Lage sein, alle deine Tag-Seiten in der Browser-Vorschau aufzurufen. + +Navigiere zu `http://localhost:4321/tags/community` und du solltest eine Liste aller deiner Blog-Beiträge mit dem Tag `community` sehen. +Ebenso sollte `http://localhost:4321/tags/learning%20in%20public` eine Liste der Blog-Beiträge mit dem Tag `learning in public` anzeigen. + +Im nächsten Abschnitt erstellst du Navigationslinks zu diesen Seiten. + + + +### Teste dein Wissen + +Wähle den Begriff aus, der der Beschreibung entspricht. + +1. Eine Funktion, die ein Array von Seitenrouten zurückgibt. + + + + + + + + +2. Der Prozess der Erstellung mehrerer Seitenrouten aus einer Datei in Astro. + + + + + + + + +3. Ein Wert, der den Namen einer dynamisch generierten Seitenroute festlegt. + + + + + + + + + + + + +## Checklist + + +- [ ] Ich kann Seiten dynamisch generieren. +- [ ] Ich kann `props` an jede Seitenroute übergeben. + + + +### Ressourcen + +- [Dynamisches Seiten-Routing in Astro](/de/guides/routing/#dynamische-routen) + +- [`getStaticPaths()` API-Dokumentation](/de/reference/routing-reference/#getstaticpaths) diff --git a/src/content/docs/de/tutorial/5-astro-api/3.mdx b/src/content/docs/de/tutorial/5-astro-api/3.mdx new file mode 100644 index 0000000000000..614b256971bb4 --- /dev/null +++ b/src/content/docs/de/tutorial/5-astro-api/3.mdx @@ -0,0 +1,442 @@ +--- +type: tutorial +title: Erstelle eine Tag-Indexseite +description: |- + Tutorial: Erstelle deinen ersten Astro-Blog — + Nutze alles, was du bisher gelernt hast, um eine Tag-Indexseite zu erstellen +i18nReady: true +--- + +import Box from '~/components/tutorial/Box.astro'; +import Checklist from '~/components/Checklist.astro'; +import MultipleChoice from '~/components/tutorial/MultipleChoice.astro'; +import Option from '~/components/tutorial/Option.astro'; +import PreCheck from '~/components/tutorial/PreCheck.astro'; +import { Steps } from '@astrojs/starlight/components'; + +Jetzt, wo du für jedes Tag eine eigene Seite hast, kannst du Links zu diesen Seiten erstellen. + + + - Füge eine neue Seite mit dem Routing-Muster `/pages/folder/index.astro` hinzu. + - Zeige eine Liste aller deiner eindeutigen Tags an und verlinke sie mit den jeweiligen Tag-Seiten. + - Aktualisiere deine Website mit Navigationslinks zu dieser neuen Tags-Seite. + + +## Verwende das Routing-Muster `/pages/folder/index.astro` + +Um eine Tag-Index-Seite zu deiner Website hinzuzufügen, kannst du eine neue Datei unter `src/pages/tags.astro` erstellen. + +Da du aber schon das Verzeichnis `/tags/` hast, kannst du ein anderes Routing-Muster in Astro nutzen und alle deine Dateien, die mit Tags zu tun haben, zusammenhalten. + + + +## Probier es selbst aus – Erstelle eine Tag-Indexseite + + +1. Erstelle eine neue Datei `index.astro` im Verzeichnis `src/pages/tags/`. + +2. Gehe zu `http://localhost:4321/tags` und überprüfe, ob deine Website jetzt eine Seite unter dieser URL enthält. + Sie ist leer, aber sie ist vorhanden. + +3. Erstelle eine minimale Seite unter `src/pages/tags/index.astro`, die dein Layout verwendet. + Das hast du schon einmal gemacht! + +
    + Erweitere, um die Schritte anzuzeigen + + 1. Erstelle eine neue Seitenkomponente in `src/pages/tags/`. + +
    + Zeige den Dateinamen an + ``` + index.astro + ``` +
    + + 2. Importiere und verwende dein ``. + +
    + Code anzeigen + ```astro title=" src/pages/tags/index.astro" + --- + import BaseLayout from '../../layouts/BaseLayout.astro'; + --- + + ``` +
    + + 3. Leg einen Seitentitel fest und übergib ihn als Komponentenattribut an dein Layout. + +
    + Code anzeigen + ```astro title="src/pages/tags/index.astro" ins={3} "pageTitle" + --- + import BaseLayout from '../../layouts/BaseLayout.astro'; + const pageTitle = "Tag-Index"; + --- + + ``` +
    +
    +
    + +4. Schau dir die Vorschau in deinem Browser nochmal an. + Du solltest jetzt eine formatierte Seite haben, die bereit ist, mit Inhalten gefüllt zu werden! +
    +
    + +## Erstelle ein Array mit Tags + +Du hast zuvor Elemente aus einem Array mit `map()` in einer Liste angezeigt. Wie würde es aussehen, wenn du ein Array mit all deinen Tags definierst und diese dann in einer Liste auf dieser Seite anzeigst? + +
    + Code anzeigen + + ```astro title="src/pages/tags/index.astro" + --- + import BaseLayout from '../../layouts/BaseLayout.astro'; + const tags = ['astro', 'blogging', 'learning in public', 'successes', 'setbacks', 'community'] + const pageTitle = "Tag-Index"; + --- + +
      + {tags.map((tag) =>
    • {tag}
    • )} +
    +
    + ``` +
    + +Das geht schon, aber dann musst du jedes Mal, wenn du in einem neuen Blogbeitrag ein neues Tag verwendest, zu dieser Datei zurückkehren und dein Array aktualisieren. + +Zum Glück kennst du schon eine Möglichkeit, die Daten aus all deinen Markdown-Dateien in einer einzigen Codezeile abzurufen und dann eine Liste aller deiner Tags zurückzugeben. + + +1. Füge die Codezeile in das Frontmatter-Skript der Datei `src/pages/tags/index.astro` ein, welche deiner Seite Zugriff auf die Daten aller `.md`-Blogpost-Dateien gibt. + +
    + Code anzeigen + ```astro title = "src/pages/tags/index.astro" ins={3} + --- + import BaseLayout from '../../layouts/BaseLayout.astro'; + const allPosts = Object.values(import.meta.glob('../posts/*.md', { eager: true })); + const pageTitle = "Tag-Index"; + --- + ``` +
    + +2. Füge als Nächstes die folgende JavaScript-Zeile zu deiner Seitenkomponente hinzu. Das ist derselbe Code, der auf der integrierten TypeScript-Unterstützung von Astro basiert, den du in `src/pages/tags/[tag].astro` benutzt hast, um eine Liste eindeutiger Tags zurückzugeben. + + ```astro title = "src/pages/tags/index.astro" ins={4} + --- + import BaseLayout from '../../layouts/BaseLayout.astro'; + const allPosts = Object.values(import.meta.glob('../posts/*.md', { eager: true })); + const tags = [...new Set(allPosts.map((post: any) => post.frontmatter.tags).flat())]; + const pageTitle = "Tag-Index"; + --- + + ``` +
    + +## Erstelle deine Liste mit Tags + +Anstatt diesmal Elemente in einer ungeordneten Liste zu erstellen, erstelle für jedes Element ein `

    ` innerhalb eines `

    `. +Das Muster sollte dir bekannt vorkommen! + + +1. Füge den folgenden Code zu deiner Komponentenvorlage hinzu: + + ```astro title="src/pages/tags/index.astro" ins={2} + +
    {tags.map((tag) =>

    {tag}

    )}
    +
    + ``` + Überprüfe in der Vorschau deines Browsers, ob deine Tags aufgelistet sind. Wenn bei Blogbeiträgen Tags fehlen oder diese falsch formatiert sind, zeigt dir die integrierte TypeScript-Unterstützung von Astro Fehler an, damit du deinen Code überprüfen und korrigieren kannst. + +2. Damit jeder Tag mit seiner eigenen Seite verlinkt ist, füge den folgenden ``-Link zu jedem Tag-Namen hinzu: + + ```astro title="src/pages/tags/index.astro" '/tags/${tag}' + +
    + {tags.map((tag) => ( +

    {tag}

    + ))} +
    + + ``` +
    + +## Füge Stile zu deiner Tag-Liste hinzu + + +1. Füge die folgenden CSS-Klassen hinzu, um sowohl dein `
    ` als auch jedes `

    ` zu stylen, das generiert wird. + Hinweis: Astro verwendet HTML-Syntax zum Hinzufügen von Klassennamen! + + ```astro title="src/pages/tags/index.astro" 'class="tags"' 'class="tag"' + +

    + {tags.map((tag) => ( +

    {tag}

    + ))} +
    + + ``` + +2. Leg diese neuen CSS-Klassen fest, indem du den folgenden ` + ``` + +3. Schau dir die Vorschau in deinem Browser unter `http://localhost:4321/tags` an, um zu überprüfen, ob du ein paar neue Stile hast und ob jeder der Tags auf der Seite einen funktionierenden Link zu seiner eigenen individuellen Tag-Seite hat. + + +### Code überprüfen + +So sollte deine neue Seite aussehen: + +```astro title="src/pages/tags/index.astro" +--- +import BaseLayout from '../../layouts/BaseLayout.astro'; +const allPosts = Object.values(import.meta.glob('../posts/*.md', { eager: true })); +const tags = [...new Set(allPosts.map((post: any) => post.frontmatter.tags).flat())]; +const pageTitle = "Tag-Index"; +--- + +
    + {tags.map((tag) => ( +

    {tag}

    + ))} +
    +
    + +``` + +## Füge diese Seite zu deiner Navigation hinzu + +Im Moment kannst du zu `http://localhost:4321/tags` navigieren und diese Seite sehen. +Von dieser Seite aus kannst du auf Links zu deinen einzelnen Tag-Seiten klicken. + +Aber du musst diese Seiten noch von anderen Seiten deiner Website aus auffindbar machen. + + +1. Füge in deiner Komponente `Navigation.astro` einen Link zu dieser neuen Tag-Indexseite ein. + +
    + Code anzeigen + ```astro title="src/components/Navigation.astro" ins={4} + Startseite + Über uns + Blog + Tags + ``` +
    +
    + + + +## Challenge: Füge Tags in dein Blogpost-Layout ein + +Du hast jetzt den ganzen Code geschrieben, den du brauchst, um auch eine Liste von Tags in jedem Blogpost anzuzeigen und sie mit ihren Tag-Seiten zu verlinken. Du hast bereits Arbeit geleistet, die du wiederverwenden kannst! + +Mach die folgenden Schritte und überprüf deine Arbeit, indem du sie mit dem [endgültigen Code-Beispiel](#code-überprüfung-markdownpostlayout) vergleichst. + + +1. Kopier `
    ...
    ` und `` aus `src/pages/tags/index.astro` und verwende sie in `MarkdownPostLayout.astro`: + + ```astro title="src/layouts/MarkdownPostLayout.astro" ins={11-15, 19-37} + --- + import BaseLayout from './BaseLayout.astro'; + const { frontmatter } = Astro.props; + --- + +

    {frontmatter.pubDate.toString().slice(0,10)}

    +

    {frontmatter.description}

    +

    Geschrieben von: {frontmatter.author}

    + {frontmatter.image.alt} + +
    + {tags.map((tag: string) => ( +

    {tag}

    + ))} +
    + + +
    + + ``` +
    + +Bevor dieser Code funktioniert, musst du **eine kleine Änderung** an dem Code vornehmen, den du in `MarkdownPostLayout.astro` eingefügt hast. Kannst du herausfinden, um welche Änderung es sich handelt? + +
    +Gib mir einen Hinweis + +Wie sind die anderen Props (z. B. Titel, Autor usw.) in deiner Layoutvorlage geschrieben? Wie erhält dein Layout Props aus einem einzelnen Blogbeitrag? +
    + +
    +Gib mir noch einen Hinweis! + +Um Props (übermittelte Werte) aus einem `.md`-Blogbeitrag in deinem Layout zu verwenden, z. B. Tags, musst du dem Wert ein bestimmtes Wort voranstellen. + +
    +Code anzeigen + +```astro title="src/layouts/MarkdownPostLayout.astro" "frontmatter" +
    + {frontmatter.tags.map((tag: string) => ( +

    {tag}

    + ))} +
    +``` +
    +
    +
    + +### Code-Überprüfung: MarkdownPostLayout + +Um deine Arbeit zu überprüfen oder wenn du einfach nur einen vollständigen, korrekten Code zum Kopieren in `MarkdownPostLayout.astro` haben möchtest, sollte deine Astro-Komponente wie folgt aussehen: + +```astro title="src/layouts/MarkdownPostLayout.astro" +--- +import BaseLayout from './BaseLayout.astro'; +const { frontmatter } = Astro.props; +--- + +

    {frontmatter.description}

    +

    {frontmatter.pubDate.toString().slice(0,10)}

    + +

    Geschrieben von: {frontmatter.author}

    + + {frontmatter.image.alt} + +
    + {frontmatter.tags.map((tag: string) => ( +

    {tag}

    + ))} +
    + + +
    + +``` + + + +### Test dein Wissen + +Ordne jeden Dateipfad einem zweiten Dateipfad zu, der eine Seite mit derselben Route erstellt. + +1. `src/pages/categories.astro` + + + + + + + + +2. `src/pages/posts.astro` + + + + + + + + +3. `src/pages/products/shoes/index.astro` + + + + + + + + + + + + +## Checkliste + + +- [ ] Ich kann die Routing-Funktion `/pages/folder/index.astro` von Astro nutzen. + + + +### Ressourcen + +- [Statisches Routing in Astro](/de/guides/routing/#statische-routen) diff --git a/src/content/docs/de/tutorial/5-astro-api/4.mdx b/src/content/docs/de/tutorial/5-astro-api/4.mdx new file mode 100644 index 0000000000000..f310fde9c3beb --- /dev/null +++ b/src/content/docs/de/tutorial/5-astro-api/4.mdx @@ -0,0 +1,125 @@ +--- +type: tutorial +title: RSS-Feed hinzufügen +description: >- + Tutorial: Erstelle deinen ersten Astro-Blog — + Installiere das offizielle Astro-Paket, um einen Feed zu erstellen, den deine Leser abonnieren können +i18nReady: true +--- + +import Box from '~/components/tutorial/Box.astro'; +import Checklist from '~/components/Checklist.astro'; +import PreCheck from '~/components/tutorial/PreCheck.astro'; +import PackageManagerTabs from '~/components/tabs/PackageManagerTabs.astro'; +import { Steps } from '@astrojs/starlight/components'; + + + - Installiere ein Astro-Paket, um einen RSS-Feed für deine Website zu erstellen + - Erstelle einen Feed, den man abonnieren und mit RSS-Feed-Readern lesen kann + + +## Astros RSS-Paket installieren + +Astro hat ein spezielles Paket, mit dem du schnell einen RSS-Feed zu deiner Website hinzufügen kannst. + +Dieses offizielle Paket erstellt ein Nicht-HTML-Dokument mit Infos zu all deinen Blog-Beiträgen, das von **Feed-Readern** wie Feedly, The Old Reader und anderen gelesen werden kann. +Dieses Dokument wird jedes Mal aktualisiert, wenn deine Website neu erstellt wird. + +Einzelpersonen können deinen Feed in einem Feed-Reader abonnieren und erhalten eine Benachrichtigung, wenn du einen neuen Blog-Beitrag auf deiner Website veröffentlichst, was es zu einer beliebten Blog-Funktion macht. + + +1. Beende in deinem Terminal den Astro-Entwicklungsserver (Strg + C/Control + C) und führe den folgenden Befehl aus, um das RSS-Paket von Astro zu installieren. + + + + ```shell + npm install @astrojs/rss + ``` + + + ```shell + pnpm add @astrojs/rss + ``` + + + ```shell + yarn add @astrojs/rss + ``` + + + +2. Starte den Dev-Server neu, um wieder an deinem Astro-Projekt zu arbeiten. + + + + ```shell + npm run dev + ``` + + + ```shell + pnpm run dev + ``` + + + ```shell + yarn run dev + ``` + + + + +## Erstelle ein `.xml`-Feed-Dokument + + +1. Erstelle eine neue Datei namens `rss.xml.js` in `src/pages/`. + +2. Kopier den folgenden Code in dieses neue Dokument. + Passe die Eigenschaften `title` und `description` an und gib bei Bedarf in `customData` eine andere Sprache an: + + ```js title="src/pages/rss.xml.js" + import rss, { pagesGlobToRssItems } from '@astrojs/rss'; + + export async function GET(context) { + return rss({ + title: 'Astro-Lernender | Blog', + description: 'Meine Reise beim Lernen von Astro', + site: context.site, + items: await pagesGlobToRssItems(import.meta.glob('./**/*.md')), + customData: `de-de`, + }); + } + ``` + +3. Füge die Eigenschaft `site` zur Astro-Konfiguration mit der einzigartigen Netlify-URL deiner Website hinzu. + + ```js title="astro.config.mjs" ins={4} + import { defineConfig } from "astro/config"; + + export default defineConfig({ + site: "https://example.com" + }); + ``` + +4. Gehe auf `http://localhost:4321/rss.xml` und schau nach, ob du (unformatierten) Text auf der Seite mit einem `item` für jede deiner `.md`-Dateien sehen kannst. + Jedes Element sollte Blog-Post-Infos wie `title`, `url` und `description` enthalten. + + :::tip[Zeige deinen RSS-Feed in einem Reader an] + Lade einen Feed-Reader herunter oder melde dich bei einem Online-Feed-Reader-Dienst an und abonniere deine Website, indem du deine eigene Netlify-URL hinzufügst. Du kannst diesen Link auch mit anderen teilen, damit sie deine Beiträge abonnieren und benachrichtigt werden können, wenn ein neuer Beitrag veröffentlicht wird. + ::: + + + + + +## Checklist + + +- [ ] Ich kann ein Astro-Paket über die Befehlszeile installieren. +- [ ] Ich kann einen RSS-Feed für meine Website erstellen. + + + +### Ressourcen + +- [RSS-Elementerstellung in Astro](/de/recipes/rss/#verwendung-von-glob-imports) diff --git a/src/content/docs/de/tutorial/5-astro-api/index.mdx b/src/content/docs/de/tutorial/5-astro-api/index.mdx new file mode 100644 index 0000000000000..fb03bcafb6265 --- /dev/null +++ b/src/content/docs/de/tutorial/5-astro-api/index.mdx @@ -0,0 +1,37 @@ +--- +type: tutorial +unitTitle: Verbessere deinen Blog +title: 'Überprüfung: Einheit 5 – Astro API' +description: >- + Tutorial: Erstelle deinen ersten Astro-Blog – + Abrufen und Verwenden von Daten aus Projektdateien, um Seiten-Inhalte und Routen +i18nReady: true +head: + - tag: title + content: 'Tutorial zum Erstellen eines Blogs: Einheit 5 – Astro API | Docs' +--- + +import Box from '~/components/tutorial/Box.astro'; +import Checklist from '~/components/Checklist.astro'; +import MultipleChoice from '~/components/tutorial/MultipleChoice.astro'; +import Option from '~/components/tutorial/Option.astro'; + +Jetzt, wo du ein paar Blog-Beiträge hast, ist es Zeit, die API von Astro zu nutzen, um mit deinen Dateien zu arbeiten! + +## Ausblick + +In dieser Einheit wirst du deinen Blog mit einer Indexseite, Tag-Seiten und einem RSS-Feed aufpeppen. + +Dabei lernst du, wie du Folgendes verwendest: +- `import.meta.glob()`, um auf Daten aus Dateien in deinem Projekt zuzugreifen +- `getStaticPaths()`, um mehrere Seiten (Routen) gleichzeitig zu erstellen +- Das Astro-RSS-Paket, um einen RSS-Feed zu erstellen + + + +## Checklist + + +- [ ] Ich bin bereit, meinem Astro-Projekt einige Blog-Funktionen hinzuzufügen! + +