Vue bleibt verantwortlich für
Deine Anwendung, genau so, wie du sie heute gebaut hast.
- Anwendung UI
- Routing
- Authentifizierung
- Geschäftslogik
- Staatsverwaltung
- APIs und Datenabruf
- Abrechnung und Pläne
- Benutzer und Berechtigungen
PageKit — der selbst gehostete GrapesJS-Website-Builder, als Quellcode. Early Access sichern
Baue einen visuellen Drag-and-Drop-Seitenbauer für Vue 3 und Nuxt mit benutzerdefinierten Blöcken, Komponenten, Vorlagen, responsiver Bearbeitung und deinem eigenen Speicher- und Veröffentlichungsworkflow.
Blöcke
Deine Seite
Stile
Sehen Sie sich die Vue-Integrationsanleitung an
0.23.6
GrapesJS-Version, gegen die diese Seite geschrieben ist
100+
Plugins und Vorlagen auf GJS.Market
BSD-3-Clause
Lizenz des Editor-Kerns
$0
Kosten für den Betrieb des Editors selbst
Das ist GrapesJS selbst, kein Screenshot. Ziehe einen Block hinein, wähle ein Element aus, style es neu, wechsle die Gerätebreite. Der Editor wird durch einen 'init()'-Aufruf erstellt – in einer Vue-App, die live in 'onMounted' aufruft, und alles, was du hier siehst, verhält sich identisch.
Der Standard-Editor ohne angewandtes Thema. Das bekommst du, bevor du irgendetwas konfigurierst – der Ausgangspunkt, von dem aus jeder Builder unten angepasst wurde.
Lädt eine externe Demo in einem iframe.
Ein Produktionsseiten-Builder besteht aus weit mehr als nur ein paar Vue-Komponenten. Er ist eine Leinwand, ein Drag-and-Drop-System, ein Komponentenmodell, eine Stil-Engine, responsive Bearbeitung, Rückgängigkeitsverlauf, Asset-Handling, Speicherung und Export. Hier ist die gesamte Oberfläche und wer letztlich jedes Teil besitzt.
Ein isoliertes Dokument bearbeitet Benutzer direkt, mit eigenen Stilen und Scrolls.
Abwurfziele, Einfügungspunkte, Umordnungs- und Verschachtelungsregeln.
Typisierte Elemente mit eigenen Einstellungen, Einschränkungen und Verhalten.
Klicken zum Auswählen, Umrisse mit dem Maus, Symbolleisten pro Element und Badges.
Typografie-, Farb-, Abstands- und Layout-Steuerungen sind an die Selektoren gebunden.
Gerätebreiten und Breakpoint-Scoped-Stile auf derselben Leinwand.
Ein Seitenbaum, sodass tiefe Strukturen navigierbar bleiben.
Eine Befehlshistorie bei jeder Bearbeitung, nicht nur im Text.
Sauberes Markup und Stylesheet, das aus dem aktuellen Dokument generiert wird.
Die fertigen Abschnitte, die die Nutzer einziehen. Deine oder installiert.
Ganze Startlayouts, damit niemand auf eine leere Leinwand trifft.
Uploads, Medienbibliotheken und Bildverarbeitung.
Inline-Textformatierung über den integrierten Editor hinaus.
Mehr als eine Seite in einem einzigen Projekt.
Wo Projektdaten geschrieben und gelesen werden. Ihr API, Ihre Datenbank.
Wer welches Projekt öffnen, bearbeiten und veröffentlichen darf.
Die Seiten, Assets und Vorlagen eines Kunden von den Seiten eines Kunden zu isolieren.
Genehmigte Ausgaben in eine Live-Seite über Ihre Infrastruktur zu verwandeln.
Was jeder Kunde Anspruch hat und was er dafür bezahlt.
Die mittlere Spalte ist der Sinn von GJS.Market: Sie installiert eine echte Fähigkeit und nicht die Terminplanung. Die rechte Spalte wird niemals zum Problem eines anderen – das ist Ihr Produkt, und diese Seite spricht in jedem Abschnitt explizit darüber.
Siehe die fünfstufige IntegrationGrapesJS ist kein Ersatz für deine Anwendung und kein gehosteter Dienst. Es ist eine Bearbeitungs-Engine, die in einem Element einer Route integriert ist. Alles darüber und darunter in diesem Diagramm bleibt deins.
Alles, was das Produkt zu deinem macht. GrapesJS hat zu keinem davon eine Meinung.
Eine montierte Instanz, innerhalb einer Komponente, auf einer Route. Das ist die Schicht, die du nicht baust.
Der Redakteur übergibt dir zwei Artefakte und einen Medienstream. Was als Nächstes passiert, ist die Entscheidung deines API.
Gewöhnliche Zeilen in einem von dir entworfenen Schema. Nichts hier ist ein GrapesJS-Format, das du übernehmen musst.
Lies es von oben bis unten: Deine Vue-Anwendung authentifiziert den Benutzer und leitet ihn zu einer Editor-Seite weiter; der Editor erstellt Projektdaten; dein API schreibt sie in deine Datenbank. Der Editor kommuniziert nie mit deiner Datenbank, und deine Datenbank muss den Editor nie verstehen.
Wie der Editor in eine Vue-Komponente eingebunden wirdNein. Das ist die erste Frage, die die meisten Vue-Entwickler stellen, und die Antwort verändert, wie sich der Rest der Seite liest. Die beiden Ebenen überlappen sich nicht: Eine führt deine Anwendung aus, die andere betreibt eine Bearbeitungsfläche darin.
Deine Anwendung, genau so, wie du sie heute gebaut hast.
Die visuelle Bearbeitungsebene, in einem Element gibt man ihr.
Eine ehrliche Einschränkung: Die Leinwand rendert schlichte DOM in einem iframe, keine montierten Vue-Komponenten. Deine App ist Vue; was deine Nutzer bearbeiten, ist HTML und CSS, die deine App dann nach Belieben rendert.
Die gleiche Engine, anders konfiguriert. Jede dieser Modelle ist ein echtes Produkt, das Teams darauf ausliefern – und jede hat hier eine Seite, die tiefer geht.
SaaS
Lassen Sie Ihre Kunden Seiten innerhalb Ihres Produkts erstellen und bearbeiten, ohne es zu verlassen und ohne einen Entwickler.
Entdecken Sie SaaS-EntwicklerWebseiten
Ein vollständiges visuelles Website-Erstellungserlebnis: mehrseitige Projekte, Vorlagen, Assets und Veröffentlichungen.
Siehe den Landing-Page-WinkelVermarktung
Lassen Sie Marketingteams Kampagnenseiten nach ihrem eigenen Zeitplan starten, statt nach Ihrem eigenen.
Entdecken Sie LandungsbauerInhalt
Geben Sie den Content-Teams eine visuelle Bearbeitungsfläche über dem bereits vorhandenen Content-Modell.
Siehe den CMS-EditorFormen
Erstellen Sie Formulare visuell aus getippten Feldkomponenten und senden Sie sie dann an Ihre eigenen Endpunkte.
Formular-Plugins durchsuchenErstellen und verwalten Sie E-Mail-Vorlagen visuell, wobei die Ausgabe für Mail-Clients und nicht für Browser entwickelt wird.
Siehe E-Mail-GebäudeDokumente
Legen Sie Dokumente, Berichte und Einseiten visuell auf und exportieren oder rendern Sie sie dann aus Ihrem Backend.
Siehe eingebettete EditorenAgenturen
Schick jedem Kunden eine gebrandete Bearbeitungsumgebung, die wie dein Produkt aussieht und nicht wie eine Bibliothek.
Erkunden Sie White-LabelDas gibt dir der Editor am ersten Tag an, bevor ein einzelnes Plugin installiert wird. Jedes Plugin ist konfigurierbar – Panels, Kategorien, Einschränkungen und Labels können alle dir einstellen.
Benutzer erstellen Layouts, indem sie Abschnitte und Elemente in die Leinwand ziehen, mit Drop-Targets, Neuordnung und Verschachtelung.
Definiere deine eigenen Elementtypen mit eigenen Einstellungen, Einschränkungen und Verhalten und verwende sie in jedem Projekt wieder.
Die einsatzbereiten Abschnitte, die Nutzer aus dem Panel ziehen. Gruppieren Sie sie in Kategorien, die zum Wortschatz Ihres Produkts passen.
Typografie-, Farb-, Abstands- und Layout-Steuerungen. Beschränke die Eigenschaftsmenge, damit Nutzer sich nicht aus deinem Designsystem herausstylen können.
Wechsle die Leinwand zwischen Desktop-, Tablet- und Mobilbreiten und schreibe Breakpoint-Scope-Stile an der Stelle.
Ein struktureller Baum der Seite, sodass ein tief verschachteltes Layout auswählbar und umgeordnet bleibt.
Ein Asset-Manager für Bilder und Medien, unterstützt von dem Speicher oder CDN, den du bereits nutzt.
Wiederverwendbare Anfangslayouts, sodass eine neue Seite als etwas beginnt und nicht als leere Leinwand.
Generiere HTML und CSS aus dem aktuellen Dokument oder nimm die Projektdaten und rendere sie auf deine eigene Weise.
Der Unterschied zwischen einem generischen Website-Builder und einem Builder, der zu Ihrem Produkt gehört, ist der Komponentensatz. Zwingen Sie Ihr Content-Modell nicht in die Elementtypen anderer – registrieren Sie Ihr eigenes.
Jeder Schritt ist eine gewöhnliche Konfiguration in der Editor-Instanz: ein Komponententyp, ein Block, der sie einfügt, eine Vorlage, die mehrere anordnet, ein Befehl, der darauf wirkt, und ein Panel, das sie offenstellt.
// builder/registerProductBlocks.ts
import type { Editor } from 'grapesjs';
// A plugin is just a function that receives the editor, so everything below
// works identically in Vue, Nuxt, React or a plain HTML page.
export function registerProductBlocks(editor: Editor): void {
// A custom component type: your own element, with your own settings.
editor.DomComponents.addType('pricing-table', {
isComponent: (el) => el.dataset?.gjsType === 'pricing-table',
model: {
defaults: {
droppable: false,
traits: [
{ name: 'plan', type: 'select', options: ['free', 'pro', 'team'] },
{ name: 'highlight', type: 'checkbox' },
],
},
},
});
// A block: what the user actually drags in from the panel.
editor.BlockManager.add('pricing-table', {
label: 'Pricing',
category: 'Sections',
content: { type: 'pricing-table' },
});
}Zwinge dein Produkt nicht in einen generischen Website-Builder. Passe den Editor an dein eigenes Content-Modell und Design-System an.
Eine uneingeschränkte Leinwand erzeugt Seiten, die das Produkt, in dem sie leben, peinlich machen. Der Editor ist in beide Richtungen konfigurierbar – die nützliche Einstellung ist nicht maximale Freiheit, sondern begrenzte Freiheit.
Geben Sie den Nutzern kreative Freiheit, ohne dass sie das Designsystem Ihres Produkts zerstören.
Der wichtigste Faktor dafür, ob ein Page Builder genutzt wird, ist, was beim ersten Besuch im Block-Panel auf dich wartet. Baue die Abschnitte, die dein Produkt tatsächlich braucht, oder installiere eine Bibliothek und benenne sie neu.
Schlagzeile, unterstützende Zeile und eine Hauptaktion.
Ein sich wiederholendes Raster von Fähigkeiten oder Vorteilen.
Plane Spalten mit Merkmalen und einem Aufruf zum Handeln.
Zitate mit Quellenangabe, in einer Reihe oder auf einem Karussell.
Frage-und-Antwort-Paare, erweiterbar oder flach.
Ein Formularabschnitt, der auf Ihrem eigenen Endpunkt gepostet wird.
Ein vollbreites Band mit einer klaren Aktion.
Navigationsspalten, legale Links und Markenzeichen.
GrapesJS hostet nichts und wählt keine Datenbank aus. Du registrierst einen Speicheradapter mit zwei Methoden – laden und speichern – und beide kommunizieren mit deinem API. Nichts verlässt deine Infrastruktur.
Der Redakteur kennt nur 'load()' und 'store()'. Wo diese Anrufe enden – Postgres, MySQL, Mongo, S3, ein kopfloser CMS – ist eine Entscheidung, an der der Redakteur nie teilnimmt.
const editor = grapesjs.init({
container: host.value!,
storageManager: {
type: 'app-api',
autosave: true,
stepsBeforeSave: 10,
},
// Registered as a plugin so the adapter exists before the first load().
plugins: [
(ed) => {
ed.Storage.add('app-api', {
async load() {
const res = await fetch(`/api/projects/${props.projectId}`);
if (!res.ok) throw new Error(`Load failed: ${res.status}`);
return await res.json();
},
async store(project) {
const res = await fetch(`/api/projects/${props.projectId}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(project),
});
if (!res.ok) throw new Error(`Save failed: ${res.status}`);
},
});
},
],
});Du kontrollierst deine Daten und dein Backend. Der Editor ist ein Client deines API wie jeder andere Teil deiner App.
Zwei Artefakte kommen aus dem Editor und sind nicht austauschbar. Das falsche Speichern ist der Fehler, der Seiten sechs Monate später unbearbeitbar macht.
Das vollständige editierbare Dokument: Komponenten, Stile, Assets, Seiten. Gib es zurück an 'load()' und der Nutzer macht genau dort weiter, wo er aufgehört hat. Das ist die Zeile, die du niemals verlieren darfst.
Eine Darstellung des aktuellen Dokuments, das auf Abruf erstellt wird. Generiere es bei jeder Veröffentlichung erneut, anstatt es als Zustand zu behandeln; es kann nicht wieder in ein editierbares Projekt umgewandelt werden.
Das JSON ist das, was der Editor liest. Das HTML ist das, was Ihre Besucher lesen. Nur das zweite zu speichern ist die Einwegtür – die Seite rendert für immer und kann nie wieder bearbeitet werden.
// The source of truth. Store it; the editor reloads from it.
const projectData = editor.getProjectData();
// The output. Regenerate it every time you publish.
const html = editor.getHtml();
const css = editor.getCss();
await $fetch(`/api/projects/${projectId}/publish`, {
method: 'POST',
body: { projectData, html, css },
});
// Authorize the request and sanitize `html` on the server —
// never in the component that produced it.Um erneut zu bearbeiten
Veröffentlichen
Speichere Projektdaten zum Bearbeiten. Generiere HTML und CSS, wenn du publizierbare Ausgaben brauchst.
Autoren und Veröffentlichen sind unterschiedliche Aufgaben. GrapesJS endet in dem Moment, in dem ein Nutzer mit einer Seite zufrieden ist; alles danach ist dein Workflow, auf deiner Infrastruktur.
Fügen Sie Bewertung, Genehmigung oder Terminplanung überall dort ein, wo Ihr Produkt sie benötigt – der Redakteur hat keine Meinung zu den Schritten zwischen Speichern und Speichern.
Wohin veröffentlichte Ausgaben gelangen können
GrapesJS übernimmt das Authoring. Ihre Infrastruktur übernimmt das Veröffentlichen – es gibt kein Hosting, das mit dem Editor geliefert wird, und diese Seite wird nicht anders behaupten.
Jeder Kunde erhält seine eigenen Seiten, eigene Assets, eigene Vorlagen und seine eigene Marke. Diese Isolation ist eine Eigenschaft Ihres Datenmodells und Ihres API – der Editor erhält einfach das richtige Projekt.
Your Vue SaaS
Org A
Org B
Org C
Was deine Vue-App und dein Backend implementieren
Multi-Tenancy ist kein GrapesJS-Feature. Nichts im Editor erzwingt sie, und ein Page Builder, der darauf angewiesen ist, dass der Client den richtigen Tenant auswählt, ist kein Multi-Tenant – es handelt sich um eine gemeinsame Datenbank mit einer UI-Konvention.
Nichts in der Benutzeroberfläche muss wie eine Bibliothek aussehen. Die Panels, die Icons, die Formulierung und der Workflow sind alle Konfigurationen – die meisten ausgelieferten GrapesJS-Builder sind als GrapesJS nicht mehr zu erkennen.
Individuelles Logo, Farben, Typografie und Chrompaneele, aufgetragen pro Kunde, wenn du an Agenturen verkaufst.
Erkunden Sie White-LabelOrdne die Panels komplett um oder ersetze sie und steuere den Editor von deinen eigenen Vue-Komponenten und Befehlen aus.
Siehe eingebettete EditorenBenennen Sie Blöcke, Kategorien und Aktionen in die Wörter, die Ihre Nutzer bereits für sie verwenden.
Siehe SaaS-VerpackungUm klarzustellen, was nicht existiert: Es gibt keinen offiziellen GrapesJS-Wrapper für Vue und kein Vue-spezifisches Plugin auf GJS.Market. Du rufst selbst 'grapesjs.init()' von 'onMounted' auf, das sind fünf Zeilen, und jedes Plugin im Katalog funktioniert dann unverändert.
Fang oben an und füge nur die Schichten hinzu, die dein Produkt tatsächlich erreicht. Die meisten Bauunternehmer installieren nie etwas aus der unteren Hälfte.
Echte Listings von GJS.Market, gruppiert nach dem Problem, das sie entfernen. Jedes einzelne davon wird in derselben Editor-Instanz installiert, die deine Vue-Komponente erstellt.
Das Problem: ein leeres Block-Panel beim ersten Durchlauf. Was sie hinzufügen: fertige Abschnitte, Vorlagenverwaltung und mehrseitige Projekte. Wer braucht sie: jeder, dessen Nutzer keine Entwickler sind.
Durchstöbern Sie diese KategorieEin Startblock-Set, damit das Panel nützlich ist, bevor du dein eigenes schreibst.
Tailwind-basierte Abschnitte für Produkte, deren Designsystem bereits Tailwind ist.
Speichere, liste auf und wende ganze Layouts als wiederverwendbare Ausgangspunkte an.
Mehrere Seiten in einem Projekt, mit Navigation zwischen ihnen.
Das Problem: verlorene Arbeit und handgedrehte Persistenz. Was sie hinzufügen: Projektmanagement, autosave, Absturzwiederherstellung und alternative Speicher-Backends. Wer braucht sie: jedes Produkt mit echten Kunden im Editor.
Durchstöbern Sie diese KategorieProjektliste, Erstellung und Wechsel statt eines Editors pro Route.
Stellt ungespeicherte Arbeit nach einem Absturz oder einem geschlossenen Tab wieder her – der Fehler, den Nutzer nie verzeihen.
Lokale Persistenz im Browser, nützlich für Entwürfe und Offline-Bearbeitung.
Liest und schreibt Projekte über ein Directus-Backend statt über ein benutzerdefiniertes API.
Das Problem: Bildverarbeitung und das Herausholen von Ausgaben aus dem Editor. Was sie hinzufügen: Widgets hochladen, CDN-Integrationen, Bildbearbeitung und Archiv-Export. Wer braucht sie: Entwickler, bei denen Nutzer ihre eigenen Medien mitbringen.
Durchstöbern Sie diese KategorieLädt Editor-Medien über Cloudinary hoch und bereitet sie als Redakteur.
Ein vollständiges Upload-Erlebnis – Ziehen, Fortschritt, mehrere Quellen.
Schneide, vergrößere und passe Bilder im Editor an, statt davor.
Lädt das aktuelle Projekt als HTML/CSS-Archiv herunter.
Das Problem: Die Bearbeitungsfläche ist dünner, als Ihre Nutzer erwarten. Was sie hinzufügen: reichhaltigere Textbearbeitung, Formulare, Breakpoint-Steuerung und Code pro Komponenten. Wer braucht sie: Teams, die einen bestehenden Editor ersetzen.
Durchstöbern Sie diese KategorieFormen Sie Komponenten mit typisierten Feldern, für Erbauer, die Eingaben sammeln.
Verwalte Breakpoints und Gerätebreiten über die drei Standardwerte hinaus.
Komponenten-Bearbeitung von HTML/CSS für die Nutzer, die es möchten.
Derselbe Katalog, geschnitten nach dem Produkt, das du baust. Installiere den Stack, der zu deinem Fall passt, und ignoriere den Rest – ein Editor mit jedem geladenen Plugin ist langsamer und schwerer zu bedienen, nicht besser.
Kunden bearbeiten ihre eigenen Seiten innerhalb Ihres Produkts.
Content-Teams bearbeiten strukturierte Inhalte visuell.
Siehe die CMS-SeiteVollständige Website-Erstellung, mehrteilig und reaktionsschnell.
Kampagnen- und Transaktionsvorlagen, keine Webseiten.
Begrenztes Bearbeiten mit Überprüfung, Rollen und Genehmigungen.
Die angezeigten Preise entsprechen den aktuellen GJS.Market-Listenpreisen; kostenlose Plugins sind markiert.
Wenn ein Stapel oben nicht zu deinem Produkt passt, fang stattdessen hier an. Das sind die Katalogbereiche, ungefähr in der Reihenfolge, in der ein Bauunternehmer hineinwächst.
Keine der beiden Spalten ist frei. Die Frage ist nur, in welcher Spalte dein Team seine Zeit verbringen sollte.
| Berücksichtigung | Baue es intern | Installation von GJS.Market |
|---|---|---|
| Die Fähigkeit erhalten | Entwicklungszeit auf deiner Roadmap | Installation und Konfiguration |
| Es am Laufen halten | Du hältst es für immer aufrecht. | Als veröffentlichtes Paket gepflegt |
| Wiederverwendung | Nur interner Code | Eine Lösung, die bereits andere Produkte ausführen |
| Umfang | Du baust jedes Feature selbst | Fügen Sie nur das hinzu, was Ihr Produkt benötigt |
| Wo die Kosten landen | Ingenieurzeit | Ein Listenpreis, einmal |
| Woran dein Team arbeitet | Editor-Infrastruktur | Ihr Produkt |
Absichtlich erscheinen in dieser Tabelle keine Kosten- oder Zeitzahlen – wir kennen Ihr Team nicht, und hier wäre jede Zahl erfunden.
Reihe für Zeile, was du selbst schreiben und was bereits existiert. "Erweiterbar" bedeutet, dass die Engine den Hook liefert und du das Verhalten lieferst – meist ein paar Zeilen, manchmal ein Plugin.
| Leistungsfähigkeit | Von Grund auf | GrapesJS |
|---|---|---|
| Leinwand bearbeiten | Bau | Enthalten |
| Drag & Drop | Bau | Enthalten |
| Komponentenmodell | Bau | Enthalten |
| Blöcke | Bau | Erweiterbar |
| Style Manager | Bau | Enthalten |
| Responsive Bearbeitung | Bau | Enthalten |
| Schichtbaum | Bau | Enthalten |
| Rückgängig machen & neu machen | Bau | Enthalten |
| Vermögenswerte | Bau | Erweiterbar |
| Vorlagen | Bau | Erweiterbar |
| Lagerung | Bau | Erweiterbar |
| HTML / CSS Export | Bau | Enthalten |
| Vue-Komponenten in der Leinwand | Bau | Nicht enthalten – die Leinwand rendert DOM |
| Multi-tenancy, Rollen, Verlagswesen | Bau | Nicht enthalten – deine Bewerbung |
Included = wird mit dem Kern ausgeliefert. Extensible = ein dokumentierter Erweiterungspunkt sowie Plugins, wo sie existieren.
Verifiziert mit GrapesJS 0.23.6 auf 2026-09-02.
Baue dein Vue-Produkt. Baue den visuellen Editor nicht neu auf.
Fünf Schritte, eine Komponente. Es gibt keinen offiziellen Vue-Wrapper und du brauchst keinen: GrapesJS rendert in ein einfaches Element, daher ist die einzige Vue-spezifische Frage, welcher Lebenszyklus-Hook 'init()' aufruft. Installiere grapesjs 0.23.6, erstelle die Komponente, initialisiere beim Mount, passe deine Plugins weiter, zerstöre beim Unmount.
npm install grapesjs<!-- components/PageBuilder.vue -->
<template>
<div ref="host" class="page-builder" />
</template>
<script setup lang="ts">
import { onBeforeUnmount, onMounted, ref, shallowRef } from 'vue';
import grapesjs, { type Editor } from 'grapesjs';
import 'grapesjs/dist/css/grapes.min.css';
// shallowRef, not ref: the editor is a large non-reactive instance and
// deep-proxying it costs performance for nothing.
const editor = shallowRef<Editor | null>(null);
const host = ref<HTMLElement | null>(null);
onMounted(() => {
editor.value = grapesjs.init({
container: host.value!,
height: '100%',
fromElement: false,
storageManager: false,
plugins: [], // GJS.Market plugins go here
blockManager: { blocks: [] },
});
});
onBeforeUnmount(() => {
editor.value?.destroy();
editor.value = null;
});
</script>GrapesJS benötigt einen Browser DOM. Unter der Server-Rendering von Nuxt gibt es kein "Dokument", daher muss der Editor auf dem Client erstellt werden – was "onMounted" bereits garantiert. "<ClientOnly>" ist die Gürtel-und-Stützen-Version, und dort befindet sich das Notfall-Markup.
Der Server rendert alles rund um den Editor herum; der Editor selbst erscheint, sobald die Komponente im Browser gemountet wurde.
<!-- pages/editor.vue -->
<template>
<ClientOnly>
<PageBuilder :project-id="route.params.id" />
<template #fallback>
<p class="editor-placeholder">Loading the editor…</p>
</template>
</ClientOnly>
</template>
<script setup lang="ts">
const route = useRoute();
</script>Reproduziert, nicht angenommen
Läuft in einfachem Node ohne DOM auf 2026-09-02. Der Unterschied ist wichtig: Der Import ist sicher, du brauchst also keinen dynamischen Import, um das Bundle serversicher zu halten – der Init-Call muss im Browser erfolgen.
Jedes dieser Dinge ist von Anfang an günstig zu bekommen und teuer zu beheben, sobald die Kunden im Editor sind.
Der Fehler
Das Aufrufen von 'init()' an irgendeinem Ort, der auf dem Server läuft, wirft aus, weil es kein 'Dokument' gibt, in das man die Leinwand rendern könnte.
Was stattdessen zu tun ist
Erstelle den Editor nur in 'onMounted' und wrappe die Route in '<ClientOnly>', wenn du einen server-gerenderten Fallback möchtest.
Der Fehler
Die gerenderte Ausgabe kann nicht wieder in ein editierbares Dokument umgewandelt werden. Jede auf diese Weise gespeicherte Seite wird sofort in dem Moment der Veröffentlichung eingefroren.
Was stattdessen zu tun ist
Speichere das Projekt JSON als Wahrheitsquelle und generiere HTML und CSS bei jeder Veröffentlichung neu.
Der Fehler
Totale Freiheit erzeugt Seiten, die dein Designsystem zerstören, und ein Erstaufführungserlebnis ohne Panel bringt überhaupt keine Seiten hervor.
Was stattdessen zu tun ist
Shippe kuratierte Blöcke und Vorlagen und beschränke die Stileigenschaften, die Nutzer erreichen können.
Der Fehler
Jedes Plugin fügt Panels, Bündelgewicht und eine Oberfläche hinzu, die Ihre Nutzer verstehen müssen. Ein überfüllter Editor ist schwieriger zu bedienen, nicht leistungsfähiger.
Was stattdessen zu tun ist
Beginne mit dem Stack für deine Produktform und füge ein Plugin hinzu, wenn ein echter Bedarf besteht.
Die Dinge, die eine funktionierende Demo von etwas unterscheiden, das man zahlenden Kunden präsentieren kann.
Die Instanz verhält sich bei jeder Routenänderung korrekt.
Nichts, was ein Nutzer getippt hat, darf verloren gehen.
Ein Nicht-Entwickler kann eine gute Seite auch ohne Hilfe erstellen.
Erstlauferfahrung entscheidet mehr über die Einführung als die Anzahl der Funktionen.
Jede Regel wird dort durchgesetzt, wo der Client sie nicht erreichen kann.
Der Pfad von einem genehmigten Entwurf zu einer Live-URL ist definiert.
Der Editor ist eine starke Abhängigkeit und gehört genau auf eine Route. Die meisten Performance-Probleme in einem Builder entstehen dadurch, dass er geladen wird, wo er nicht benötigt wird.
Ein Page Builder akzeptiert beliebige Inhalte von Nutzern und wandelt sie in Seiten um, die andere sehen. Behandle jede Eingabe als nicht vertrauenswürdig und jede Kundenregel als dekorativ.
Verlasse dich niemals nur auf clientseitige Berechtigungen.
Verschiedene Produkte, eine Architektur. Wenn Sie Ihr Team hier erkennen, ist der Rest dieser Seite für Sie geschrieben.
Visuelle Bearbeitung zu einem bestehenden Produkt hinzufügen, damit Kunden keine Tickets mehr für Inhaltsänderungen einreichen.
Ein individuelles Bearbeitungserlebnis pro Client zu erstellen, basierend auf einer Codebasis, die sie pflegen.
Kunden bietet visuelle Bearbeitung von Inhalten, die die Plattform bereits modelliert.
Kampagnenteams können Seiten starten, ohne dass ein Entwickler eingeladen ist.
Erstellte kontrollierte interne Bearbeitungsabläufe mit Rollen, Überprüfung und Genehmigung.
Ein visueller Editor in einer Vue-Anwendung, der es jemand ermöglicht, eine Seite zusammenzustellen und zu stylen, indem er Abschnitte auf eine Leinwand zieht, anstatt ein Markup zu schreiben. Die Vue-App stellt die Routen, Benutzer und Daten bereit; der Editor stellt die Leinwand bereit.
Ja. GrapesJS rendert in ein einfaches DOM-Element, also erstellst du es in 'onMounted' und zerstörst es in 'onBeforeUnmount'. Es ist keine Wrapper-Bibliothek beteiligt.
Ja. Der Editor wird auf dem Client erstellt; 'onMounted' garantiert das bereits, und '<ClientOnly>' gibt dir einen server-gerenderten Rückfallback darum herum.
Das Importieren des Moduls ist auf dem Server sicher – nur 'init()' benötigt ein DOM. Die umliegende Seite rendert also normal und der Editor erscheint, sobald die Komponente im Browser gemountet ist.
Es ist eine framework-agnostische Bearbeitungs-Engine, keine Vue-Bibliothek. Es wird zu einem Vue-Seitenbauer, wenn man es in einer Vue-Komponente montiert und mit dem eigenen Speicher und der Veröffentlichung verbindet.
Installiere das Paket, füge eine Komponente mit einem Container-Element hinzu, rufe 'grapesjs.init()' in 'onMounted' mit deinen Plugins und Blöcken auf und rufe 'destroy()' beim Unmounten auf. Der komplette Leitfaden behandelt Events, Composables und Wrapper.
Ja, und es ist die natürliche Ergänzung – die Lebenszyklus-Hooks sind genau dort, wo Schöpfung und Zerlegung hingehören. Halte die Instanz in 'shallowRef' statt in 'ref'.
Nein. Es gibt einen offiziellen React-Wrapper, aber nichts für Vue; das Paket auf npm richtet sich an Vue 2 und wurde seit 2022 nicht mehr aktualisiert. Wenn man selbst 'init()' anruft, dauert es etwa fünf Zeilen und vermeidet die Abhängigkeit von nicht gepflegtem Code.
Ja. Blöcke werden im Block Manager des Redakteurs mit deinem eigenen Markup, Label und einer Kategorie registriert, und du kannst sie nach dem Wortschatz deines Produkts gruppieren.
Ja. Definiere deine eigenen Bauteiltypen mit eigenen Einstellungen, Einschränkungen und Verhalten und stelle sie dann als Blöcke frei. So hört ein Bauer auf, generisch zu wirken.
Nein. Die Leinwand ist ein isoliertes Dokument, das einfach DOM rendert, also bearbeitet es HTML und CSS, anstatt Vue-Komponenten zu montieren. Deine Anwendung ist Vue; die bearbeitete Seite ist Markup, das deine App nach Belieben rendern kann.
Ja. Speichere ganze Layouts als Ausgangspunkte, entweder über deinen eigenen Speicher oder mit einem Template-Management-Plugin aus dem Katalog.
Ja, und das ist das beabsichtigte Design. Du registrierst einen Speicheradapter mit den Methoden 'laden' und 'speichern', die dein API aufrufen – der Editor kommuniziert nie direkt mit deiner Datenbank.
Speichere das Projekt JSON: Es ist die editierbare Wahrheitsquelle, die der Editor neu lädt. Generiere HTML und CSS beim Veröffentlichen. Wenn du nur HTML speicherst, ist die Seite dauerhaft unbearbeitbar.
Ja. Deine Vue-App kümmert sich um Konten, Pläne und Routing; der Editor übernimmt das Authoring; dein API übernimmt Projekte. Diese Kombination ist die übliche Form für einen Builder, der als Produkt verkauft wird.
Ja, aber der Tenancy befindet sich in deiner Anwendung und deiner Datenbank, nicht im Editor. Skaliere jedes Projekt, Asset und jede Vorlage nach Mieter und setze sie serverseitig durch.
Ja. Logo, Farben, Panels, Terminologie und verfügbare Blöcke sind alle Konfigurationen, sodass jeder Kunde eine Umgebung bekommt, die wie dein Produkt aussieht.
Ja – es ist die häufigste erste Version. Kuratieren Sie eine kleine Auswahl an Marketing-Abschnitten, fügen Sie Vorlagen hinzu und lassen Sie das Marketingteam über Ihre bestehende Pipeline veröffentlichen.
Ja. Registrieren Sie Komponententypen, die Ihr Inhaltsmodell spiegeln, damit Editoren visuell mit Ihren Entitäten arbeiten und nicht mit freier Markup-Form.
Ja. Ein Plugin ist eine Funktion, die die Editor-Instanz empfängt, sodass der gesamte GJS.Market-Katalog unverändert in einer Vue-App funktioniert – es gibt keine Vue-spezifische Edition, nach der man suchen sollte.
Ja. Der Core ist BSD-3-Clause-lizenziert, was kommerzielle Nutzung erlaubt, auch innerhalb eines Produkts, das du verkaufst. Überprüfe die individuelle Lizenz jedes Plugins, das du installierst.
Brauchen Sie Hilfe bei der Integration von GrapesJS mit Vue oder Nuxt, beim Erstellen benutzerdefinierter Blöcke und Komponenten, beim Verbinden Ihres Backends oder beim Erstellen eines produktionsreifen Bearbeitungsworkflows? Wir übernehmen diese Arbeit.
Für Teams, die lieber das Produkt als die Editor-Infrastruktur liefern würden.
Nutze Vue für deine Anwendung und GrapesJS für das visuelle Bearbeitungserlebnis. Füge eigene Komponenten, Blöcke, Vorlagen, Speicher- und Veröffentlichungsworkflow hinzu – und erweitere den Builder dann mit GJS.Market-Plugins, wenn du mehr brauchst.
Fünf Schritte und eine Komponente. Installiere das Paket und lass heute Nachmittag einen Editor in deiner Vue-App laufen.
Leg losBlöcke, Vorlagen, Speicher, Assets und Export – installieren Sie die Funktionen, die Sie sonst auf die Roadmap setzen würden.
Durchsuchen von PluginsIntegration, individuelle Komponenten, Backend-Verkabelung und ein Produktionsbearbeitungs-Workflow, gemeinsam mit deinem Team entwickelt.
Sprich mit unsDeine Vue-App. Dein Editor. Dein Produkt.