शुरुआती
कोर लूप: स्क्रीन पर एक संपादक प्राप्त करें और उसमें चीजें डालें।
चरण दर चरण GrapesJS सीखें। अपना पहला विज़ुअल एडिटर बनाएं, ब्लॉक और कस्टम घटक जोड़ें, शैलियों और संपत्तियों को कॉन्फ़िगर करें, प्रोजेक्ट सहेजें, HTML/CSS निर्यात करें, प्लगइन्स इंस्टॉल करें, और GrapesJS को React, Vue, Angular या Next.js के साथ एकीकृत करें।
GrapesJS कोर BSD-3-Clause लाइसेंस के तहत प्रकाशित किया गया है; आधिकारिक React रैपर @grapesjs/react MIT है। दोनों व्यावसायिक उपयोग की अनुमति देते हैं। नीचे दिए गए प्रत्येक उदाहरण को GrapesJS 0.23.6 के विरुद्ध जांचा गया था।
इस ट्यूटोरियल के अंत तक, आपके पास एक कार्यशील ड्रैग-एंड-ड्रॉप विज़ुअल एडिटर होगा जो पेज बना सकता है, घटकों को संपादित कर सकता है, शैलियों और संपत्तियों का प्रबंधन कर सकता है, परियोजनाओं को सहेज सकता है, और परिणामी HTML और CSS निर्यात कर सकता है।
अनुमानित सीखने का मार्ग
शुरुआती → इंटरमीडिएट → उत्पादन
इसमें कितना समय लगता है यह पूरी तरह से इस बात पर निर्भर करता है कि आपके उत्पाद को कितनी उत्पादन परत की आवश्यकता है। चरण 1-6 एक दोपहर है; चरण 7-12 काम हैं।
आधिकारिक GrapesJS डेमो खोलेंबहुत कम। यदि आप हाथ से एक पृष्ठ लिख सकते हैं, तो आप इसका पालन कर सकते हैं।
आपको एक टैग, एक वर्ग और एक CSS संपत्ति को पहचानना चाहिए। GrapesJS संपादन HTML और CSS - इससे अधिक विदेशी कुछ भी नहीं।
एक ऑब्जेक्ट शाब्दिक और एक फ़ंक्शन को पढ़ने के लिए पर्याप्त है। यहां हर उदाहरण सादा जावास्क्रिप्ट है।
केवल तभी जब आप npm से इंस्टॉल करते हैं। चरण 1 में CDN मार्ग को टेक्स्ट एडिटर और ब्राउज़र के अलावा और कुछ नहीं चाहिए।
आपको किसी पिछले GrapesJS अनुभव की आवश्यकता नहीं है, और आपको किसी ढांचे की आवश्यकता नहीं है। React, Vue, Angular और Next.js को चरण 11 में कवर किया गया है, कोर स्पष्ट होने के बाद।
यदि आपके पास किसी भी प्रकार का निर्माण चरण है तो यह मार्ग है। यह संपादक और उसकी स्टाइलशीट को आपके प्रोजेक्ट में स्थापित करता है; रनटाइम पर किसी तृतीय-पक्ष होस्ट से कुछ भी प्राप्त नहीं किया जाता है।
npm install grapesjsकोई बिल्ड टूलींग नहीं: एक HTML फ़ाइल में दो टैग और आपके पास एक संपादक है। पहली नज़र या प्रोटोटाइप के लिए बिल्कुल सही। आपके द्वारा शिप की जाने वाली किसी भी चीज़ के लिए, नवीनतम रिलीज़ को ट्रैक करने के बजाय एक सटीक संस्करण पिन करें।
<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>संपादक कोर
कैनवास, घटक वृक्ष, ड्रैग-एंड-ड्रॉप, पूर्ववत करें/फिर से करें, पैनल और ब्लॉक, शैलियों, संपत्ति, traits, परतों और भंडारण के लिए प्रबंधक।
एक स्टाइलशीट
grapesjs/dist/css/grapes.min.css - संपादक का अपना क्रोम। इसके बिना आपको एक कार्यशील संपादक मिलता है जो टूटा हुआ दिखता है।
कोई ब्लॉक नहीं
कोर एक खाली ब्लॉक पैलेट भेजता है। परिचित कॉलम/टेक्स्ट/इमेज ब्लॉक एक प्लगइन से आते हैं, जो चरण 3 है।
कोई बैकएंड नहीं
कोई खाता नहीं, कोई डेटाबेस नहीं, कोई होस्टिंग नहीं। GrapesJS ब्राउज़र में चलता है और आपके एप्लिकेशन को डेटा देता है, जो चरण 7 है।
यह एक क्लाइंट-साइड घटक है। आपका एप्लिकेशन उपयोगकर्ता को प्रमाणित करता है, यह तय करता है कि कौन सा प्रोजेक्ट खोलना है, संपादक को DOM तत्व में माउंट करता है, और सहेजे जाने पर प्रोजेक्ट डेटा वापस प्राप्त करता है। संपादक के ऊपर और नीचे सब कुछ आपका है।
<!-- 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,
});एक तीन-भाग इंटरफ़ेस: बीच में कैनवास, पैनल स्विचर ऊपर दाईं ओर, और - एक बार जब आप चरण 3 में ब्लॉक जोड़ लेते हैं - एक पैलेट से खींचने के लिए। इस खंड के ऊपर का संपादक बिल्कुल यही कॉन्फ़िगरेशन है जिसमें छह ब्लॉक और तीन डिवाइस चौड़ाई जोड़ी गई है।
लाइव डेमो खोलेंBlock
एक पैलेट प्रविष्टि। यह केवल पैनल में मौजूद है और क्या बनाना है इसके लिए एक नुस्खा रखता है। इसमें एक लेबल, एक श्रेणी, एक आइकन और सामग्री है।
घटक
कैनवास में एक नोड। इसका एक प्रकार, विशेषताएँ, शैलियाँ, बच्चे हैं, और यह वही है जो निर्यात और सहेजा जाता है।
एक ब्लॉक वह है जो उपयोगकर्ता कैनवास में खींचता है। एक बार गिराए जाने के बाद, यह संपादक के अंदर घटक बनाता है। एक ब्लॉक घटकों का एक पूरा सबट्री बना सकता है - और एक ही ब्लॉक दो बार गिराया गया दो स्वतंत्र सबट्री बनाता है।
// 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' },
});यह लगभग सभी को आश्चर्यचकित करता है। एक आउट-ऑफ-द-बॉक्स GrapesJS संपादक में एक खाली पैलेट होता है - परिचित "1 कॉलम/2 कॉलम/टेक्स्ट/इमेज" सेट जो प्रत्येक स्क्रीनशॉट में दिखाई देता है, grapesjs-blocks-basic या प्रीसेट में से एक से आता है। आप या तो ऊपर दिए गए अनुसार अपने स्वयं के ब्लॉक लिखते हैं, या एक प्रीसेट जोड़ते हैं।
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 })],
});एक विशिष्ट उपवृक्ष
// 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'],
},
],
},
});घटक संरचना
क्या मौजूद है, क्या शामिल है, क्या जोड़ा या हटाया जा सकता है। घटक प्रकार, droppable, draggable और removable के साथ नियंत्रित।
कंपोनेंट स्टाइलिंग
एक घटक कैसा दिख सकता है। Style Manager कॉन्फ़िगरेशन के साथ और घटक पर stylable/unstylable के साथ नियंत्रित।
// 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.न तो अपलोड और न ही uploadFile कॉन्फ़िगर किए जाने के साथ, GrapesJS प्रोजेक्ट में ड्रॉप की गई छवियों को बेस 64 के रूप में एम्बेड करता है। यह तुरंत काम करता है, और यह संग्रहीत प्रोजेक्ट को तब तक फुलाता है जब तक कि यह लोड करने में धीमा और स्थानांतरित करने के लिए महंगा न हो जाए। किसी को भी सामग्री का उत्पादन शुरू करने से पहले Asset Manager को वास्तविक भंडारण से कनेक्ट करें।
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 संपादक और प्रोजेक्ट डेटा परत प्रदान करता है, लेकिन आपका एप्लिकेशन यह तय करता है कि उत्पादन डेटा कहाँ संग्रहीत किया जाता है। कौन सा उपयोगकर्ता एक परियोजना का मालिक है, यह किस किरायेदार से संबंधित है, इसे कौन खोल सकता है, आप कितने संशोधन रखते हैं, जब इसका बैकअप लिया जाता है - इनमें से कोई भी पुस्तकालय में नहीं है, और इसमें से कोई भी नहीं होना चाहिए।
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() <body> में लपेटता है
रैपर घटक को शरीर तत्व के रूप में निर्यात किया जाता है। यदि आप एक टुकड़े को सहेज रहे हैं, तो उसके चारों ओर टेम्पलेट करें या इसे पट्टी करें - यह न मानें कि आपको एक नंगे अनुभाग वापस मिलता है।
getCss() में संपादक का रीसेट शामिल है
GrapesJS कैनवास के लिए एक छोटी संरक्षित स्टाइलशीट भेजता है। पास avoidProtected: सच है जब आप केवल CSS चाहते हैं जो आपके पाठक ने वास्तव में बनाया है।
एक विशिष्ट प्रकाशन पाइपलाइन
getHtml() और getCss() आपको वही देते हैं जो विज़िटर देखते हैं। getProjectData() आपको वह देता है जिसे लेखक संपादित करना जारी रख सकता है। प्रोजेक्ट स्टोर करें; इससे पेज को पुनः उत्पन्न करें। केवल HTML को संग्रहीत करने का मतलब है कि अगला संपादन लेखक द्वारा बनाए गए दस्तावेज़ के बजाय पार्स किए गए मार्कअप से शुरू होता है।
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' })]क्या आपको ऐसी कार्यक्षमता की आवश्यकता है जो आपके आधार संपादक में शामिल न हो? GJS.Market के माध्यम से उपलब्ध प्लगइन्स और एक्सटेंशन का अन्वेषण करें। नीचे कैटलॉग से वास्तविक लिस्टिंग दी गई हैं, जिन्हें वे किस चरण से संबंधित हैं, इसके आधार पर समूहीकृत किया गया है।
GJS.Market कैटलॉग से वास्तविक लिस्टिंग, ट्यूटोरियल के उस हिस्से द्वारा समूहीकृत की जाती है जिसे वे विस्तारित करते हैं। यहां कुछ भी कोर को प्रतिस्थापित नहीं करता है - प्रत्येक एक सीम भरता है जिसे कोर जानबूझकर खुला छोड़ देता है।
चरण 3 - हर ब्लॉक को हाथ से लिखने के बजाय शुरू करने के लिए एक पैलेट।
श्रेणी ब्राउज़ करेंस्टार्टर पैलेट चरण 3 कहता है कि कोर गायब है: मुट्ठी भर बुनियादी ब्लॉक, आपके लिए पंजीकृत।
एक वेब-पेज प्रीसेट - ब्लॉक, पैनल और एक प्लगइन में एक समझदार डिफ़ॉल्ट कॉन्फ़िगरेशन, बजाय उन्हें स्वयं इकट्ठा करने के।
Bootstrap 5 लेआउट ब्लॉक, यदि आपका उत्पाद पहले से ही Bootstrap शिप करता है और संपादक को समान मार्कअप का उत्पादन करना चाहिए।
तैयार उत्तरदायी Tailwind ब्लॉकों की एक लाइब्रेरी, उन टीमों के लिए जिनकी डिज़ाइन प्रणाली पहले से ही Tailwind कक्षाएं हैं।
एक टैब घटक प्रकार, इसके ब्लॉक के साथ पूरा - चरण 10 कवर सब कुछ का एक काम किया उदाहरण।
स्वाइपर पर निर्मित एक टच-सक्षम स्लाइडर ब्लॉक, जो लगभग हर पेज बिल्डर को अंततः आवश्यक घटकों में से एक है।
प्रपत्र घटक और ब्लॉक: इनपुट, textarea, चयन, चेकबॉक्स, रेडियो और बटन, वास्तविक घटक प्रकार के रूप में वायर्ड.
एक मोडल में एक आइकॉनिफाई पिकर के साथ एक आइकन घटक - एक विशेषता के लिए एक अच्छा मॉडल जो कस्टम UI खोलता है।
चरण 6 और 7 - कहीं न कहीं परियोजनाओं और अपलोड के लिए जीने के लिए।
श्रेणी ब्राउज़ करेंएक IndexedDB संग्रहण आवरण: चरण 7 से एक ही संग्रहण प्रबंधक अनुबंध, ब्राउज़र के अपने डेटाबेस द्वारा समर्थित।
एक Firestore स्टोरेज रैपर, यदि आप सेव एंडपॉइंट बनाने के बजाय संपादक को होस्ट किए गए डेटाबेस पर इंगित करना चाहते हैं।
डिफ़ॉल्ट अपलोडर को Cloudinary — चरण 6 से uploadFile हुक के साथ बदल देता है, जो पहले से ही लिखा गया है।
Asset Manager के अपलोडर को Filestack के लिए स्वैप करता है, उन टीमों के लिए जो पहले से ही अपने बाकी अपलोड के लिए इसका उपयोग करती हैं।
इनलाइन मोड में अंतर्निहित समृद्ध टेक्स्ट एडिटर को CKEditor 5 में स्वैप करता है। CKEditor स्वयं अपने विक्रेता द्वारा अलग से लाइसेंस प्राप्त है।
चयनित घटक के HTML और CSS को सीधे कैनवास पर संपादित करें - जब आप अभी भी पेड़ सीख रहे हों तो उपयोगी हो।
चरण 8 से निर्यात को डाउनलोड करने योग्य ज़िप में पैकेज करता है, जो कि सबसे तेज़ प्रकाशन पाइपलाइन है।
बिल्ट-इन रिच टेक्स्ट एडिटर में अधिक कार्रवाइयां, एक पूर्ण तृतीय-पक्ष संपादक को खींचे बिना।
एक उत्पाद कार्ड, एक घटक प्रकार के रूप में
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' });
},
},
});एक SaaS एप्लिकेशन उत्पाद-विशिष्ट घटकों को उजागर कर सकता है - वास्तविक योजनाओं से जुड़ी एक मूल्य निर्धारण तालिका, एक SKU से बंधा एक उत्पाद कार्ड, एक बुकिंग विजेट - एक सामान्य अप्रतिबंधित HTML संपादक के बजाय। लेखकों को कम विकल्प और बेहतर परिणाम मिलते हैं, और आपकी समर्थन कतार कभी भी एक ऐसे पृष्ठ को नहीं देखती है जिसे किसी ने आवारा फ्लोट के साथ तोड़ दिया हो।
चरण 3, 5 और 10 सबसे उपयोगी चीज़ में गठबंधन करते हैं जो आप GrapesJS के साथ कर सकते हैं: "कुछ भी संभव है" को "इन सात चीजें, ठीक से की गई" से बदलें। प्रत्येक तंत्र वह है जिसे आप पहले ही पूरा कर चुके हैं।
कस्टम ब्लॉक
पैलेट मेनू है। यदि यह शेल्फ पर नहीं है, तो कोई भी इसे जोड़ नहीं सकता है।
कस्टम घटक
प्रति ब्लॉक निश्चित संरचना, उन भागों के साथ जो संपादन योग्य चिह्नित संपादन योग्य होने चाहिए।
लक्षण
एक लेखक को मिलने वाली सेटिंग्स - एक शीर्षक, एक लिंक, एक संस्करण - कच्चे मार्कअप के बजाय।
Style Manager कॉन्फ़िगरेशन
केवल उन संपत्तियों को सूचीबद्ध करने वाले क्षेत्र जिन्हें आपका सिस्टम वास्तव में अनुमति देता है।
अनुमत शैलियाँ
stylable और unstylable प्रति घटक, इसलिए एक कार्ड रंग बदल सकता है लेकिन फ्लोट नहीं बन सकता है।
पुनः प्रयोज्य घटक
साझा किए गए टुकड़े जो प्रति पृष्ठ कॉपी किए जाने के बजाय सिंक में रहते हैं।
टेम्पलेट्स
प्रति पृष्ठ प्रकार एक प्रारंभिक दस्तावेज़, इसलिए कोई भी खाली कैनवास से शुरू नहीं होता है।
कस्टम UI
GrapesJS के पैनल बदले जा सकते हैं। एक उत्पाद संपादक शायद ही कभी डिफ़ॉल्ट जैसा दिखता है।
आपकी SaaS डिज़ाइन प्रणाली
GrapesJS को एक सामान्य संपादक से विशेष रूप से अपने उत्पाद के लिए डिज़ाइन किए गए संपादक में बदलें।
दो गाइड इस पर दो दिशाओं में आगे बढ़ते हैं:
GrapesJS एक सादे DOM तत्व में बदल जाता है, इसलिए "इसे एक ढांचे के साथ एकीकृत करना" एक प्रश्न पर आता है: कौन सा जीवनचक्र हुक init() कहता है, और किसे destroy() कहता है। नीचे दिया गया पैटर्न React है; समर्पित गाइड बाकी को कवर करते हैं, जिसमें वे हिस्से भी शामिल हैं जो वास्तव में ढांचा-विशिष्ट हैं।
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
एक GrapesJS एप्लिकेशन के अंदर एक React संपादक बनाएं।
React गाइडNext.js
GrapesJS को Next.js एप्लिकेशन और क्लाइंट-साइड एडिटर आर्किटेक्चर के साथ एकीकृत करें।
Next.js गाइडVue
GrapesJS को Vue एप्लिकेशन में जोड़ें।
Vue गाइडAngular
GrapesJS को Angular के साथ एकीकृत करें।
Angular गाइडवेनिला जावास्क्रिप्ट
कोर GrapesJS API से शुरू करें - कोई ढांचा नहीं, कोई आवरण नहीं, कोई निर्माण चरण की आवश्यकता नहीं है।
आधिकारिक दस्तावेज़एक चेतावनी जो सर्वर-रेंडर किए गए ढांचे पर सभी को पकड़ती है: मॉड्यूल लोड होने पर GrapesJS विंडो को छूता है, इसलिए संपादक को केवल क्लाइंट पर आयात करना पड़ता है। Next.js गाइड बिल्कुल यही कवर करता है।
एक प्रोडक्शन एडिटर को आमतौर पर grapesjs.init() से अधिक की आवश्यकता होती है। इसलिए नहीं कि लाइब्रेरी अधूरी है - क्योंकि एक संपादक एक उत्पाद की एक परत है, और उसके चारों ओर की परतें आपकी हैं।
एक विशिष्ट उत्पादन स्टैक
नीचे कुछ भी GrapesJS की आलोचना नहीं है - यह एक संपादक ढांचा है, और इसे रोकने के लिए यह सही जगह है। शुरू करने से पहले लाइन को जानना तीन सप्ताह के निर्माण को नौ महीने का बनने से रोकता है।
इनमें से आठ एकमुश्त आपके हैं। यह काम का ईमानदार आकार है, और यह वही आकार है जो भी दृश्य संपादक आप चुनते हैं।
इन सभी के लिए कोर समान है। इसके चारों ओर की परत क्या अलग है - और इनमें से प्रत्येक का अपना एक गाइड है।
मार्केटिंग पेजों के लिए एक विज़ुअल एडिटर बनाएं।
लैंडिंग पेज बिल्डरग्राहकों को आपके एप्लिकेशन के अंदर पेज बनाने दें।
SaaS पेज बिल्डरकिसी मौजूदा उत्पाद में विज़ुअल संपादन जोड़ें.
एम्बेड करने योग्य संपादकईमेल निर्माण वर्कफ़्लो बनाएँ.
ईमेल बिल्डरअपना खुद का ब्रांडेड पेज-बिल्डिंग अनुभव बनाएं।
व्हाइट-लेबल बिल्डरहेडलेस सामग्री सिस्टम में विज़ुअल संपादन जोड़ें।
हेडलेस CMS संपादकइनमें से हर एक एक ही स्थान से आता है: संपादक को उत्पाद के रूप में मानना, न कि इसकी एक परत के रूप में।
आप एक पैलेट प्रविष्टि में व्यवहार जोड़ते हैं और सोचते हैं कि आइटम कैनवास पर आने के बाद यह कुछ भी क्यों नहीं करता है।
एक ब्लॉक केवल चीजें बनाता है। सभी व्यवहार - traits, ताले, प्रतिपादन, सत्यापन - घटक प्रकार से संबंधित है जो इसे बनाता है।
डिफ़ॉल्ट संग्रहण localStorage को लिखता है। ऐसा लगता है कि जब तक कोई रीडर डिवाइस को स्विच नहीं करता, अपना ब्राउज़र साफ़ नहीं करता, या उसी प्रोजेक्ट को दो टैब में नहीं खोलता, तब तक सहेज रहा है।
तय करें कि कोई भी सामग्री बनाने से पहले प्रोजेक्ट वास्तव में कहां रहते हैं, और सेट करें storageManager: false जब तक आपके पास न हो।
चुपचाप एक स्टोर के लिए काम करता है जिसे आपने कभी डिज़ाइन नहीं किया है, और कई परियोजनाओं के अस्तित्व में होने के बाद लोड ऑर्डर अप्रत्याशित हो जाता है।
रिमोट स्टोरेज कॉन्फ़िगर करें, एक कस्टम रजिस्टर करें, या ड्राइव सेव करें और अपने आप को getProjectData() और loadProjectData() के साथ लोड करें।
चालीस लगभग समान प्रकार, प्रत्येक का अपना traits है, और एक पैलेट जिसे कोई भी नेविगेट नहीं कर सकता है।
एक रंग के आधार पर पांच प्रकारों की तुलना में traits के साथ एक प्रकार को प्राथमिकता दें। अंतर्निहित प्रकारों को पुनर्निर्माण करने के बजाय उनका विस्तार करें।
लेखक फ्लोट, पूर्ण स्थिति और 13px मार्जिन तक पहुंचते हैं, और प्रत्येक पृष्ठ डिज़ाइन सिस्टम से आगे बढ़ता है।
अपने क्षेत्रों को स्पष्ट रूप से सूचीबद्ध करें और प्रति घटक stylable/unstylable का उपयोग करें। कम नियंत्रण बेहतर पृष्ठ बनाते हैं।
उपयोगकर्ताओं की तलाश में सप्ताह, भूमिकाएं, वर्कफ़्लो और प्रकाशन सुविधाएँ जो कभी नहीं थीं।
पहले चरण 12 में जिम्मेदारी विभाजन पढ़ें। GrapesJS संपादन परत है; इसके चारों ओर CMS आपका उत्पाद है।
कोई अपलोड कॉन्फ़िगर नहीं किए जाने के कारण, छवियों को base64 के रूप में एम्बेड किया जाता है और संग्रहीत प्रोजेक्ट तब तक बढ़ता है जब तक कि यह लोड करने में धीमा न हो जाए और स्थानांतरित करने में अजीब न हो।
Asset Manager को पहले दिन वास्तविक भंडारण में तार करें, भले ही वह भंडारण डिस्क पर एक फ़ोल्डर हो।
आपके पास एक संपादक है जो सहेजता है और "यह एक पृष्ठ कैसे बन जाता है जिसे एक आगंतुक खोल सकता है?" का कोई जवाब नहीं है।
संपादक बनाने से पहले चरण 8 से पाइपलाइन को स्केच करें। यह आमतौर पर आपके द्वारा संग्रहीत की गई चीज़ों को बदल देता है।
एक एकल 2,000-लाइन फ़ाइल जो ब्लॉक, प्रकार, पैनल और कमांड पंजीकृत करती है, और भागों में पुनः उपयोग या परीक्षण नहीं किया जा सकता है।
प्रति चिंता एक प्लगइन। वे रचना करते हैं, और प्रत्येक को विकल्प दिए जा सकते हैं।
ऐसे पृष्ठ जो डेस्कटॉप कैनवास पर सही दिखते हैं और फ़ोन पर टूटते हैं, जिनमें सैकड़ों डेस्कटॉप-केवल नियम पहले से ही लिखे गए हैं.
निर्माण करते समय उपकरणों को स्विच करें। शैलियाँ प्रति डिवाइस लिखी जाती हैं, इसलिए एक चौड़ाई पर लेखन उस चौड़ाई को बेक करता है।
पहले निर्माण पर पांच चीजें गलत होने की सबसे अधिक संभावना है, और प्रत्येक के लिए क्या जांचना है।
आमतौर पर GrapesJS समस्या के बजाय एक बढ़ती समस्या।
जाँच
दो अलग-अलग स्टाइलशीट शामिल हैं और न तो लोड करना आसान है।
जाँच
storage:error GrapesJS को निगलने के बजाय विफलताओं की रिपोर्ट सुनें।
जाँच
लगभग हमेशा एक जीवनचक्र की समस्या होती है, GrapesJS नहीं।
जाँच
मॉड्यूल का मूल्यांकन होने पर GrapesJS विंडो को छूता है, इसलिए इसे सर्वर रेंडरिंग के दौरान आयात नहीं किया जा सकता है।
जाँच
ऊपर दिए गए संपादक के एक बार समझ में आने के बाद कहां जाना है, मोटे तौर पर कठिनाई के क्रम में।
कोर लूप: स्क्रीन पर एक संपादक प्राप्त करें और उसमें चीजें डालें।
संपादक को अपना बनाना: कस्टम प्रकार, प्लगइन्स, भंडारण और टूलींग।
संपादक के आसपास सब कुछ: वास्तुकला, किरायेदारी, प्रकाशन और उत्पादन।
यह पृष्ठ बिल्ड है: इंस्टॉल करें, कॉन्फ़िगर करें, विस्तार करें, शिप करें। पूरी गाइड संदर्भ है - वास्तुकला, पारिस्थितिकी तंत्र और डिजाइन के पीछे का तर्क। अधिकांश लोग उस क्रम में दोनों को पढ़ते हैं।
पूरी गाइड पढ़ेंइस ट्यूटोरियल का अधिकांश भाग एक दिन का काम है। इसके नीचे की परत - भंडारण, किरायेदारी, प्रकाशन, एक संपादक जो आपके डिजाइन सिस्टम से मेल खाता है - वह जगह है जहां परियोजनाएं लंबी हो जाती हैं। GJS.Market उस हिस्से को ले सकते हैं।
कोर संपादक से शुरू करें, इसे अपने उत्पाद के लिए अनुकूलित करें, और जब आपको अधिक कार्यक्षमता की आवश्यकता हो तो इसे प्लगइन्स और एकीकरण के साथ बढ़ाएं।
GrapesJS स्थापित करें और अगले दस मिनट में एक संपादक चालू करें।
चरण 1 पर जाएँGJS.Market कैटलॉग से ब्लॉक, घटक, भंडारण और परिसंपत्ति प्रदाता।
प्लगइन्स ब्राउज़ करेंकस्टम घटक, भंडारण एकीकरण और उत्पादन वास्तुकला, आपके साथ किया गया।
हमसे बात करोइस पृष्ठ पर सभी नमूनों की GrapesJS 0.23.6 पर 2026-09-03 के खिलाफ जाँच की गई थी।