Anfänger
Die Kernschleife: Einen Editor auf den Bildschirm bringen und Dinge hineinfügen.
PageKit — der selbst gehostete GrapesJS-Website-Builder, als Quellcode. Early Access sichern
Lerne GrapesJS Schritt für Schritt. Baue deinen ersten visuellen Editor, füge Blöcke und benutzerdefinierte Komponenten hinzu, konfiguriere Stile und Assets, speichere Projekte, exportiere HTML/CSS, installiere Plugins und integriere GrapesJS mit React, Vue, Angular oder Next.js.
Der GrapesJS-Kern wird unter der BSD-3-Clause-Lizenz veröffentlicht; der offizielle React-Wrapper @grapesjs/react ist MIT. Beide erlauben kommerzielle Nutzung. Jedes untenstehende Beispiel wurde mit GrapesJS 0.23.6 abgeglichen.
Am Ende dieses Tutorials hast du einen funktionierenden Drag-and-Drop-Visual-Editor, der Seiten erstellen, Komponenten bearbeiten, Stile und Assets verwalten, Projekte speichern und die resultierenden HTML und CSS exportieren kann.
Geschätzter Lernweg
Anfänger → Fortgeschritten → Produktion
Wie lange das dauert, hängt ganz davon ab, wie viel von der Produktionsschicht dein Produkt benötigt. Die Schritte 1–6 sind ein Nachmittag; Schritte 7–12 sind die Arbeit.
Die offizielle GrapesJS-Demo öffnenSehr wenig. Wenn du eine Seite von Hand schreiben kannst, kannst du diesem folgen.
Du solltest ein Tag, eine Klasse und eine CSS-Eigenschaft erkennen. GrapesJS bearbeitet HTML und CSS – nichts Exotischeres.
Genug, um ein Objekt-Literal und eine Funktion zu lesen. Jedes Beispiel hier ist reines JavaScript.
Nur wenn du von npm installierst. Der CDN-Weg in Schritt 1 benötigt nichts außer einem Texteditor und einem Browser.
Du brauchst keine vorherige GrapesJS-Erfahrung und kein Framework. React, Vue, Angular und Next.js werden in Schritt 11 behandelt, nachdem der Kern klar ist.
Das ist der richtige Weg, wenn du einen Build-Schritt irgendeiner Art hast. Er installiert den Editor und sein Stylesheet in dein Projekt; zur Laufzeit wird nichts von einem Drittanbieter-Host abgerufen.
npm install grapesjsKeine Build-Tools überhaupt: Zwei Tags in einer HTML-Datei und du hast einen Editor. Perfekt für einen First Look oder einen Prototyp. Für alles, was du versendest, pinne eine exakte Version an, anstatt die neueste Version zu verfolgen.
<link
rel="stylesheet"
href="https://unpkg.com/grapesjs/dist/css/grapes.min.css"
/>
<script src="https://unpkg.com/grapesjs"></script>
<div id="gjs"></div>
<script>
// The UMD build puts the library on window.grapesjs
const editor = grapesjs.init({ container: '#gjs' });
</script>Der Editor-Kern
Die Leinwand, der Komponentenbaum, Drag-and-Drop, Rückgängig/Wiederholen, die Panels und die Manager für Blöcke, Stile, Assets, traits, Ebenen und Speicher.
Ein Stylesheet
grapesjs/dist/css/grapes.min.css – das eigene Chrome des Editors. Ohne es bekommt man einen funktionierenden Editor, der kaputt aussieht.
Keine Blöcke
Der Kern liefert eine leere Blockpalette. Die vertrauten Spalten-/Text-/Bildblöcke stammen aus einem Plugin, was Schritt 3 ist.
Kein Backend
Keine Konten, keine Datenbank, kein Hosting. GrapesJS läuft im Browser und übergibt Daten an deine Anwendung, das ist Schritt 7.
Es handelt sich um eine clientseitige Komponente. Ihre Anwendung authentifiziert den Benutzer, entscheidet, welches Projekt geöffnet wird, mountet den Editor in ein DOM-Element und erhält die Projektdaten zurück, wenn sie gespeichert sind. Alles oberhalb und unterhalb des Editors gehört Ihnen.
<!-- The editor takes over this element completely.
Do not render anything inside it yourself. -->
<div id="gjs"></div>import grapesjs from 'grapesjs';
import 'grapesjs/dist/css/grapes.min.css';
const editor = grapesjs.init({
// Where the editor mounts: a selector or an HTMLElement.
container: '#gjs',
height: '100vh',
width: 'auto',
// Do not adopt the markup already inside #gjs...
fromElement: false,
// ...load this instead. Strings are parsed into components.
components: `
<section class="hero">
<h1>Hello GrapesJS</h1>
<p>Drag a block from the panel on the right.</p>
</section>`,
style: `
.hero { padding: 64px 32px; font-family: system-ui, sans-serif; }
.hero h1 { margin: 0 0 12px; font-size: 40px; }`,
// Storage is ON by default and writes to localStorage.
// Turn it off until you have decided where projects really live.
storageManager: false,
});Eine dreiteilige Benutzeroberfläche: die Leinwand in der Mitte, der Panel-Schalter oben rechts und – sobald du in Schritt 3 Blöcke hinzugefügt hast – eine Palette zum Ziehen. Der Editor über diesem Abschnitt ist genau diese Konfiguration mit sechs Blöcken und drei hinzugefügten Gerätebreiten.
Live-Demo öffnenBlock
Ein Paletteneintrag. Er existiert nur im Panel und enthält ein Rezept, was erstellt werden soll. Er hat ein Label, eine Kategorie, ein Symbol und Inhalte.
Komponente
Ein Knoten in der Leinwand. Er hat einen Typ, Attribute, Stile, Kinder, und das ist es, was exportiert und gespeichert wird.
Ein Block ist das, was der Benutzer in die Leinwand zieht. Sobald der Block abgeworfen wurde, erstellt er Komponenten im Editor. Ein Block kann einen ganzen Teilbaum von Komponenten bilden – und derselbe Block, der zweimal abgeworfen wird, erzeugt zwei unabhängige Unterbäume.
// A Block is a palette entry. Dropping it creates Components.
editor.Blocks.add('hero-section', {
label: 'Hero',
category: 'Sections',
// Shown in the palette. Any HTML string works; an inline SVG keeps it sharp.
media: '<svg viewBox="0 0 24 24" width="22"><rect x="3" y="5" width="18" height="6" rx="1" fill="currentColor"/><rect x="3" y="13" width="11" height="3" rx="1" fill="currentColor" opacity=".5"/></svg>',
content: `
<section class="hero">
<h1>Headline</h1>
<p>Supporting copy.</p>
<a href="#" class="btn">Call to action</a>
</section>`,
});
// The same block, expressed as a component definition instead of HTML.
// Use this form once you have your own component types (step 10).
editor.Blocks.add('product-card', {
label: 'Product card',
category: 'Commerce',
content: { type: 'product-card' },
});Das überrascht fast alle. Ein standardmäßiger GrapesJS-Editor hat eine leere Palette – das bekannte Set "1 Spalte / 2 Spalten / Text / Bild", das in jedem Screenshot erscheint, stammt aus grapesjs-blocks-basic oder einem der Presets. Entweder schreibst du deine eigenen Blöcke, wie oben, oder fügst ein Preset hinzu.
import grapesjs, { usePlugin } from 'grapesjs';
import blocksBasic from 'grapesjs-blocks-basic';
// The core ships no blocks at all. The familiar
// "1 column / 2 columns / text / image" palette is a plugin.
grapesjs.init({
container: '#gjs',
plugins: [usePlugin(blocksBasic, { flexGrid: true })],
});Ein typischer Teilbaum
// Every node in the canvas is a Component, and the canvas is a tree.
const wrapper = editor.getWrapper();
wrapper.components().forEach((component) => {
console.log(
component.get('type'), // 'text' | 'image' | 'link' | your own type
component.getName(), // label shown in the Layer manager
component.components().length // number of children
);
});
// React to what the user selects — the hook most custom UI hangs off.
editor.on('component:selected', (component) => {
console.log('selected', component.getId(), component.get('type'));
});// Traits are the settings panel for a component.
// By default a trait writes an HTML attribute.
editor.Components.addType('cta-button', {
extend: 'link',
model: {
defaults: {
name: 'CTA button',
attributes: { class: 'btn' },
components: 'Call to action',
traits: [
{ name: 'href', label: 'Link' },
{ name: 'title', label: 'Title' },
{
type: 'select',
name: 'target',
label: 'Opens in',
options: [
{ id: '', name: 'Same tab' },
{ id: '_blank', name: 'New tab' },
],
},
],
},
},
});grapesjs.init({
container: '#gjs',
styleManager: {
// Sectors are the collapsible groups in the right-hand panel.
// Listing them yourself is how you stop the editor offering
// 100+ CSS properties to a non-technical author.
sectors: [
{
id: 'typography',
name: 'Typography',
open: true,
properties: [
'font-family',
'font-size',
'font-weight',
'line-height',
'color',
'text-align',
],
},
{ id: 'spacing', name: 'Spacing', properties: ['margin', 'padding'] },
{
id: 'dimension',
name: 'Dimension',
properties: ['width', 'max-width', 'height'],
},
{
id: 'decorations',
name: 'Decorations',
properties: ['background-color', 'border-radius', 'border', 'box-shadow'],
},
],
},
});Komponentenstruktur
Was existiert, was was enthält, was kann hinzugefügt oder entfernt werden. Kontrolliert mit dem Bauteiltyp droppable, draggable und removable.
Bauteilgestaltung
Wie ein Bauteil aussehen kann. Gesteuert mit der Style Manager-Konfiguration und mit stylable / unstylable am Bauteil selbst.
// Structure and styling are separate concerns. A component can accept
// children while refusing to be restyled beyond a fixed allowance.
editor.Components.addType('brand-heading', {
extend: 'text',
model: {
defaults: {
name: 'Brand heading',
// Only these properties reach the Style manager for this component.
stylable: ['color', 'text-align'],
// Everything else stays on the class in your own stylesheet.
attributes: { class: 'brand-h2' },
},
},
});grapesjs.init({
container: '#gjs',
assetManager: {
// Seed the panel with images you already host.
assets: [
'https://cdn.example.com/hero.jpg',
{ src: 'https://cdn.example.com/team.jpg', name: 'Team', category: 'People' },
],
// Your upload endpoint. Set `upload: false` to disable uploading entirely.
upload: 'https://api.example.com/uploads',
uploadName: 'files',
headers: { Authorization: 'Bearer <token>' },
multiUpload: true,
// Add the response's assets to the panel automatically. Your endpoint must
// answer with { data: [ ...assets ] }.
autoAdd: true,
},
});// Full control: upload wherever you like, then hand the URLs back.
grapesjs.init({
container: '#gjs',
assetManager: {
async uploadFile(event) {
const files = event.dataTransfer
? event.dataTransfer.files
: event.target.files;
const urls = await uploadToYourStorage(files); // S3, R2, Cloudinary…
editor.AssetManager.add(urls);
},
},
});
// Without `upload` or `uploadFile`, dropped images are embedded as base64
// straight into the project — convenient in a demo, painful in production.Da weder Upload noch uploadFile konfiguriert sind, integriert GrapesJS abgegebene Bilder als base64 ins Projekt. Es funktioniert sofort und bläht das gespeicherte Projekt so lange auf, bis es langsam lädt und teuer im Übertragen wird. Verbinde Asset Manager mit echtem Speicher, bevor jemand anfängt, Inhalte zu produzieren.
grapesjs.init({
container: '#gjs',
storageManager: {
type: 'remote',
autosave: true,
autoload: true,
// Batch changes: save after N edits rather than after every keystroke.
stepsBeforeSave: 5,
options: {
remote: {
urlLoad: '/api/projects/42',
urlStore: '/api/projects/42',
headers: { 'X-CSRF-Token': csrfToken },
credentials: 'include',
// Shape the request body to match your API…
onStore: (data) => ({ project: data }),
// …and pull the project back out of your response.
onLoad: (result) => result.project,
},
},
},
});// When `remote` does not fit — GraphQL, a queue, an offline-first cache —
// register a storage of your own and select it by name.
editor.Storage.add('my-api', {
async load() {
const res = await fetch('/api/projects/42');
const { project } = await res.json();
return project; // the object you previously stored
},
async store(data) {
await fetch('/api/projects/42', {
method: 'PATCH',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ project: data }),
});
},
});
// storageManager: { type: 'my-api' }
// You can also drive it by hand, with no storage configured at all:
const project = editor.getProjectData(); // plain JSON — store it anywhere
editor.loadProjectData(project); // and put it backGrapesJS stellt den Editor und die Projektdatenschicht bereit, aber Ihre Anwendung entscheidet, wo Produktionsdaten gespeichert werden. Welcher Benutzer ein Projekt besitzt, zu welchem Tenant es gehört, wer es öffnen darf, wie viele Revisionen Sie speichern, wann es gesichert wird – nichts davon befindet sich in der Bibliothek und sollte es auch nicht sein.
const html = editor.getHtml();
const css = editor.getCss();
// Two things surprise everyone on their first export:
//
// 1. getHtml() returns the canvas wrapped in <body> … </body>.
// Strip or template around it before you save a fragment.
// 2. getCss() includes GrapesJS's own canvas reset unless you opt out:
const pageCss = editor.getCss({ avoidProtected: true });
// Export one branch instead of the whole page:
const selected = editor.getSelected();
const partial = editor.getHtml({ component: selected });
// The editable project — NOT the same thing as the exported page.
const project = editor.getProjectData();getHtml() wickelt in <body>
Die Wrapper-Komponente wird als Body-Element exportiert. Wenn du ein Fragment speicherst, eine Vorlage darum herum oder es abstrippen – geh nicht davon aus, dass du einen nackten Abschnitt zurückbekommst.
getCss() enthält den Reset des Editors
GrapesJS liefert ein kleines, geschütztes Stylesheet für die Leinwand. Passen Sie avoidProtected: True, wenn Sie nur das CSS wollen, das Ihr Reader tatsächlich erstellt hat.
Eine typische Verlagspipeline
getHtml() und getCss() zeigen dir, was Besucher sehen. getProjectData() gibt dir das, was der Autor weiter bearbeiten kann. Speichere das Projekt; generiere die Seite daraus neu. Wenn du nur HTML speicherst, beginnt die nächste Bearbeitung mit geparstem Markup und nicht aus dem Dokument, das der Autor erstellt hat.
import grapesjs, { usePlugin } from 'grapesjs';
import blocksBasic from 'grapesjs-blocks-basic';
import forms from 'grapesjs-plugin-forms';
grapesjs.init({
container: '#gjs',
plugins: [
usePlugin(blocksBasic, { flexGrid: true }),
usePlugin(forms, {}),
],
});// A plugin is just a function that receives the editor.
// Anything you can do at init you can do inside one.
export default function dividerPlugin(editor, options = {}) {
const category = options.category ?? 'Basic';
editor.Blocks.add('divider', {
label: 'Divider',
category,
content: '<hr class="divider" />',
});
editor.Commands.add('clear-canvas', {
run: (ed) => ed.Components.clear(),
});
}
// Then: plugins: [usePlugin(dividerPlugin, { category: 'Layout' })]Benötigen Sie Funktionen, die in Ihrem Basis-Editor nicht enthalten sind? Entdecken Sie Plugins und Erweiterungen, die über GJS.Market verfügbar sind. Unten finden Sie echte Einträge aus dem Katalog, gruppiert nach dem Schritt, zu dem sie gehören.
Echte Einträge aus dem GJS.Market-Katalog, gruppiert nach dem Teil des Tutorials, den sie erweitern. Hier ersetzt nichts den Kern – jeder füllt eine Naht, die der Kern absichtlich offen lässt.
Schritt 3 – eine Farbpalette, von der du anfangen kannst, anstatt jeden Block von Hand zu schreiben.
Kategorie durchstöbernDie Starterpalette Schritt 3 sagt, dass der Kern fehlt: eine Handvoll Grundblöcke, die für dich registriert wurden.
Ein Webseiten-Preset – Blöcke, Panels und eine sinnvolle Standardkonfiguration in einem Plugin, anstatt sie selbst zusammenzustellen.
Bootstrap 5 Layoutblöcke, wenn dein Produkt bereits Bootstrap ausliefert, sollte der Editor denselben Aufschlag erzeugen.
Eine Bibliothek von fertigen, responsiven Tailwind-Blöcken für Teams, deren Designsystem bereits Tailwind-Klassen enthält.
Schritte 4 und 10 – Komponententypen, die jemand bereits gebaut und getestet hat.
Kategorie durchstöbernEin Tabs-Komponententyp, komplett mit seinem Block – ein ausgearbeitetes Beispiel für alles, was Schritt 10 abdeckt.
Ein touch-fähiger Schiebeblock, der auf Swiper basiert, eine der Komponenten, die fast jeder Page Builder irgendwann benötigt.
Formkomponenten und Blöcke: Eingabe, Textbereich, Auswahl, Kontrollkästchen, Funkgerät und Button, verdrahtet als echte Komponententypen.
Eine Icon-Komponente mit einem Iconify-Picker in einem Modal – ein gutes Modell für ein Merkmal, das benutzerdefinierte UI öffnet.
Schritte 6 und 7 – ein Ort, an dem Projekte und Uploads veröffentlicht werden können.
Kategorie durchstöbernEin IndexedDB-Speicher-Wrapper: derselbe Storage Manager-Vertrag aus Step 7, gestützt auf die eigene Datenbank des Browsers.
Ein Firestore-Speicher-Wrapper, falls du lieber den Editor auf eine gehostete Datenbank verweisen möchtest, als einen Speicher-Endpunkt zu bauen.
Ersetzt den Standard-Uploader durch Cloudinary – den uploadFile-Hook aus Schritt 6, der bereits geschrieben ist.
Tauscht den Asset Manager-Uploader gegen Filestack, gegen Teams, die ihn bereits für den Rest ihrer Uploads nutzen.
Schritte 8 und 9 – reichhaltigere Textbearbeitung, Codebearbeitung und Exportziele.
Kategorie durchstöbernTauscht den eingebauten Rich-Text-Editor gegen CKEditor 5 im Inline-Modus. CKEditor selbst wird von seinem Anbieter separat lizenziert.
Bearbeite die HTML und CSS der ausgewählten Komponente direkt auf der Leinwand – praktisch, solange du den Baum noch lernst.
Verpackt den Export von Step 8 in eine herunterladbare ZIP, was die schnellste Veröffentlichungspipeline ist, die es gibt.
Mehr Aktionen im integrierten Rich-Text-Editor, ohne einen vollständigen Drittanbieter-Editor zu beziehen.
Eine Produktkarte als Komponententyp
editor.Components.addType('product-card', {
// Lets GrapesJS recognise the type when parsing saved HTML.
isComponent: (el) => el.dataset?.gjsType === 'product-card',
model: {
defaults: {
name: 'Product card',
attributes: { 'data-gjs-type': 'product-card', class: 'product-card' },
// Author-visible settings. `changeProp` writes to the model
// instead of to an HTML attribute.
traits: [
{ name: 'sku', label: 'SKU', changeProp: true },
{
type: 'checkbox',
name: 'showPrice',
label: 'Show price',
changeProp: true,
},
],
sku: '',
showPrice: true,
// Fixed structure: the author edits the parts, not the layout.
components: [
{ type: 'image', attributes: { class: 'product-card__image' } },
{ type: 'text', name: 'Name', components: 'Product name' },
{ type: 'text', name: 'Price', attributes: { class: 'product-card__price' }, components: '$0.00' },
{ type: 'cta-button', components: 'Add to cart' },
],
// Locks that make the card a card and not a free-form div.
droppable: false,
stylable: ['background-color', 'border-radius', 'box-shadow'],
},
init() {
this.on('change:showPrice', this.togglePrice);
},
togglePrice() {
const price = this.components().at(2);
price?.addStyle({ display: this.get('showPrice') ? 'block' : 'none' });
},
},
});Eine SaaS-Anwendung kann produktspezifische Komponenten offenlegen – eine Preistabelle, die mit echten Plänen verbunden ist, eine Produktkarte, die an eine SKU gebunden ist, ein Buchungs-Widget – statt eines generischen uneingeschränkten HTML-Editors. Autoren haben weniger Auswahl und bessere Ergebnisse, und Ihre Support-Warteschlange sieht nie eine Seite, die jemand mit einem verirrten Float kaputt gemacht hat.
Die Schritte 3, 5 und 10 ergeben das Nützlichste, was du mit GrapesJS tun kannst: Ersetze "alles ist möglich" durch "diese sieben Dinge, richtig gemacht". Jeder Mechanismus ist einer, den du bereits kennengelernt hast.
Benutzerdefinierte Blöcke
Die Palette ist das Menü. Wenn sie nicht im Regal steht, kann sie niemand hinzufügen.
Individuelle Komponenten
Feste Struktur pro Block, wobei die Teile, die bearbeitbar sein sollten, als bearbeitbar markiert sind.
Merkmale
Die Einstellungen, die ein Autor erhält – eine Überschrift, ein Link, eine Variante – statt rohes Markup.
Style Manager-Konfiguration
Sektoren, die nur die Eigenschaften auflisten, die dein System tatsächlich erlaubt.
Erlaubte Stile
stylable und unstylable pro Komponente, sodass eine Karte die Farbe wechseln kann, aber kein Float wird.
Wiederverwendbare Bauteile
Geteilte Stücke, die synchron bleiben, anstatt pro Seite kopiert zu werden.
Vorlagen
Ein Startdokument pro Seitentyp, sodass niemand mit einer leeren Leinwand beginnt.
Custom UI
Die Panels von GrapesJS sind austauschbar. Ein Produkteditor sieht selten wie der Standard-Editor aus.
Dein SaaS-Designsystem
Verwandle GrapesJS von einem generischen Editor in einen speziell für dein Produkt entwickelten Editor.
Zwei Leitfäden gehen in zwei Richtungen weiter:
GrapesJS rendert in ein einfaches DOM-Element, sodass die "Integration in ein Framework" auf eine Frage hinausläuft: Welcher Lebenszyklus-Hook ruft init() auf und welcher auf destroy(). Das folgende Muster ist React; die speziellen Guides decken den Rest ab, einschließlich der Teile, die wirklich framework-spezifisch sind.
import { useEffect, useRef } from 'react';
import grapesjs, { type Editor } from 'grapesjs';
export function GjsEditor() {
const ref = useRef<HTMLDivElement>(null);
const editorRef = useRef<Editor | null>(null);
useEffect(() => {
if (!ref.current) return;
editorRef.current = grapesjs.init({
container: ref.current,
height: '100vh',
storageManager: false,
});
// GrapesJS owns this node now — React must never render into it again.
return () => {
editorRef.current?.destroy();
editorRef.current = null;
};
}, []);
return <div ref={ref} />;
}React
Baue einen GrapesJS-Editor in einer React-Anwendung.
React-LeitfadenNext.js
Integrieren Sie GrapesJS mit einer Next.js-Anwendung und einer clientseitigen Editor-Architektur.
Next.js-LeitfadenVue
Füge GrapesJS zu einer Vue-Anwendung hinzu.
Vue-LeitfadenAngular
Integriere GrapesJS mit Angular.
Angular-LeitfadenVanilla JavaScript
Beginne mit dem Kern-GrapesJS API – kein Framework, kein Wrapper, kein Build-Schritt erforderlich.
Offizielle DokumenteEin Hinweis, der alle auf einem server-gerenderten Framework trifft: GrapesJS berührt das Fenster, wenn das Modul geladen wird, sodass der Editor nur auf dem Client importiert werden muss. Der Next.js-Guide behandelt genau das.
Ein Produktionseditor benötigt in der Regel mehr als grapesjs.init(). Nicht, weil die Bibliothek unvollständig ist – sondern weil ein Editor eine Produktschicht ist und die umliegenden Schichten deine.
Ein typischer Produktionsstack
Nichts weiter unten ist eine Kritik an GrapesJS – es ist ein Editor-Framework, und hier sollte es aufhören. Die Zeile vor Beginn zu kennen, verhindert, dass ein dreiwöchiger Build zu einem neunmonatigen wird.
Acht davon gehören direkt dir. Das ist die ehrliche Form des Werks, und es ist die gleiche Form, egal welchen visuellen Editor du wählst.
Der Kern ist bei allen gleich. Was sich unterscheidet, ist die Schicht darum herum – und jede davon hat ihren eigenen Leitfaden.
Baue einen visuellen Editor für Marketingseiten.
Landingpage-BuilderLass deine Kunden Seiten in deiner Anwendung erstellen.
SaaS-Page-BuilderRüste ein bestehendes Produkt mit visueller Bearbeitung nach.
Einbettbarer EditorBaue Workflows für die E-Mail-Erstellung.
E-Mail-BuilderBaue dein eigenes, gebrandetes Page-Building-Erlebnis.
White-Label-BuilderRüste ein Headless-CMS mit visueller Bearbeitung nach.
Headless-CMS-EditorJede einzelne davon kommt aus derselben Perspektive: den Editor als Produkt und nicht als eine einzige Schicht davon zu behandeln.
Du fügst einem Paletteneintrag Verhalten hinzu und fragst dich, warum das Objekt erst einmal auf der Leinwand passiert.
Ein Block erzeugt nur Dinge. Alles Verhalten – traits, Sperrungen, Rendering, Validierung – gehört zu dem von ihm erstellten Komponententyp.
Der Standardspeicher schreibt in localStorage. Es sieht so aus, als würde man speichern, bis ein Leser das Gerät wechselt, den Browser löscht oder dasselbe Projekt in zwei Tabs öffnet.
Entscheide, wo die Projekte wirklich stehen, bevor jemand Inhalte produziert, und setze storageManager: falsch, bis du es getan hast.
Die Arbeit bleibt stillschweigend in einem nie entworfenen Store bestehen, und die Load Order wird unvorhersehbar, sobald mehrere Projekte existieren.
Konfigurieren Sie den Remote-Speicher, registrieren Sie einen benutzerdefinierten oder speichern Sie das Laufwerk und laden Sie sich selbst mit getProjectData() und loadProjectData().
Vierzig nahezu identische Typen, jeder mit seinem eigenen traits und einer Farbpalette, die niemand navigieren kann.
Bevorzuge einen Typ mit traits gegenüber fünf Typen, die sich durch eine Farbe unterscheiden. Verlängere eingebaute Typen, anstatt sie neu zu bauen.
Autoren greifen nach Float, absoluter Positionierung und 13px-Rändern, und jede Seite entfernt sich weiter vom Designsystem.
Listen Sie Ihre Sektoren explizit auf und verwenden Sie stylable / unstylable pro Komponente. Weniger Steuerungen erzeugen bessere Seiten.
Wochen verloren bei der Suche nach Nutzern, Rollen, Workflow- und Veröffentlichungsfunktionen, die nie da waren.
Lies zuerst die Verantwortungsaufteilung in Schritt 12. GrapesJS ist die Bearbeitungsebene; die CMS darum herum ist dein Produkt.
Da kein Upload konfiguriert ist, werden die Bilder als base64 eingebettet und das gespeicherte Projekt wächst, bis es langsam lädt und umständlich zu bewegen ist.
Verdrahte den Asset Manager am ersten Tag an den echten Speicher, auch wenn dieser Speicher ein Ordner auf der Festplatte ist.
Du hast einen Editor, der speichert, und keine Antwort auf die Frage: "Wie wird das zu einer Seite, die ein Besucher öffnen kann?"
Skizziere die Pipeline von Schritt 8 an, bevor du den Editor baust. Das ändert in der Regel das, was du speicherst.
Eine einzelne Datei mit 2.000 Zeilen, die Blöcke, Typen, Panels und Befehle registriert und nicht wiederverwendet oder in Teilen getestet werden kann.
Ein Plugin pro Organisation. Sie komponieren, und jedem kann Optionen angeboten werden.
Seiten, die direkt auf der Desktop-Leinwand aussehen und auf einem Handy brechen, mit Hunderten reiner Desktop-Regeln, die bereits geschrieben sind.
Wechsle die Geräte während des Baus. Styles werden pro Gerät geschrieben, also baut das Authoring mit einer Breite diese Breite ein.
Die fünf Dinge, die bei einem ersten Build am ehesten schiefgehen könnten, und was man bei jedem überprüfen sollte.
Meistens ein Befestigungsproblem und kein GrapesJS-Problem.
Prüfe
Es sind zwei verschiedene Stylesheets beteiligt, und es ist einfach, keines von beiden zu laden.
Prüfe
Hören Sie auf storage:error – GrapesJS meldet Ausfälle, anstatt sie zu schlucken.
Prüfe
Fast immer ein Lebenszyklusproblem, kein GrapesJS-Problem.
Prüfe
GrapesJS berührt das Fenster, wenn das Modul ausgewertet wird, daher kann es während des Serverrenderings nicht importiert werden.
Prüfe
Wohin man gehen soll, sobald der oben beschriebene Editor Sinn macht, ungefähr nach Schwierigkeitsgrad.
Die Kernschleife: Einen Editor auf den Bildschirm bringen und Dinge hineinfügen.
Den Editor zu deinem eigenen machen: benutzerdefinierte Typen, Plugins, Speicher und Werkzeuge.
Alles rund um den Editor: Architektur, Mietverhältnisse, Verlagswesen und Produktion.
Diese Seite ist das Build: installieren, konfigurieren, erweitern, ausliefern. Der vollständige Leitfaden ist die Referenz – die Architektur, das Ökosystem und die Begründung hinter dem Design. Die meisten Leute lesen am Ende beides, in dieser Reihenfolge.
Lies den vollständigen LeitfadenDer Großteil dieses Tutorials ist eine Tagesarbeit. Die darunterliegende Ebene – Speicher, Mandanten, Veröffentlichung, ein Editor, der zu deinem Designsystem passt – ist der Ort, an dem Projekte lang werden. GJS.Market kann diesen Teil übernehmen.
Beginne mit dem Kerneditor, passe ihn für dein Produkt an und erweitere ihn mit Plugins und Integrationen, wenn du mehr Funktionalität brauchst.
Installiere GrapesJS und lasse in den nächsten zehn Minuten einen Editor laufen.
Geh zu Schritt 1Blöcke, Komponenten, Speicher und Asset-Anbieter aus dem GJS.Market-Katalog.
Plugins durchsuchenIndividuelle Komponenten, Speicherintegration und Produktionsarchitektur, erledigt mit dir.
Sprich mit unsAlle Proben auf dieser Seite wurden mit GrapesJS 0.23.6 auf 2026-09-03 abgeglichen.