Vergleich und Umstieg
Wann Ginko passt, und wann Nuxt Content, ein gehostetes CMS oder ein Git-Editor besser passt. Was aus jeder API von Nuxt Content und @nuxtjs/i18n in Ginko wird.
Ginko oder Nuxt Content
Beide lesen Markdown aus content/ und zeigen es in einer Nuxt-Site. Sie lösen verschiedene Aufgaben.
Nimm Ginko, wenn Menschen die Site bearbeiten, die nicht entwickeln. Derselbe Baustein kann heute aus Dateien kommen und morgen von der Plattform: Der Code der Site bleibt gleich. Inhaber bearbeiten im Studio, mit Freigabe, Zeitplan, Verlauf und einer Link-Prüfung, bevor etwas live geht. Sprachen, Adressen pro Sprache und hreflang sind dabei.
Nimm Nuxt Content, wenn nur Entwickler bearbeiten, in Git, und du etwas brauchst, das Ginko nicht hat: Nuxt Studio, oder mehr als 500 Einträge in einer Sammlung (die Grenze von Ginko). Datendateien in YAML, JSON und CSV und Abfragen mit where, order und limit hat Ginko auch.
Eine Site kann auch nur mit Datei-Bausteinen von Ginko starten. Dann braucht sie keine Plattform und kein Konto.
Ginko, ein gehostetes CMS oder ein Git-Editor
Inhaber können eine Nuxt-Site auch mit einem gehosteten CMS bearbeiten, etwa Storyblok oder Contentful, oder mit einem Editor, der in Git schreibt, etwa Decap CMS, TinaCMS oder Nuxt Studio. Jedes passt zu einem anderen Team.
| Ginko | Gehostetes CMS | Git-Editor | |
|---|---|---|---|
| Wo das Inhaltsmodell steht | im Code, ginko.config.ts | im CMS | im Code oder in der Konfiguration des Editors |
| Wo die Inhalte liegen | auf der Ginko-Plattform oder als Dateien im Repo | im CMS | als Dateien im Repo |
| Was eine Änderung auslöst | Inhalte der Plattform gehen ohne neuen Build live, nach Freigabe, wenn der Baustein sie verlangt; Datei-Inhalte brauchen einen Build | hängt vom CMS und vom Aufbau der Site ab | wird ein Commit und braucht einen neuen Build |
| Frameworks | nur Nuxt | die meisten | hängt vom Editor ab |
| Zugang | die Plattform ist auf Einladung | Registrierung | hängt vom Editor ab |
Nimm ein gehostetes CMS, wenn Redakteure Seiten selbst aus Blöcken bauen, wenn viele Sites in verschiedenen Frameworks einen Inhaltsspeicher teilen oder wenn du seine Integrationen brauchst.
Nimm einen Git-Editor, wenn jede Änderung ein Commit sein soll und die Inhalte das Repo nie verlassen sollen.
Nimm Ginko, wenn die Site Nuxt ist, ein Entwickler festlegt, was Inhaber ändern dürfen, und Inhaber das oft tun: Öffnungszeiten, Speisekarte, Veranstaltungen.
Wann Ginko nicht passt
- Die Site ist nicht mit Nuxt gebaut.
- Redakteure sollen Seiten selbst aus Abschnitten zusammenstellen. Ginko ist kein Page Builder.
- Eine Sammlung braucht mehr als 500 Einträge.
- Die Inhalte ändern sich fast nie. Normales Nuxt reicht.
- Du brauchst eine Plattform, für die du dich heute selbst registrieren kannst. Lupinum öffnet die Ginko-Plattform auf Einladung. Ohne sie kannst du trotzdem Datei-Bausteine nutzen.
Die Plattform verlassen
ginko export speichert das Schema, alle Einträge und alle Dateien einer Site in einen Ordner: export.json plus files/. Der Ordner ist ein Backup im eigenen Format von Ginko, nicht die Dateistruktur von content/. Um einen Baustein auf Dateien umzustellen, wandelst du die Einträge selbst um. Siehe Plattform und CLI.
Von Nuxt Content
| Nuxt Content | Ginko |
|---|---|
content.config.ts mit defineCollection | ginko.config.ts mit collection({ source: 'files', … }) |
ein schema mit Zod | Felder mit f.*: f.text, f.markdown, f.image, … |
queryCollection('docs').path(path).first() | useGinkoEntry('docs', slug) |
queryCollection('blog').where(…).order(…).all() | useGinkoQuery('blog', { where, order, limit }) |
queryCollectionNavigation | useGinkoNav(['docs']) |
queryCollectionItemSurroundings | useGinkoNeighbors('docs', id) |
queryCollectionSearchSections | der Suchindex unter /__ginko/search/<locale>.json |
<ContentRenderer :value="page" /> | <GinkoMarkdown :value="doc.data.body" /> |
MDC ::callout | dieselbe Schreibweise; die Komponenten ordnest du mit :components zu |
useSeoMeta pro Seite | useGinkoSeo({ … }) |
Was sich beim Umstieg ändert:
- Eine Datei pro Eintrag und Sprache.
1.einstieg.mdist die Hauptsprache,1.einstieg.en.mddie Übersetzung. Siehe Inhalte aus Dateien. - Das Frontmatter wird geprüft. Ein Schlüssel, den der Baustein nicht kennt, stoppt den Build. Die Meldung nennt Datei und Feld.
- Abfragen lesen das Bundle.
useGinkoQueryläuft auf den Daten der Seite, nicht auf einer Datenbank.wherekennteq,ne,gt,gte,lt,lte,inundcontains;orderist ein Text wie'date desc'oder ein Objekt wie{ field: 'date', dir: 'desc' }. - Links zwischen Einträgen folgen der Sprache. In Markdown zeigt
[Bausteine]($docs.bausteine)auf den Eintrag in der Sprache der Seite. Ein Link, der ins Leere zeigt, stoppt den Build.
Von @nuxtjs/i18n
Das Ginko-Modul installiert ginko-i18n und gibt ihm die Sprachen der Site. Entferne @nuxtjs/i18n: Sind beide installiert, stoppt das Setup mit einer Meldung.
| @nuxtjs/i18n | ginko-i18n |
|---|---|
i18n: { locales, defaultLocale } in nuxt.config.ts | locales in ginko.config.ts; die erste ist die Hauptsprache |
i18n: { strategy } in nuxt.config.ts | genauso, in nuxt.config.ts |
$t('key'), useI18n().t | useI18n().t |
useLocalePath() | useI18n().localePath |
useSwitchLocalePath(), useLocaleHead() | useI18n().alternates; die Head-Tags setzt ginko-i18n selbst |
defineI18nRoute({ paths }) | definePageMeta({ i18n: { paths } }) |
i18n/locales/*.json mit vue-i18n-Syntax | i18n/<code>.json mit ICU-Syntax |
detectBrowserLanguage | useLocaleSuggestion(): ein Link, den der Besucher wählen kann |
Was sich beim Umstieg ändert:
- Mehrzahl mit ICU. Aus
'kein Gericht | ein Gericht | {count} Gerichte'wird'{count, plural, =0 {kein Gericht} one {# Gericht} other {# Gerichte}}'. - Zwei Strategien.
prefix_except_default(Standard) undprefix. Domains pro Sprache undno_prefixgibt es nicht. - Die Adresse bestimmt die Sprache. Kein Cookie und kein Browser-Header wechselt eine Seite. Für Apps hinter einem Login lässt
userLocalebestimmte Pfade stattdessen dem Benutzer folgen. - Detailseiten brauchen keinen Extra-Code. Die Adressen eines Eintrags in jeder Sprache kommen aus dem Bundle. So stimmen Sprachumschalter und hreflang ohne
setI18nParams.
Die Einzelheiten stehen unter Sprachen.