Warum GrapesJS zu Astro passt
Astro liefert standardmäßig null JavaScript aus und erlaubt es, sich für clientseitigen Code einzuwählen. pro Komponente. GrapesJS ist ein reiner browserbasierter Editor, sodass man ihn in einem Client lädt Skripte und speichere über einen Astro-API-Endpunkt. Dieser Leitfaden befestigt den Editor, Speichert Inhalte und exportiert HTML/CSS.
1. Mounte den Editor in einem Client-Skript
Erstellen src/pages/editor.astroSie . Die Läufe <script>
im Browser, also ist das Importieren von GrapesJS dort sicher.
---
// src/pages/editor.astro
---
<link href="https://unpkg.com/grapesjs/dist/css/grapes.min.css" rel="stylesheet" />
<div id="gjs"><h1>Edit me in GrapesJS</h1></div>
<script>
import grapesjs from 'grapesjs';
const editor = grapesjs.init({
container: '#gjs',
height: '100vh',
fromElement: true,
storageManager: {
type: 'remote',
stepsBeforeSave: 3,
options: { remote: { urlStore: '/api/page', urlLoad: '/api/page' } },
},
});
</script>
2. Fügen Sie einen Astro-API-Endpunkt hinzu
Erstellen src/pages/api/page.tsSie . SSR-Endpunkte exportieren HTTP-Methode
Funktionen.
import type { APIRoute } from 'astro';
import { loadPage, savePage } from '../../lib/store';
export const GET: APIRoute = async () => {
return new Response(JSON.stringify(await loadPage('home')), {
headers: { 'Content-Type': 'application/json' },
});
};
export const POST: APIRoute = async ({ request }) => {
const data = await request.json();
await savePage('home', data); // your DB / KV write
return new Response(JSON.stringify({ status: 'ok' }));
};
Aktivieren Sie einen SSR-Adapter (output: 'server' oder 'hybrid' in
astro.config.mjs), sodass die POST zur Anfrage bearbeitet wird.
3. Exportieren des finalen Aufschlags
const html = editor.getHtml();
const css = editor.getCss();
// Persist or render: `<style>${css}</style>${html}`
Häufige Fallstricke in Astro
Astros Zero-JS-Standard ist das Wichtigste, an das man sich erinnern sollte. Der Editor muss clientseitig laufen – ein einfaches Tag oder eine Framework-Insel <script> mit client:only; das Importieren von GrapesJS in Frontmatter (Serverkontext) schlägt fehl. Das Speichern erfordert eine Laufzeit: Ein vollständig statischer Build kann kein POST akzeptieren, also setze output: 'server' oder 'hybrid' nutze einen SSR-Adapter, bevor du den Storage Manager zu /api/page. Und lass die Editor-Route aus jeder Prerender-Liste heraus – du willst, dass sie auf Abruf gerendert wird, nicht beim Bau eingefroren wird.
Voraussetzungen
Du brauchst Node.js 18+ und ein Astro-4-Projekt. Um einen Spielstand zur Laufzeit zu akzeptieren, wirst du
Außerdem möchte du einen SSR-Adapter (output: 'server' oder 'hybrid').
Es existiert kein Astro-spezifisches GrapesJS-Paket – der Editor läuft im Browser über ein
Client-Skript oder eine Framework-Insel, und Astro-Endpunkte übernehmen die Persistenz.
Fügen Sie benutzerdefinierte Blöcke zum Editor hinzu
Registrieren Sie ziehbare Blöcke im Block Manager danach grapesjs.init in Ihrem Client-Skript:
editor.BlockManager.add('hero', {
label: 'Hero section',
category: 'Sections',
content: '<section class="hero"><h1>Headline</h1><p>Copy</p></section>',
});
Ziehe fertige Blockbibliotheken und Presets aus GJS.Market für ein reichhaltigeres Set.
Storage Deep-Dive: ein maßgeschneiderter Adapter
Ein benutzerdefinierter Speicheradapter überträgt das Projekt an deinen Astro-API-Endpunkt:
editor.Storage.add('astro-store', {
async load() {
const res = await fetch('/api/page');
return res.ok ? res.json() : {};
},
async store(data) {
await fetch('/api/page', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data),
});
},
});
// then: storageManager: { type: 'astro-store' }
Lass die Editor-Route aus jeder Prerender-Liste heraus, damit sie auf Abruf gerendert wird und nicht beim Bau eingefroren wird.
Aufführungstipps
Astro liefert standardmäßig null JS aus, daher ist das Gewicht des Editors opt-in – man lädt es nur auf
Der Editor routet über ein Client-Skript oder client:only eine Insel. Code-Split
Schwere Plugins. Da der Rest der Seite statisch bleibt, bleiben deine öffentlichen Seiten bestehen
Schnell, selbst mit einem schweren Editor hinter dem Admin-Weg.
Sicherheitsaspekte
Authentifizieren und autorisieren Sie den POST-Endpunkt vor dem Schreiben – eine statisch anfühlende Seite Es braucht trotzdem eine bewachte Speicherroute. Desinfiziere gespeicherte Markup-Ausgaben, falls Nicht-Administratoren das können Bearbeitung. Validiere die Nutzlastgröße, damit ein großes Projekt den Speicher nicht erschöpfen kann.
Fehlerbehebung häufiger Fehler
Ein Importfehler in Frontmatter bedeutet, dass Sie GrapesJS in der
Serverkontext – Halte ihn in einem Client <script> oder einem
client:only Insel. Der POST 404 schlägt oder scheitert meist
bedeutet, dass es keinen SSR-Adapter gibt; Wechsel zu output: 'server' oder
'hybrid'. Eine ungestylte oder leere Leinwand bedeutet die
Stylesheet wurde nicht geladen oder der Container war nicht vorhanden.
Wann man GrapesJS mit Astro verwenden sollte
GrapesJS passt, wenn eine ansonsten statische Astro-Seite einen eingebetteten visuellen Editor benötigt Hinter einem administrativen Weg – einem Seitenbauer oder Newsletter-Komponist – mit eigenem Speicher und HTML-Ausgabe. Für rein statische Inhalte, die im Markdown bearbeitet wurden, ist Astro's Inhaltssammlungen sind einfacher; für visuelle ganzseitige Komposition ist GrapesJS das stärkere, MIT-lizenzierte Wahl.
Nächste Schritte
Siehe die verwandten GrapesJS + Svelte und GrapesJS + React Guides, durchsuchen Sie die GrapesJS-Marktplatz oder starte mit dem GJS.Market-Startseite.
FAQ
Funktioniert GrapesJS auf einer Astro-Insel?
Ja – nutze eine Client-Seite <script> oder eine Framework-Insel mit
client:only also läuft GrapesJS im Browser.
Wie speichere ich GrapesJS-Inhalte in Astro?
Fügen Sie beim Export POST einen API-Endpunkt src/pages/api hinzu und
Lass den Storage Manager das Projekt-JSON darauf posten.
Brauche ich einen Adapter für den Speicherpunkt?
Ja – um POST zur Laufzeit zu handhaben, braucht man einen SSR-Adapter
(output: 'server' oder 'hybrid'); ein vollständig statischer Aufbau
Ich kann keine Schreibe annehmen.
