Tippe, um Seiten und Abschnitte zu finden.

Zum Inhalt
Ginko

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.

GinkoGehostetes CMSGit-Editor
Wo das Inhaltsmodell stehtim Code, ginko.config.tsim CMSim Code oder in der Konfiguration des Editors
Wo die Inhalte liegenauf der Ginko-Plattform oder als Dateien im Repoim CMSals Dateien im Repo
Was eine Änderung auslöstInhalte der Plattform gehen ohne neuen Build live, nach Freigabe, wenn der Baustein sie verlangt; Datei-Inhalte brauchen einen Buildhängt vom CMS und vom Aufbau der Site abwird ein Commit und braucht einen neuen Build
Frameworksnur Nuxtdie meistenhängt vom Editor ab
Zugangdie Plattform ist auf EinladungRegistrierunghä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 ContentGinko
content.config.ts mit defineCollectionginko.config.ts mit collection({ source: 'files', … })
ein schema mit ZodFelder 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 })
queryCollectionNavigationuseGinkoNav(['docs'])
queryCollectionItemSurroundingsuseGinkoNeighbors('docs', id)
queryCollectionSearchSectionsder Suchindex unter /__ginko/search/<locale>.json
<ContentRenderer :value="page" /><GinkoMarkdown :value="doc.data.body" />
MDC ::calloutdieselbe Schreibweise; die Komponenten ordnest du mit :components zu
useSeoMeta pro SeiteuseGinkoSeo({ … })

Was sich beim Umstieg ändert:

  • Eine Datei pro Eintrag und Sprache. 1.einstieg.md ist die Hauptsprache, 1.einstieg.en.md die Ü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. useGinkoQuery läuft auf den Daten der Seite, nicht auf einer Datenbank. where kennt eq, ne, gt, gte, lt, lte, in und contains; order ist 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/i18nginko-i18n
i18n: { locales, defaultLocale } in nuxt.config.tslocales in ginko.config.ts; die erste ist die Hauptsprache
i18n: { strategy } in nuxt.config.tsgenauso, in nuxt.config.ts
$t('key'), useI18n().tuseI18n().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-Syntaxi18n/<code>.json mit ICU-Syntax
detectBrowserLanguageuseLocaleSuggestion(): 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) und prefix. Domains pro Sprache und no_prefix gibt es nicht.
  • Die Adresse bestimmt die Sprache. Kein Cookie und kein Browser-Header wechselt eine Seite. Für Apps hinter einem Login lässt userLocale bestimmte 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.