SQLite
Lokale Entwicklung mit sqlite({ url: "file:./data.db" })
EmDash integriert sich tief mit Astro, um ein vollständiges CMS-Erlebnis zu bieten. Diese Seite erklärt die wichtigsten Architekturentscheidungen und wie die Teile zusammenpassen.
┌──────────────────────────────────────────────────────────────────┐│ Deine Astro-Site ││ ││ ┌────────────────────────────────────────────────────────────┐ ││ │ EmDash-Integration │ ││ │ │ ││ │ ┌──────────────┐ ┌──────────────┐ ┌───────────────┐ │ ││ │ │ Inhalts-APIs │ │ Admin- │ │ Plugins │ │ ││ │ │ │ │ Panel │ │ │ │ ││ │ └──────────────┘ └──────────────┘ └───────────────┘ │ ││ │ │ ││ │ ┌──────────────────────────────────────────────────────┐ │ ││ │ │ Datenebene │ │ ││ │ │ Datenbank (D1/SQLite) + Speicher (R2/S3) │ │ ││ │ └──────────────────────────────────────────────────────┘ │ ││ └────────────────────────────────────────────────────────────┘ ││ ││ ┌────────────────────────────────────────────────────────────┐ ││ │ Astro-Framework │ ││ │ Live Collections · Middleware · Sessions │ ││ └────────────────────────────────────────────────────────────┘ │└──────────────────────────────────────────────────────────────────┘EmDash läuft als Astro-Integration. Es injiziert Routen für das Admin-Oberfläche und REST-APIs, stellt einen Content-Loader für dynamische Sammlungen bereit und verwaltet Datenbank-Migrationen und Speicherverbindungen.
Im Gegensatz zu traditionellen CMS, die das Schema im Code definieren, speichert EmDash Schemadefinitionen in der Datenbank selbst. Zwei Systemtabellen verfolgen Ihre Inhaltsstruktur:
_emdash_collections — Metadaten der Sammlung (Slug, Label, Features)_emdash_fields — Felddefinitionen für jede SammlungWenn Sie über die Admin-UI eine “products”-Sammlung mit Titel- und Preis-Feldern erstellen, führt EmDash folgendes aus:
_emdash_collections und _emdash_fields einALTER TABLE aus, um ec_products mit den entsprechenden Spalten zu erstellenDieses Design ermöglicht:
Jede Sammlung erhält ihre eigene SQLite-Tabelle mit einem ec_-Präfix:
-- Erstellt, wenn die Sammlung "posts" hinzugefügt wirdCREATE TABLE ec_posts ( -- Systemspalten (immer vorhanden) id TEXT PRIMARY KEY, slug TEXT UNIQUE, status TEXT DEFAULT 'draft', -- draft, published, scheduled author_id TEXT, created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')), published_at TEXT, deleted_at TEXT, -- Soft Delete version INTEGER DEFAULT 1, -- Optimistische Sperre
-- Inhalts-Spalten (aus Ihren Felddefinitionen) title TEXT NOT NULL, content JSON, -- Portable Text excerpt TEXT);Warum Tabellen pro Sammlung anstelle einer einzelnen Inhalts-Tabelle mit JSON?
EmDash nutzt Astro 6’s dynamische Sammlungen, um Inhalte zur Laufzeit bereitzustellen. Inhaltsänderungen sind sofort verfügbar, ohne statische Neubuilds.
Der emdashLoader() implementiert Astros LiveLoader-Schnittstelle:
import { defineLiveCollection } from "astro:content";import { emdashLoader } from "emdash/runtime";
export const collections = { _emdash: defineLiveCollection({ loader: emdashLoader() }),};Abfragen Sie Inhalte mit den bereitgestellten Wrapper-Funktionen:
import { getEmDashCollection, getEmDashEntry } from "emdash";
// Alle veröffentlichten Beiträge abrufenconst { entries: posts } = await getEmDashCollection("posts");
// Entwürfe abrufenconst { entries: drafts } = await getEmDashCollection("posts", { status: "draft",});
// Einen einzelnen Eintrag per Slug abrufenconst { entry: post } = await getEmDashEntry("posts", "my-post-slug");Die EmDash-Integration verwendet Astros injectRoute-API, um Admin- und API-Routen hinzuzufügen:
| Pfadmuster | Zweck |
|---|---|
/_emdash/admin/[...path] | Admin-Oberfläche SPA |
/_emdash/api/manifest | Admin-Manifest (Sammlungen, Plugins) |
/_emdash/api/content/[collection] | CRUD für Inhalts-Einträge |
/_emdash/api/media/* | Medienbibliothek-Operationen |
/_emdash/api/schema/* | Schemaverwaltung |
/_emdash/api/settings | Website-Einstellungen |
/_emdash/api/menus/* | Navigationsmenüs |
/_emdash/api/taxonomies/* | Kategorien, Tags, benutzerdefinierte Taxonomien |
Routen werden aus dem emdash-Paket injiziert – nichts wird in Ihr Projekt kopiert.
EmDash verwendet Kysely für typsichere SQL-Abfragen über alle unterstützten Datenbanken hinweg:
SQLite
Lokale Entwicklung mit sqlite({ url: "file:./data.db" })
D1
Cloudflares serverloses SQL mit d1({ binding: "DB" })
libSQL
Remote SQLite mit libsql({ url: "...", authToken: "..." })
Die Datenbankkonfiguration wird der Integration in astro.config.mjs übergeben:
import { defineConfig } from "astro/config";import emdash from "emdash/astro";import { sqlite } from "emdash/db";import { local } from "emdash/storage";
export default defineConfig({ integrations: [ emdash({ database: sqlite({ url: "file:./data.db" }), storage: local({ directory: "./uploads", baseUrl: "/_emdash/api/media/file", }), }), ],});Mediendateien werden getrennt von der Datenbank gespeichert. EmDash unterstützt:
Uploads verwenden signierte URLs für direkte Client-zu-Speicher-Uploads und umgehen so Workers-Body-Größenlimits.
Plugins erweitern EmDash über ein WordPress-inspiriertes Hook-System:
content:beforeSave, content:afterSave, content:beforeDelete, content:afterDeletemedia:beforeUpload, media:afterUploadPlugins können in zwei Modi laufen:
import { seoPlugin } from "@emdash-cms/plugin-seo";
emdash({ plugins: [seoPlugin({ maxTitleLength: 60 })],});Eine typische Inhaltsanfrage folgt diesem Pfad:
Astro empfängt die Anfrage
Ihre Seitenkomponente wird ausgeführt.
Inhalte werden abgefragt
getEmDashCollection() ruft Astros getLiveCollection() auf.
Der Loader läuft
emdashLoader fragt die passende ec_*-Tabelle über Kysely ab.
Daten werden zurückgegeben
Die Einträge werden auf Astros Eintragsformat mit id, slug und data abgebildet.
Die Seite rendert
Ihre Komponente erhält den Inhalt und erzeugt HTML.
Für Admin-Anfragen:
Die Middleware authentifiziert
Das Session-Token wird validiert.
Die API-Route verarbeitet die Anfrage
CRUD-Operationen laufen über Repositories.
Hooks werden ausgelöst
beforeCreate, afterUpdate und weitere Hooks werden ausgeführt.
Die Datenbank wird aktualisiert
Kysely führt das benötigte SQL aus.
Die Antwort wird zurückgegeben
Die Admin-SPA erhält eine JSON-Antwort.
EmDash generiert zur Build-Zeit virtuelle Module, um die Laufzeit zu konfigurieren:
| Modul | Zweck |
|---|---|
virtual:emdash/config | Datenbank- und Speicherkonfiguration |
virtual:emdash/dialect | Datenbankdialekt-Fabrik |
virtual:emdash/plugin-admins | Statische Imports für Plugin-Admin-Oberflächen |
Dieser Ansatz stellt sicher, dass Bundler den Plugin-Code korrekt auflösen und Tree-Shaking durchführen können.
Sammlungen
Erfahren Sie mehr über Inhaltssammlungen und Feldtypen.
Inhaltsmodell
Verstehen Sie das datenbank-zentrierte Inhaltsmodell.
Admin-Oberfläche
Entdecken Sie die Architektur des Admin-Oberfläches.