Erstellung einer Git-gesteuerten Website mit Nuxt 3 Content
James Reed
Infrastructure Engineer · Leapcell

Der Aufstieg des Headless Content Managements
In der sich rasant entwickelnden Landschaft der Webentwicklung wächst die Nachfrage nach flexiblen und effizienten Content-Management-Lösungen weiter. Traditionelle Content-Management-Systeme (CMS) gehen oft mit erheblichem Overhead einher, erfordern Datenbanken, komplexe Schnittstellen und umfangreiche Serverkonfigurationen. Für viele Entwickler und Projekte, insbesondere für diejenigen, die Geschwindigkeit, Einfachheit und Versionskontrolle priorisieren, ist ein leichterer und integrierter Ansatz sehr wünschenswert. Hier glänzt das Konzept des "Git-gesteuerten Contents". Durch die Nutzung der Leistungsfähigkeit von Versionskontrollsystemen wie Git und von Klartextformaten wie Markdown können Entwickler einen optimierten Workflow für die Verwaltung von Website-Inhalten erreichen. Dieser Ansatz vereinfacht nicht nur die Erstellung und Aktualisierung von Inhalten, sondern integriert sich auch nahtlos in moderne Frontend-Frameworks.
Nuxt 3, ein leistungsstarkes und intuitives Meta-Framework für Vue.js, bietet ein außergewöhnliches Toolset für den Aufbau von Hochleistungs-Webanwendungen. Unter seinen vielen Fähigkeiten sticht das Nuxt Content-Modul als Game-Changer für inhaltsreiche Websites hervor. Dieses Modul transformiert elegant Markdown-, YAML-, CSV- und JSON-Dateien in eine abfragbare Datenschicht, wodurch es unglaublich einfach wird, Inhalte ohne eine traditionelle Datenbank anzuzeigen und zu verwalten. In Kombination mit den Prinzipien des Git-gesteuerten Contents ermöglicht Nuxt 3 Content Entwicklern den Aufbau hochgradig wartbarer, versionierter und performanter Websites. Dieser Artikel untersucht die praktische Implementierung des Content-Moduls von Nuxt 3, um eine Website zu erstellen, deren Inhalt vollständig durch Markdown-Dateien in einem Git-Repository verwaltet wird, und bietet eine robuste und entwicklerfreundliche Content-Management-Lösung.
Grundlegende Konzepte verstehen
Bevor wir uns mit der Implementierung befassen, lassen Sie uns einige Schlüsselbegriffe klären, die das Rückgrat unserer Diskussion bilden.
Nuxt 3: Ein Full-Stack-Webframework, das auf Vue 3, Nitropack und Vite basiert. Es vereinfacht Server-Side Rendering (SSR), Static Site Generation (SSG) und bietet eine meinungsbasierte Struktur für den Aufbau performanter Webanwendungen.
Nuxt Content Module: Ein offizielles Nuxt-Modul, mit dem Sie Inhalte in verschiedenen Formaten (Markdown, YAML, CSV, JSON) schreiben und über eine leistungsstarke API darauf zugreifen können. Es parst diese Dateien automatisch und bietet einen Content Query Builder, der das Abrufen und Anzeigen von Inhalten erleichtert.
Markdown: Eine leichtgewichtige Auszeichnungssprache, mit der Sie formatierten Text in einem einfach zu lesenden und zu schreibenden Klartext-Editor erstellen können. Seine Einfachheit und Lesbarkeit machen es ideal für die Erstellung und Versionskontrolle von Inhalten.
Git-gesteuerter Content: Eine Content-Management-Strategie, bei der alle Website-Inhalte als Klartextdateien (z. B. Markdown) in einem Git-Repository gespeichert werden. Inhaltsänderungen werden verfolgt, versioniert und über Standard-Git-Workflows zusammen bearbeitet. Dies eliminiert die Notwendigkeit separater Datenbanken oder CMS-Schnittstellen für Inhalte.
Erstellung einer Git-gesteuerten Website mit Nuxt 3 Content
Das Grundprinzip einer Git-gesteuerten Website mit Nuxt 3 Content ist, die Markdown-Dateien im Repository Ihres Projekts als einzige Quelle der Wahrheit für die Inhalte Ihrer Website zu behandeln. Nuxt Content nimmt diese Dateien dann auf, parst sie und stellt sie Ihren Vue-Komponenten zur Verfügung.
Einrichtung Ihres Nuxt 3-Projekts
Erstellen Sie zuerst ein neues Nuxt 3-Projekt, falls Sie dies noch nicht getan haben:
npx nuxi init git-content-blog cd git-content-blog npm install
Installation des Nuxt Content-Moduls
Installieren Sie anschließend das Nuxt Content-Modul:
npm install --save-dev @nuxt/content
Fügen Sie es dann zu Ihrer nuxt.config.ts
hinzu:
// nuxt.config.ts export default defineNuxtConfig({ modules: ['@nuxt/content'] })
Strukturierung Ihrer Inhalte
Das Nuxt Content-Modul erwartet, dass Ihre Inhaltsdateien in einem bestimmten Verzeichnis liegen, typischerweise content/
. Innerhalb dieses Verzeichnisses können Sie Ihre Markdown-Dateien in Unterverzeichnissen organisieren, die ihre URLs bestimmen.
Erstellen wir einige Beispielinhalte für Blogbeiträge:
content/
├── blog/
│ ├── first-post.md
│ ├── second-post.md
│ └── third-post.md
└── about.md
content/blog/first-post.md
:
--- title: Mein erster Blogbeitrag date: 2023-10-26 author: John Doe description: Dies ist mein allererster Blogbeitrag, der die Welt von Nuxt 3 und Git-gesteuertem Content erkundet. --- ## Willkommen in meinem Blog! Dieser Beitrag markiert den Beginn einer aufregenden Reise in die Webentwicklung. Ich freue mich, meine Gedanken und Erfahrungen mit Ihnen zu teilen. ### Was ist Markdown? Markdown ist eine leichtgewichtige Auszeichnungssprache, die es Ihnen ermöglicht, in einem einfach zu lesenden und einfach zu schreibenden Klartextformat zu schreiben und es dann in strukturell gültiges HTML zu konvertieren.
content/blog/second-post.md
:
--- title: Verständnis von Nuxt Content-Abfragen date: 2023-11-01 author: Jane Smith description: Eine detaillierte Untersuchung, wie Inhalte effektiv mit dem Nuxt Content-Modul abgefragt werden. --- ## Leistungsstarke Content-Abfragen Nuxt Content bietet eine flexible API zum Abrufen und Filtern Ihrer Inhalte. Sie können Abfragen basierend auf Dateipfad, Frontmatter-Eigenschaften und mehr durchführen. ### Beispielabfrage ```vue <script setup> const { data: posts } = await useAsyncData('blog-posts', () => queryContent('blog') .limit(5) .sort({ date: -1 }) .find() ); </script>
**`content/about.md`:**
```markdown
---
title: Über uns
layout: page
---
## Unsere Geschichte
Wir sind ein leidenschaftliches Team, das sich dem Aufbau großartiger Weberlebnisse mit modernen Technologien wie Nuxt 3 verschrieben hat.
### Unsere Mission
Entwicklern zugängliche und effiziente Werkzeuge für die Content-Verwaltung bereitzustellen.
Abrufen und Anzeigen von Inhalten
Nuxt Content macht das Abrufen von Inhalten bemerkenswert einfach mit queryContent()
und useAsyncData()
(oder useFetch()
für das Abrufen auf Client-Seite).
pages/index.vue
(Auflistung aller Blogbeiträge):
<template> <div class="container mx-auto px-4 py-8"> <h1 class="text-4xl font-bold mb-8">Mein Git-gesteuerter Blog</h1> <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8"> <NuxtLink v-for="post in posts" :key="post._path" :to="post._path" class="block p-6 border rounded-lg shadow-md hover:shadow-xl transition-shadow duration-300"> <h2 class="text-2xl font-bold mb-2">{{ post.title }}</h2> <p class="text-gray-600 text-sm mb-4">Von {{ post.author }} am {{ new Date(post.date).toLocaleDateString() }}</p> <p class="text-gray-700">{{ post.description }}</p> </NuxtLink> </div> </div> </template> <script setup> const { data: posts } = await useAsyncData('blog-posts', () => queryContent('blog') .sort({ date: -1 }) // Nach Datum absteigend sortieren .find() ); </script> <style> /* Grundlegendes Tailwind CSS-Setup zur Demonstration */ body { font-family: sans-serif; } </style>
pages/blog/[slug].vue
(Anzeige eines einzelnen Blogbeitrags):
Um einzelne Blogbeiträge anzuzeigen, verwenden wir dynamisches Routing. Der [slug]
im Dateinamen sagt Nuxt, dass für jede Datei unter content/blog/
eine Route erstellt werden soll.
<template> <div class="container mx-auto px-4 py-8 max-w-2xl"> <ContentDoc v-if="post" class="prose lg:prose-xl mx-auto"> <h1>{{ post.title }}</h1> <p class="text-gray-600 text-sm">Von {{ post.author }} am {{ new Date(post.date).toLocaleDateString() }}</p> <ContentRenderer :value="post" /> </ContentDoc> <div v-else> <p>Beitrag nicht gefunden.</p> </div> </div> </template> <script setup> const route = useRoute(); const { data: post } = await useAsyncData(`blog-post-${route.params.slug}`, () => queryContent('blog', route.params.slug).findOne() ); </script> <style> /* Fügen Sie einige grundlegende Stile für den Prose-Inhalt hinzu */ .prose h1 { font-size: 2.5rem; margin-bottom: 1rem; } .prose h2 { font-size: 2rem; margin-top: 2rem; margin-bottom: 1rem; } .prose p { margin-bottom: 1rem; line-height: 1.6; } /* Sie würden hier typischerweise ein Typografie-Plugin wie @tailwindcss/typography verwenden */ </style>
pages/about.vue
(Anzeige der About-Seite):
<template> <div class="container mx-auto px-4 py-8 max-w-2xl"> <ContentDoc v-if="page" class="prose lg:prose-xl mx-auto"> <h1>{{ page.title }}</h1> <ContentRenderer :value="page" /> </ContentDoc> <div v-else> <p>About-Seite nicht gefunden.</p> </div> </div> </template> <script setup> const { data: page } = await useAsyncData('about-page', () => queryContent('about').findOne() ); </script>
Git-Integration und Workflow
Der "Git-getriebene" Aspekt ergibt sich natürlich. Ihr content/
-Verzeichnis ist einfach Teil Ihres Git-Repositorys.
- Inhaltserstellung/-bearbeitung: Texter (oder Entwickler) bearbeiten Markdown-Dateien direkt im
content/
-Verzeichnis. - Versionskontrolle: Alle Änderungen werden in Git committet, was eine vollständige Historie, Rollback-Fähigkeiten und kollaborative Workflows bietet.
- Bereitstellung: Wenn Ihr Hauptzweig aktualisiert wird (z. B. durch Zusammenführen einer Pull-Anforderung), löst Ihre CI/CD-Pipeline einen Neuaufbau und eine erneute Bereitstellung Ihrer Nuxt-Anwendung aus. Während des Build-Prozesses parst Nuxt Content die neuesten Markdown-Dateien.
Dieser Workflow bedeutet, dass die Content-Verwaltung vollständig in Ihren Entwicklungsworkflow integriert ist und keine separate CMS-Oberfläche erforderlich ist.
Fortgeschrittene Nuxt Content-Funktionen
ContentRenderer
undContentSlot
: Diese Komponenten ermöglichen es Ihnen, den Markdown-Inhalt direkt in Ihren Vue-Komponenten zu rendern.ContentRenderer
rendert automatisch das geparste Markdown in HTML, währendContentSlot
das Einfügen von Vue-Komponenten direkt in Ihr Markdown über benutzerdefinierte Syntax ermöglicht.- Abfragefilterung und -sortierung: Über
limit()
undsort()
hinaus können Sie Inhalte mit verschiedenen Bedingungen filtern, z. B.queryContent().where({ layout: 'post' }).find()
. - Static Site Generation (SSG): Für maximale Leistung und geringere Hosting-Kosten erstellen Sie Ihre Nuxt-Anwendung als statische Website. Nuxt Content generiert alle Ihre Seiten während des Build-Prozesses und rendert Ihre Markdown-Inhalte vorab in HTML-Dateien.
// nuxt.config.ts export default defineNuxtConfig({ ssr: true, // SSR für Vorab-Rendering aktivieren // Alle von Nuxt Content gefundenen Routen generieren nitro: { prerender: { routes: ['/'] // Stellen Sie sicher, dass die Index-Route vorab gerendert wird } } })
Um dynamische Routen aus dem Content-Modul zu generieren, verwenden Sie _src/routes.ts
oder _src/hooks.ts
mit dem nitro
-Modul.
Für Nuxt 3 generiert das Content-Modul automatisch Routen für Content-Dateien während SSG-Builds. Sie benötigen normalerweise keine expliziten prerender.routes
für von Content generierte Pfade, es sei denn, Sie haben spezifische Randfälle.
Die Einfachheit von Git-gestütztem Content
Das Nuxt 3 Content-Modul bietet eine unglaublich leistungsstarke und dennoch einfache Möglichkeit, Website-Inhalte zu verwalten, indem es Markdown-Dateien nutzt, die in einem Git-Repository gespeichert sind. Dieser Ansatz passt perfekt zu modernen Entwicklungspraktiken und fördert Versionskontrolle, Zusammenarbeit und einen optimierten Workflow. Durch das Verständnis der Kernkonzepte und das Befolgen der praktischen Implementierungsschritte können Entwickler robuste, hochperformante Websites erstellen, bei denen das Content-Management so effizient und zuverlässig ist wie das Code-Management.
Im Wesentlichen verwandelt Nuxt 3 Content Ihr Git-Repository in ein vollwertiges, entwicklerfreundliches CMS, das es Ihnen ermöglicht, sich auf den Aufbau großartiger Benutzererlebnisse zu konzentrieren, während Ihre Inhalte mühelos verwaltet und versioniert werden.