चरण-दर-चरण ट्यूटोरियल

GrapesJS ट्यूटोरियल: अपना पहला विज़ुअल एडिटर बनाएं

चरण दर चरण GrapesJS सीखें। अपना पहला विज़ुअल एडिटर बनाएं, ब्लॉक और कस्टम घटक जोड़ें, शैलियों और संपत्तियों को कॉन्फ़िगर करें, प्रोजेक्ट सहेजें, HTML/CSS निर्यात करें, प्लगइन्स इंस्टॉल करें, और GrapesJS को React, Vue, Angular या Next.js के साथ एकीकृत करें।

  • ओपन-सोर्स एडिटर फ्रेमवर्क
  • स्व-मेजबानी योग्य
  • प्लगइन्स के साथ एक्स्टेंसिबल
  • कस्टम घटक
  • HTML/CSS निर्यात
  • React/Vue/Angular/वेनिला जेएस

GrapesJS कोर BSD-3-Clause लाइसेंस के तहत प्रकाशित किया गया है; आधिकारिक React रैपर @grapesjs/react MIT है। दोनों व्यावसायिक उपयोग की अनुमति देते हैं। नीचे दिए गए प्रत्येक उदाहरण को GrapesJS 0.23.6 के विरुद्ध जांचा गया था।

परिणाम

आप क्या बनाएंगे

इस ट्यूटोरियल के अंत तक, आपके पास एक कार्यशील ड्रैग-एंड-ड्रॉप विज़ुअल एडिटर होगा जो पेज बना सकता है, घटकों को संपादित कर सकता है, शैलियों और संपत्तियों का प्रबंधन कर सकता है, परियोजनाओं को सहेज सकता है, और परिणामी HTML और CSS निर्यात कर सकता है।

  • ब्लॉकों को कैनवास पर खींचें
  • घटकों का चयन करें और संपादित करें
  • Style Manager से कुछ भी रीस्टाइल करें
  • डेस्कटॉप, टैबलेट और फ़ोन की चौड़ाई के बीच स्विच करना
  • प्रोजेक्ट को JSON के रूप में वापस पढ़ें
  • पृष्ठ को HTML और CSS के रूप में निर्यात करें

अनुमानित सीखने का मार्ग

शुरुआती → इंटरमीडिएट → उत्पादन

इसमें कितना समय लगता है यह पूरी तरह से इस बात पर निर्भर करता है कि आपके उत्पाद को कितनी उत्पादन परत की आवश्यकता है। चरण 1-6 एक दोपहर है; चरण 7-12 काम हैं।

आधिकारिक GrapesJS डेमो खोलें
आवश्यक शर्तें

शुरू करने से पहले

बहुत कम। यदि आप हाथ से एक पृष्ठ लिख सकते हैं, तो आप इसका पालन कर सकते हैं।

बुनियादी HTML और CSS

आपको एक टैग, एक वर्ग और एक CSS संपत्ति को पहचानना चाहिए। GrapesJS संपादन HTML और CSS - इससे अधिक विदेशी कुछ भी नहीं।

मूल जावास्क्रिप्ट

एक ऑब्जेक्ट शाब्दिक और एक फ़ंक्शन को पढ़ने के लिए पर्याप्त है। यहां हर उदाहरण सादा जावास्क्रिप्ट है।

Node.js और npm

केवल तभी जब आप npm से इंस्टॉल करते हैं। चरण 1 में CDN मार्ग को टेक्स्ट एडिटर और ब्राउज़र के अलावा और कुछ नहीं चाहिए।

आपको किसी पिछले GrapesJS अनुभव की आवश्यकता नहीं है, और आपको किसी ढांचे की आवश्यकता नहीं है। React, Vue, Angular और Next.js को चरण 11 में कवर किया गया है, कोर स्पष्ट होने के बाद।

शुरुआती

1. GrapesJS स्थापित करें

GrapesJS एक लाइब्रेरी है जिसे आप अपने स्वयं के एप्लिकेशन में जोड़ते हैं, न कि वह सेवा जिसके लिए आप साइन अप करते हैं। इसमें दो तरीके हैं, और जो आप चुनते हैं उसका बाद के किसी भी चरण पर कोई प्रभाव नहीं पड़ता है।

npm से

यदि आपके पास किसी भी प्रकार का निर्माण चरण है तो यह मार्ग है। यह संपादक और उसकी स्टाइलशीट को आपके प्रोजेक्ट में स्थापित करता है; रनटाइम पर किसी तृतीय-पक्ष होस्ट से कुछ भी प्राप्त नहीं किया जाता है।

terminal
npm install grapesjs

एक CDN से

कोई बिल्ड टूलींग नहीं: एक HTML फ़ाइल में दो टैग और आपके पास एक संपादक है। पहली नज़र या प्रोटोटाइप के लिए बिल्कुल सही। आपके द्वारा शिप की जाने वाली किसी भी चीज़ के लिए, नवीनतम रिलीज़ को ट्रैक करने के बजाय एक सटीक संस्करण पिन करें।

index.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 है।

आपके आवेदन में GrapesJS कहां बैठता है

यह एक क्लाइंट-साइड घटक है। आपका एप्लिकेशन उपयोगकर्ता को प्रमाणित करता है, यह तय करता है कि कौन सा प्रोजेक्ट खोलना है, संपादक को DOM तत्व में माउंट करता है, और सहेजे जाने पर प्रोजेक्ट डेटा वापस प्राप्त करता है। संपादक के ऊपर और नीचे सब कुछ आपका है।

शुरुआती

2. अपना पहला GrapesJS संपादक बनाएं

सबसे छोटा उपयोगी GrapesJS एप्लिकेशन एक खाली तत्व और एक कॉल है। नीचे दिए गए दोनों ब्लॉकों को एक पृष्ठ में कॉपी करें और आपके पास एक कार्यशील संपादक होगा।
index.html
<!-- The editor takes over this element completely.
     Do not render anything inside it yourself. -->
<div id="gjs"></div>
एक तत्व। GrapesJS इसकी सामग्री को पूरी तरह से बदल देता है, इसलिए इसके अंदर कभी भी अपना UI प्रस्तुत न करें।
editor.js
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,
});
यहां पहले दिन दो विकल्प जानने लायक हैं: fromElement यह तय करता है कि संपादक कंटेनर के अंदर पहले से ही मार्कअप को अपनाता है या नहीं, और storageManager localStorage-समर्थित स्टोर पर डिफ़ॉल्ट है जो पाठक के ब्राउज़र में कैनवास को चुपचाप सहेजता है। अब इसे बंद करने से बाद में भूत की स्थिति की भ्रमित करने वाली मात्रा से बचा जा सकता है।

प्रत्येक भाग का क्या अर्थ है

कंटेनर
जिस तत्व में संपादक माउंट करता है - एक CSS चयनकर्ता या एक HTMLElement। इसे वास्तविक ऊंचाई दें, या संपादक शून्य पिक्सेल लंबा प्रदान करता है।
संपादक इंस्टेंस
init() क्या लौटाता है। इस ट्यूटोरियल में प्रत्येक API इसे लटका देता है, और इस पर destroy() कॉल करने से DOM और श्रोता रिलीज़ हो जाते हैं।
कैंवस
आपका पृष्ठ iframe अंदर संपादित किया गया है। क्योंकि यह एक वास्तविक iframe है, आपके पृष्ठ का CSS इसमें लीक नहीं हो सकता है, और इसका CSS लीक नहीं हो सकता है।
प्रारंभिक परियोजना
कैनवास किससे शुरू होता है - घटक और शैली विकल्प, या जो भी भंडारण परत लोड होती है।
कॉन्फ़िगरेशन
एक ही वस्तु। बाद के चरणों में प्रत्येक प्रबंधक को उस पर एक कुंजी से कॉन्फ़िगर किया गया है: blockManager, styleManager, assetManager, storageManager, deviceManager।

आपको क्या देखना चाहिए

एक तीन-भाग इंटरफ़ेस: बीच में कैनवास, पैनल स्विचर ऊपर दाईं ओर, और - एक बार जब आप चरण 3 में ब्लॉक जोड़ लेते हैं - एक पैलेट से खींचने के लिए। इस खंड के ऊपर का संपादक बिल्कुल यही कॉन्फ़िगरेशन है जिसमें छह ब्लॉक और तीन डिवाइस चौड़ाई जोड़ी गई है।

लाइव डेमो खोलें
शुरुआती

3. ड्रैग-एंड-ड्रॉप ब्लॉक

किसी भी कोड से पहले, एक अंतर। यह एक ही चीज है जो शुरुआती लोग अक्सर गलत हो जाते हैं, और यहां से सब कुछ इस पर निर्भर करता है।

Block

एक पैलेट प्रविष्टि। यह केवल पैनल में मौजूद है और क्या बनाना है इसके लिए एक नुस्खा रखता है। इसमें एक लेबल, एक श्रेणी, एक आइकन और सामग्री है।

घटक

कैनवास में एक नोड। इसका एक प्रकार, विशेषताएँ, शैलियाँ, बच्चे हैं, और यह वही है जो निर्यात और सहेजा जाता है।

एक ब्लॉक वह है जो उपयोगकर्ता कैनवास में खींचता है। एक बार गिराए जाने के बाद, यह संपादक के अंदर घटक बनाता है। एक ब्लॉक घटकों का एक पूरा सबट्री बना सकता है - और एक ही ब्लॉक दो बार गिराया गया दो स्वतंत्र सबट्री बनाता है।

एक स्टार्टर पैलेट

  • Hero
  • छवि
  • टेक्स्ट
  • घुंडी
  • दो कॉलम
  • संपर्क प्रपत्र
blocks.js
// 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' },
});
सामग्री या तो एक HTML स्ट्रिंग या एक घटक परिभाषा स्वीकार करती है। स्ट्रिंग्स शुरू करने का सबसे तेज़ तरीका है; ऑब्जेक्ट फॉर्म वह है जिसे आप चरण 10 में अपने स्वयं के घटक प्रकार होने के बाद स्विच करते हैं।

कोर जहाजों में कोई ब्लॉक नहीं है

यह लगभग सभी को आश्चर्यचकित करता है। एक आउट-ऑफ-द-बॉक्स GrapesJS संपादक में एक खाली पैलेट होता है - परिचित "1 कॉलम/2 कॉलम/टेक्स्ट/इमेज" सेट जो प्रत्येक स्क्रीनशॉट में दिखाई देता है, grapesjs-blocks-basic या प्रीसेट में से एक से आता है। आप या तो ऊपर दिए गए अनुसार अपने स्वयं के ब्लॉक लिखते हैं, या एक प्रीसेट जोड़ते हैं।

blocks-preset.js
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 })],
});
usePlugin() प्लगइन पंजीकृत करने का वर्तमान तरीका है। पुराने ट्यूटोरियल grapesjs.plugins.add() कहते हैं; कि API बहिष्कृत है और एक चेतावनी लॉग करता है।
शुरुआती

4. कॉम्पोनेंट्स GrapesJS समझें

कैनवास HTML की एक स्ट्रिंग नहीं है जिसे सेव करने पर पार्स GrapesJS है। यह घटक मॉडल का एक जीवित पेड़ है, और HTML उस पेड़ से उत्पन्न होता है। एक बार जब वह क्लिक करता है, तो बाकी API आश्चर्यजनक होना बंद हो जाता है।

शब्दावली

Component पेड़
कैनवास में प्रत्येक नोड एक घटक है, और प्रत्येक घटक में माता-पिता और बच्चे होते हैं। जड़ आवरण है।
Component प्रकार
अंतर्निहित प्रकारों में पाठ, छवि, लिंक, वीडियो, तालिका और एक सामान्य डिफ़ॉल्ट शामिल हैं। एक प्रकार यह तय करता है कि नोड कैसे व्यवहार करता है, प्रस्तुत करता है और निर्यात करता है।
नेस्टेड घटक
रोकथाम एक वास्तविक संबंध है, इंडेंटेशन नहीं। droppable और draggable नियंत्रित करते हैं कि क्या अंदर जा सकता है।
गुण
HTML विशेषताएँ — वर्ग, href, id, data-*। वे निर्यात किए गए मार्कअप में शब्दशः समाप्त हो जाते हैं।
गुण
मॉडल स्थिति जो HTML विशेषता नहीं है। संपादक को याद रखने की आवश्यकता वाली किसी भी चीज़ के लिए उपयोगी है लेकिन पृष्ठ को ले नहीं जाना चाहिए।
लक्षण
चयनित घटक के लिए सेटिंग पैनल. एक विशेषता डिफ़ॉल्ट रूप से एक विशेषता को संपादित करती है, या जब आप changeProp सेट करते हैं तो एक गुण।

एक विशिष्ट उपवृक्ष

  • wrapper, घोर देखिए। 0
  • Section, घोर देखिए। 1
  • Container, घोर देखिए। 2
  • Heading, घोर देखिए। 3
  • Button, घोर देखिए। 3
Layer Manager ठीक यही दिखाता है। कैनवास में एक नोड का चयन करना इसे पेड़ में चुनता है, और इसके विपरीत।
components.js
// 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'));
});
getWrapper() पेड़ की जड़ है। वहां से, components() आपको किसी भी नोड के बच्चे देता है - इस तरह प्रोडक्शन एडिटर में हर कस्टम पैनल, निर्यातक और सत्यापनकर्ता दस्तावेज़ को चलता है।
cta-button.js
// 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' },
          ],
        },
      ],
    },
  },
});
एक्सटेंड को मौजूदा प्रकार से सब कुछ विरासत में मिलता है और केवल वही ओवरराइड करता है जिसका आप नाम लेते हैं। यह लगभग हमेशा सही शुरुआती बिंदु होता है: एक लिंक जो एक लिंक की तरह व्यवहार करता है, शीर्ष पर आपका अपना traits होता है।
शुरुआती

5. Style Manager कॉन्फ़िगर करें

Style Manager जो कुछ भी चुना जाता है उसके लिए CSS नियम लिखता है। अपने डिफ़ॉल्ट पर छोड़ दिया गया है, यह आपके संपादक का उपयोग करने वाले किसी भी व्यक्ति को CSS का एक बड़ा टुकड़ा प्रदान करता है - जो एक डेवलपर टूल के लिए ठीक है और लगभग हर उत्पाद के लिए गलत है।

सेक्टर, और आमतौर पर उनमें क्या होता है

मुद्रण कला
फ़ॉन्ट-परिवार, फ़ॉन्ट-आकार, फ़ॉन्ट-वजन, रेखा-ऊंचाई, रंग, संरेखण।
रिक्ति
मार्जिन और पैडिंग, आमतौर पर दो गुण लेखक वास्तव में पहुंचते हैं।
आयाम
चौड़ाई, अधिकतम-चौड़ाई, ऊंचाई और उनके न्यूनतम/अधिकतम वेरिएंट।
सजावट
पृष्ठभूमि रंग और चित्र, सीमा त्रिज्या, सीमाएँ, छाया।
प्रतिसंवेदी
शैलियाँ प्रति डिवाइस लिखी जाती हैं। कैनवास को टैबलेट या फ़ोन पर स्विच करें और वही नियंत्रण इसके बजाय मीडिया क्वेरी में लिखता है।
कस्टम गुण
आप अपने स्वयं के संपत्ति प्रकारों को परिभाषित कर सकते हैं - एक टोकन पिकर, एक रिक्ति पैमाना - कच्चे CSS को उजागर करने के बजाय।
style-manager.js
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'],
      },
    ],
  },
});
सेक्टर दाहिने हाथ के पैनल में बंधनेवाला समूह हैं। उन्हें स्पष्ट रूप से नामकरण करना यह है कि आप "सभी CSS" को विकल्पों के एक छोटे, जानबूझकर सेट में कैसे बदल देते हैं।

संरचना और स्टाइल अलग-अलग प्रश्न हैं

घटक संरचना

क्या मौजूद है, क्या शामिल है, क्या जोड़ा या हटाया जा सकता है। घटक प्रकार, droppable, draggable और removable के साथ नियंत्रित।

कंपोनेंट स्टाइलिंग

एक घटक कैसा दिख सकता है। Style Manager कॉन्फ़िगरेशन के साथ और घटक पर stylable/unstylable के साथ नियंत्रित।

restricted-heading.js
// 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' },
    },
  },
});
एक घटक बच्चों को स्वीकार कर सकता है जबकि फिर से स्टाइल करने से इनकार कर सकता है। यह जोड़ी - खुली संरचना, बंद स्टाइल - एक डिज़ाइन-सिस्टम संपादक से बना है।
शुरुआती

6. छवियों और संपत्तियों का प्रबंधन करें

Asset Manager वह मोडल है जो तब खुलता है जब कोई पाठक किसी छवि पर डबल-क्लिक करता है। यह संपत्तियों को सूचीबद्ध करता है, अपलोड स्वीकार करता है, और चयनित घटक को एक URL वापस सौंपता है।

इसमें क्या शामिल है

छवि अपलोड
ड्रैग-एंड-ड्रॉप या फ़ाइल पिकर, आपके द्वारा चुने गए समापन बिंदु पर पोस्ट किया गया।
छवि URL
पाठक आपके द्वारा पहले से होस्ट की गई किसी भी चीज़ के लिए URL पेस्ट कर सकते हैं।
संपत्ति चयन
किसी छवि घटक पर डबल-क्लिक करने से पैनल खुल जाता है और चुने हुए src को वापस लिखता है।
कस्टम प्रदाता
अपलोड को पूरी तरह से uploadFile से बदलें और आप जो भी स्टोरेज उपयोग करते हैं उससे बात करें।
बाहरी भंडारण
S3, R2, Cloudinary, एक इन-हाउस DAM — GrapesJS को कभी भी यह जानने की आवश्यकता नहीं है कि बाइट्स कहाँ रहते हैं, केवल URL।
asset-manager.js
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,
  },
});
अपलोड सबसे तेज़ मार्ग है: इसे एक समापन बिंदु पर इंगित करें जो { डेटा: [ ... ] } के साथ उत्तर देता है और autoAdd सेट करता है। हेडर वह जगह है जहां आपका प्रमाणीकरण टोकन जाता है।
asset-upload.js
// 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 आपको कच्ची फ़ाइलें सौंपता है और रास्ते से हट जाता है। यह वह संस्करण है जिसके साथ अधिकांश उत्पादन संपादक समाप्त होते हैं, क्योंकि अपलोड को आमतौर पर हस्ताक्षर, आकार बदलने या किरायेदार उपसर्ग की आवश्यकता होती है।

एक बात जल्दी तय करनी है

न तो अपलोड और न ही uploadFile कॉन्फ़िगर किए जाने के साथ, GrapesJS प्रोजेक्ट में ड्रॉप की गई छवियों को बेस 64 के रूप में एम्बेड करता है। यह तुरंत काम करता है, और यह संग्रहीत प्रोजेक्ट को तब तक फुलाता है जब तक कि यह लोड करने में धीमा और स्थानांतरित करने के लिए महंगा न हो जाए। किसी को भी सामग्री का उत्पादन शुरू करने से पहले Asset Manager को वास्तविक भंडारण से कनेक्ट करें।

इंटरमीडिएट

7. GrapesJS प्रोजेक्ट सहेजें और लोड करें

Storage Manager तय करता है कि संपादन योग्य परियोजना कहाँ जाती है। यह डिफ़ॉल्ट रूप से चालू है और localStorage को लिखता है - यही कारण है कि आपके द्वारा कल बनाए गए संपादक में अभी भी कल का कैनवास है।

यह आपको क्या देता है

परियोजना JSON
संपूर्ण संपादन योग्य दस्तावेज़ - घटक, शैलियाँ, पृष्ठ, संपत्ति - एक सादे क्रमबद्ध वस्तु के रूप में।
स्वतः सेव
stepsBeforeSave के साथ प्रत्येक कीस्ट्रोक के बजाय संपादनों की एक निर्धारित संख्या के बाद सहेजें।
भार
init पर एक प्रोजेक्ट प्राप्त करें, या जब चाहें loadProjectData() स्वयं को कॉल करें।
सहेजें
autosave द्वारा, या अपने स्वयं के टूलबार बटन से editor.store() द्वारा ट्रिगर।
रिमोट स्टोरेज
एक अंतर्निहित फ़ेच-आधारित स्टोर: इसे एक लोड URL, एक स्टोर URL, हेडर और अनुरोध/प्रतिक्रिया एडेप्टर दें।
कस्टम भंडारण
GraphQL, एक ऑफ़लाइन कैश, या कुछ भी रिमोट कवर नहीं करने के लिए अपनी खुद की लोड/स्टोर जोड़ी पंजीकृत करें।
storage-manager.js
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,
      },
    },
  },
});
onStore और onLoad दो हुक हैं जो वास्तविक API में मायने रखते हैं: वे संपादक के पेलोड और आपके समापन बिंदु के अनुबंध को किसी भी पक्ष से समझौता किए बिना अलग-अलग होने देते हैं।
custom-storage.js
// 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 back
या Storage Manager को पूरी तरह से छोड़ दें। getProjectData() सादा JSON लौटाता है और loadProjectData() इसे वापस रखता है - बहुत सारे प्रोडक्शन संपादक ठीक यही करते हैं और अपने स्वयं के एप्लिकेशन स्थिति से बचत करते हैं।

जहां GrapesJS रुकता है

GrapesJS संपादक और प्रोजेक्ट डेटा परत प्रदान करता है, लेकिन आपका एप्लिकेशन यह तय करता है कि उत्पादन डेटा कहाँ संग्रहीत किया जाता है। कौन सा उपयोगकर्ता एक परियोजना का मालिक है, यह किस किरायेदार से संबंधित है, इसे कौन खोल सकता है, आप कितने संशोधन रखते हैं, जब इसका बैकअप लिया जाता है - इनमें से कोई भी पुस्तकालय में नहीं है, और इसमें से कोई भी नहीं होना चाहिए।

इंटरमीडिएट

8. निर्यात HTML और CSS

दो कॉल कैनवास को एक पृष्ठ में बदल देते हैं। वे कॉल हैं जो ऊपर दिए गए लाइव संपादक पर HTML और CSS बटन से जुड़े हुए हैं।
export.js
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() और getCss() वर्तमान दस्तावेज़ पढ़ें। न तो भंडारण को छूता है, और न ही इस बात से प्रभावित होता है कि आपने एक कॉन्फ़िगर किया है या नहीं।

दो चीजें जो हर किसी को हैरान कर देती हैं

getHtml() <body> में लपेटता है

रैपर घटक को शरीर तत्व के रूप में निर्यात किया जाता है। यदि आप एक टुकड़े को सहेज रहे हैं, तो उसके चारों ओर टेम्पलेट करें या इसे पट्टी करें - यह न मानें कि आपको एक नंगे अनुभाग वापस मिलता है।

getCss() में संपादक का रीसेट शामिल है

GrapesJS कैनवास के लिए एक छोटी संरक्षित स्टाइलशीट भेजता है। पास avoidProtected: सच है जब आप केवल CSS चाहते हैं जो आपके पाठक ने वास्तव में बनाया है।

एक विशिष्ट प्रकाशन पाइपलाइन

  1. GrapesJS
  2. HTML + CSS
  3. Your API
  4. Storage / CMS
  5. Published page
सटीक पाइपलाइन एप्लिकेशन-विशिष्ट है - कुछ उत्पाद एक स्थिर फ़ाइल लिखते हैं, कुछ प्रोजेक्ट के साथ एक रेंडर किए गए दस्तावेज़ को स्टोर करते हैं, कुछ हर अनुरोध पर प्रोजेक्ट JSON से सर्वर-साइड रेंडर करते हैं। GrapesJS का हिस्सा पहले तीर पर समाप्त होता है।

दो आउटपुट, दो नौकरियां

getHtml() और getCss() आपको वही देते हैं जो विज़िटर देखते हैं। getProjectData() आपको वह देता है जिसे लेखक संपादित करना जारी रख सकता है। प्रोजेक्ट स्टोर करें; इससे पेज को पुनः उत्पन्न करें। केवल HTML को संग्रहीत करने का मतलब है कि अगला संपादन लेखक द्वारा बनाए गए दस्तावेज़ के बजाय पार्स किए गए मार्कअप से शुरू होता है।

इंटरमीडिएट

9. प्लगइन्स के साथ GrapesJS बढ़ाएं

प्लगइन्स कोर एडिटर से परे GrapesJS का विस्तार करने के मुख्य तरीकों में से एक है। एक प्लगइन एक फ़ंक्शन से ज्यादा कुछ नहीं है जो संपादक इंस्टेंस प्राप्त करता है - कुछ भी आप अपने सेटअप कोड में कर सकते हैं, एक प्लगइन भी कर सकता है।
plugins.js
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, {}),
  ],
});
usePlugin() अपने विकल्पों के साथ एक प्लगइन पंजीकृत करता है। पुराने ट्यूटोरियल grapesjs.plugins.add() दिखाते हैं; कि API को वर्तमान संस्करणों में बहिष्कृत कर दिया गया है और आपको इसके बजाय इसका उपयोग करने के लिए एक चेतावनी लॉग करता है।
my-plugin.js
// 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' })]
एक लिखना संपादक को कॉन्फ़िगर करने के समान ही काम है, एक फ़ाइल में ले जाया गया जिसे आप परियोजनाओं में पुनः उपयोग कर सकते हैं। ब्लॉक, घटक प्रकार, आदेश, पैनल, traits और शैली क्षेत्र सभी अंदर से पंजीकृत किए जा सकते हैं।

या एक स्थापित करें

क्या आपको ऐसी कार्यक्षमता की आवश्यकता है जो आपके आधार संपादक में शामिल न हो? GJS.Market के माध्यम से उपलब्ध प्लगइन्स और एक्सटेंशन का अन्वेषण करें। नीचे कैटलॉग से वास्तविक लिस्टिंग दी गई हैं, जिन्हें वे किस चरण से संबंधित हैं, इसके आधार पर समूहीकृत किया गया है।

बाज़ार

आपके द्वारा अभी-अभी समाप्त किए गए चरणों के लिए प्लगइन्स

GJS.Market कैटलॉग से वास्तविक लिस्टिंग, ट्यूटोरियल के उस हिस्से द्वारा समूहीकृत की जाती है जिसे वे विस्तारित करते हैं। यहां कुछ भी कोर को प्रतिस्थापित नहीं करता है - प्रत्येक एक सीम भरता है जिसे कोर जानबूझकर खुला छोड़ देता है।

ब्लॉक और प्रीसेट

चरण 3 - हर ब्लॉक को हाथ से लिखने के बजाय शुरू करने के लिए एक पैलेट।

श्रेणी ब्राउज़ करें

अवयव

चरण 4 और 10 — घटक प्रकार जो किसी ने पहले ही बना और परीक्षण कर चुके हैं.

श्रेणी ब्राउज़ करें

भंडारण और संपत्ति

चरण 6 और 7 - कहीं न कहीं परियोजनाओं और अपलोड के लिए जीने के लिए।

श्रेणी ब्राउज़ करें

संपादन और निर्यात

चरण 8 और 9 — समृद्ध पाठ संपादन, कोड संपादन और निर्यात लक्ष्य।

श्रेणी ब्राउज़ करें
अग्रवर्ती

10. कस्टम घटक बनाएं

यह वह जगह है जहां एक GrapesJS संपादक एक सामान्य HTML संपादक बनना बंद कर देता है और आपके उत्पाद का हिस्सा बनना शुरू कर देता है। एक कस्टम घटक प्रकार एक नामित चीज़ है जिसे आपके लेखक अपनी संरचना, अपनी स्वयं की सेटिंग्स और अपने स्वयं के नियमों के साथ रख सकते हैं कि क्या बदला जा सकता है।

एक घटक प्रकार में क्या जाता है

प्रकार
एक नाम जिसे आप Components.addType के साथ पंजीकृत करते हैं, वैकल्पिक रूप से एक अंतर्निहित प्रकार का विस्तार करता है।
मॉडल
डिफ़ॉल्ट, बच्चे, विशेषताएँ, गुण और ताले droppable, draggable, removable, stylable।
लक्षण
सेटिंग्स जो आपका लेखक वास्तव में देखता है। changeProp किसी विशेषता के बजाय मॉडल को लिखता है।
दृश्य
वैकल्पिक। रेंडरिंग को तब ओवरराइड करें जब कैनवास को निर्यात किए गए मार्कअप के अलावा कुछ और दिखाने की आवश्यकता हो.
isComponent
कैसे GrapesJS आपके प्रकार को पहचानता है जब यह सहेजे गए HTML को वापस पेड़ में पार्स करता है।
एक ब्लॉक
पैलेट प्रविष्टि जो इसे बनाती है, सामग्री के साथ: { type: 'your-type' }.

एक उत्पाद कार्ड, एक घटक प्रकार के रूप में

  • Product Card, घोर देखिए। 0
  • Image, घोर देखिए। 1
  • Product Name, घोर देखिए। 1
  • Price, घोर देखिए। 1
  • CTA, घोर देखिए। 1
लेखक छवि, नाम, कीमत और बटन को संपादित करता है। वे कीमत को हटा नहीं सकते हैं, भागों को फिर से व्यवस्थित नहीं कर सकते हैं या कार्ड को किसी और चीज़ में बदल नहीं सकते हैं - क्योंकि droppable गलत है और बच्चे तय हो गए हैं।
product-card.js
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' });
    },
  },
});
नीचे के ताले दिलचस्प आधे हैं। droppable: असत्य कार्ड को कंटेनर बनने से रोकता है; stylable रेस्टलिंग को तीन गुणों तक सीमित करता है; traits लेखक को ठीक दो निर्णय देता है।

किसी उत्पाद के लिए यह क्यों मायने रखता है

एक SaaS एप्लिकेशन उत्पाद-विशिष्ट घटकों को उजागर कर सकता है - वास्तविक योजनाओं से जुड़ी एक मूल्य निर्धारण तालिका, एक SKU से बंधा एक उत्पाद कार्ड, एक बुकिंग विजेट - एक सामान्य अप्रतिबंधित HTML संपादक के बजाय। लेखकों को कम विकल्प और बेहतर परिणाम मिलते हैं, और आपकी समर्थन कतार कभी भी एक ऐसे पृष्ठ को नहीं देखती है जिसे किसी ने आवारा फ्लोट के साथ तोड़ दिया हो।

इसे एक साथ रखना

अपने डिज़ाइन सिस्टम के साथ एक नियंत्रित संपादक बनाएं

चरण 3, 5 और 10 सबसे उपयोगी चीज़ में गठबंधन करते हैं जो आप GrapesJS के साथ कर सकते हैं: "कुछ भी संभव है" को "इन सात चीजें, ठीक से की गई" से बदलें। प्रत्येक तंत्र वह है जिसे आप पहले ही पूरा कर चुके हैं।

कस्टम ब्लॉक

पैलेट मेनू है। यदि यह शेल्फ पर नहीं है, तो कोई भी इसे जोड़ नहीं सकता है।

कस्टम घटक

प्रति ब्लॉक निश्चित संरचना, उन भागों के साथ जो संपादन योग्य चिह्नित संपादन योग्य होने चाहिए।

लक्षण

एक लेखक को मिलने वाली सेटिंग्स - एक शीर्षक, एक लिंक, एक संस्करण - कच्चे मार्कअप के बजाय।

Style Manager कॉन्फ़िगरेशन

केवल उन संपत्तियों को सूचीबद्ध करने वाले क्षेत्र जिन्हें आपका सिस्टम वास्तव में अनुमति देता है।

अनुमत शैलियाँ

stylable और unstylable प्रति घटक, इसलिए एक कार्ड रंग बदल सकता है लेकिन फ्लोट नहीं बन सकता है।

पुनः प्रयोज्य घटक

साझा किए गए टुकड़े जो प्रति पृष्ठ कॉपी किए जाने के बजाय सिंक में रहते हैं।

टेम्पलेट्स

प्रति पृष्ठ प्रकार एक प्रारंभिक दस्तावेज़, इसलिए कोई भी खाली कैनवास से शुरू नहीं होता है।

कस्टम UI

GrapesJS के पैनल बदले जा सकते हैं। एक उत्पाद संपादक शायद ही कभी डिफ़ॉल्ट जैसा दिखता है।

आपकी SaaS डिज़ाइन प्रणाली

  • Hero
  • Feature Grid
  • Pricing
  • Testimonials
  • FAQ
  • CTA
  • Footer
सात ब्लॉक, प्रत्येक एक घटक प्रकार द्वारा समर्थित जिसे आप नियंत्रित करते हैं। एक लेखक इस शेल्फ से चुनता है और एक ऐसे पृष्ठ का उत्पादन नहीं कर सकता है जो ऑफ-ब्रांड हो, क्योंकि चुनने के लिए ऑफ-ब्रांड कुछ भी नहीं है।

GrapesJS को एक सामान्य संपादक से विशेष रूप से अपने उत्पाद के लिए डिज़ाइन किए गए संपादक में बदलें।

दो गाइड इस पर दो दिशाओं में आगे बढ़ते हैं:

एकीकरण

अपने ढांचे के साथ GrapesJS का उपयोग करना

GrapesJS एक सादे DOM तत्व में बदल जाता है, इसलिए "इसे एक ढांचे के साथ एकीकृत करना" एक प्रश्न पर आता है: कौन सा जीवनचक्र हुक init() कहता है, और किसे destroy() कहता है। नीचे दिया गया पैटर्न React है; समर्पित गाइड बाकी को कवर करते हैं, जिसमें वे हिस्से भी शामिल हैं जो वास्तव में ढांचा-विशिष्ट हैं।

Editor.tsx
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} />;
}
दो नियम जो हर ढांचे से बचते हैं: एक बार इनिशियलाइज़ करें, और बाद में फ्रेमवर्क को कंटेनर में फिर से रेंडर न होने दें। GrapesJS उस नोड का मालिक है।

एक चेतावनी जो सर्वर-रेंडर किए गए ढांचे पर सभी को पकड़ती है: मॉड्यूल लोड होने पर GrapesJS विंडो को छूता है, इसलिए संपादक को केवल क्लाइंट पर आयात करना पड़ता है। Next.js गाइड बिल्कुल यही कवर करता है।

स्‍थापत्‍यशैली

ट्यूटोरियल से उत्पादन तक

एक प्रोडक्शन एडिटर को आमतौर पर grapesjs.init() से अधिक की आवश्यकता होती है। इसलिए नहीं कि लाइब्रेरी अधूरी है - क्योंकि एक संपादक एक उत्पाद की एक परत है, और उसके चारों ओर की परतें आपकी हैं।

एक विशिष्ट उत्पादन स्टैक

  1. Your application
  2. Authentication
  3. GrapesJS editor
  4. Custom components / blocks
  5. Storage API
  6. Database / CMS
  7. Asset storage
  8. Publishing
GrapesJS इस आरेख के एक बैंड पर कब्जा कर लेता है। इसके ऊपर और नीचे सब कुछ एप्लिकेशन कोड है जिसे आप लिखते हैं, खरीदते हैं या पहले से ही रखते हैं।

आसपास की परतों को क्या जवाब देना है

प्रमाणीकरण
संपादन कौन कर रहा है, और संपादक की स्टोरेज कॉल इसे कैसे साबित करती है?
अनुमतियां
कौन किस पृष्ठ को संपादित कर सकता है, और कौन इसे प्रकाशित कर सकता है?
परियोजना का स्वामित्व
प्रोजेक्ट किस उपयोगकर्ता या टीम से संबंधित है, और जब वे चले जाते हैं तो क्या होता है।
बहु-किरायेदारी
एक ग्राहक की परियोजनाओं, परिसंपत्तियों और टेम्पलेट्स को दूसरे से दूर रखना।
स्वतः सेव
कितनी बार, असफल बचत पर क्या होता है, और पाठक विफल होने पर क्या देखता है।
टेम्पलेट्स
कोई नया पृष्ठ कहां से शुरू होता है और टेम्पलेट परिवर्तन पहले से बनाए गए पृष्ठों तक कैसे पहुंचता है.
संपत्ति भंडारण
अपलोड कहां जाते हैं, उनका नाम कैसे रखा जाता है और उन्हें लाने की अनुमति किसे है।
प्रकाशन-व्‍यवसाय
निर्यात किए गए HTML और CSS एक ऐसा पृष्ठ कैसे बन जाते हैं जिसे एक विज़िटर लोड कर सकता है।
त्रुटि प्रबंधन
एक सेव जो चुपचाप विफल हो जाता है वह सबसे खराब बग है जो एक संपादक के पास हो सकता है।
बैकअप
प्रोजेक्ट JSON छोटा है और अच्छी तरह से संपीड़ित करता है। इसे खोने का कोई बहाना नहीं है।
प्रतिभूति
कस्टम कोड ब्लॉक और चिपकाए गए HTML उपयोगकर्ता इनपुट हैं। बाहर निकलते समय सैनिटाइज करें।
प्रदर्शन
बड़ी परियोजनाएं, बड़ी संपत्ति सूची और लंबे पूर्ववत ढेर सभी की लागत मापने लायक है।
संस्करण
संशोधन, ड्राफ़्ट, और किसी द्वारा टूटे हुए पृष्ठ को वापस रोल करने की क्षमता।
विभाजन रेखा

GrapesJS जिम्मेदारियां बनाम आपके आवेदन की

नीचे कुछ भी GrapesJS की आलोचना नहीं है - यह एक संपादक ढांचा है, और इसे रोकने के लिए यह सही जगह है। शुरू करने से पहले लाइन को जानना तीन सप्ताह के निर्माण को नौ महीने का बनने से रोकता है।

आपका आवेदन
  • प्रमाणीकरणपुस्तकालय में नहीं, डिजाइन द्वारा।
  • भूमिकाएं और अनुमतियांकौन संपादित कर सकता है, कौन प्रकाशित कर सकता है।
  • परियोजना का स्वामित्वउपयोगकर्ता, टीम, स्थानांतरण, हटाना।
  • बहु-किरायेदारीग्राहकों के बीच अलगाव।
  • संस्करणड्राफ्ट, संशोधन, रोलबैक।
  • प्रकाशन-व्‍यवसायकिसी निर्यात को लाइव पेज में बदलना.
  • बैकअपप्रतिधारण और पुनर्स्थापना।
  • होस्टिंग और डोमेनDNS, प्रमाण पत्र, वितरण।
GrapesJS कोर
  • कैनवास का संपादनiframe, चयन, होवर, टूलबार।
  • खींचें और छोड़ेंघटकों को स्थानांतरित करना, घोंसला बनाना और पुनः व्यवस्थित करना।
  • घटक वृक्षप्रकार, बच्चे, विशेषताएँ, traits।
  • Style Managerचयन के लिए CSS नियम लिखना।
  • उत्तरदायी संपादनउपकरण और प्रति-ब्रेकपॉइंट शैलियाँ।
  • पूर्ववत करें और फिर से करेंकोर कमांड, कीबोर्ड डिफ़ॉल्ट रूप से बाध्य होता है।
  • परियोजना डेटादस्तावेज़ को क्रमबद्ध करना और पुनर्स्थापित करना।
  • HTML/CSS निर्यातgetHtml() और getCss()।
एक प्लगइन या आपका सेटअप कोड
  • ब्लॉक लाइब्रेरीकोर जहाज कोई नहीं - एक प्रीसेट, एक प्लगइन, या आपका।
  • रिच टेक्स्ट एडिटिंगएक न्यूनतम RTE जहाज; CKEditor/TinyMCE/Froala स्वैप इन।
  • एसेट पाइपलाइनपैनल जहाज; इसके पीछे का भंडारण नहीं करता है।
  • भंडारण एडाप्टरस्थानीय और दूरस्थ जहाज; आपका API आपका है।

इनमें से आठ एकमुश्त आपके हैं। यह काम का ईमानदार आकार है, और यह वही आकार है जो भी दृश्य संपादक आप चुनते हैं।

अपना रास्ता चुनें

आप क्या बना रहे हैं?

इन सभी के लिए कोर समान है। इसके चारों ओर की परत क्या अलग है - और इनमें से प्रत्येक का अपना एक गाइड है।

इनसे बचें

सामान्य GrapesJS गलतियाँ

इनमें से हर एक एक ही स्थान से आता है: संपादक को उत्पाद के रूप में मानना, न कि इसकी एक परत के रूप में।

  1. घटकों के साथ भ्रमित करने वाले ब्लॉक

    आप एक पैलेट प्रविष्टि में व्यवहार जोड़ते हैं और सोचते हैं कि आइटम कैनवास पर आने के बाद यह कुछ भी क्यों नहीं करता है।

    इसके बजाय ऐसा करें

    एक ब्लॉक केवल चीजें बनाता है। सभी व्यवहार - traits, ताले, प्रतिपादन, सत्यापन - घटक प्रकार से संबंधित है जो इसे बनाता है।

  2. ब्राउज़र स्थिति में सब कुछ संग्रहीत करना

    डिफ़ॉल्ट संग्रहण localStorage को लिखता है। ऐसा लगता है कि जब तक कोई रीडर डिवाइस को स्विच नहीं करता, अपना ब्राउज़र साफ़ नहीं करता, या उसी प्रोजेक्ट को दो टैब में नहीं खोलता, तब तक सहेज रहा है।

    इसके बजाय ऐसा करें

    तय करें कि कोई भी सामग्री बनाने से पहले प्रोजेक्ट वास्तव में कहां रहते हैं, और सेट करें storageManager: false जब तक आपके पास न हो।

  3. भंडारण को बिल्कुल भी कॉन्फ़िगर नहीं करना

    चुपचाप एक स्टोर के लिए काम करता है जिसे आपने कभी डिज़ाइन नहीं किया है, और कई परियोजनाओं के अस्तित्व में होने के बाद लोड ऑर्डर अप्रत्याशित हो जाता है।

    इसके बजाय ऐसा करें

    रिमोट स्टोरेज कॉन्फ़िगर करें, एक कस्टम रजिस्टर करें, या ड्राइव सेव करें और अपने आप को getProjectData() और loadProjectData() के साथ लोड करें।

  4. हर चीज़ के लिए एक घटक प्रकार बनाना

    चालीस लगभग समान प्रकार, प्रत्येक का अपना traits है, और एक पैलेट जिसे कोई भी नेविगेट नहीं कर सकता है।

    इसके बजाय ऐसा करें

    एक रंग के आधार पर पांच प्रकारों की तुलना में traits के साथ एक प्रकार को प्राथमिकता दें। अंतर्निहित प्रकारों को पुनर्निर्माण करने के बजाय उनका विस्तार करें।

  5. Style Manager को खुला छोड़ना

    लेखक फ्लोट, पूर्ण स्थिति और 13px मार्जिन तक पहुंचते हैं, और प्रत्येक पृष्ठ डिज़ाइन सिस्टम से आगे बढ़ता है।

    इसके बजाय ऐसा करें

    अपने क्षेत्रों को स्पष्ट रूप से सूचीबद्ध करें और प्रति घटक stylable/unstylable का उपयोग करें। कम नियंत्रण बेहतर पृष्ठ बनाते हैं।

  6. GrapesJS को पूर्ण CMS के रूप में मानना

    उपयोगकर्ताओं की तलाश में सप्ताह, भूमिकाएं, वर्कफ़्लो और प्रकाशन सुविधाएँ जो कभी नहीं थीं।

    इसके बजाय ऐसा करें

    पहले चरण 12 में जिम्मेदारी विभाजन पढ़ें। GrapesJS संपादन परत है; इसके चारों ओर CMS आपका उत्पाद है।

  7. परिसंपत्ति भंडारण की योजना नहीं बनाना

    कोई अपलोड कॉन्फ़िगर नहीं किए जाने के कारण, छवियों को base64 के रूप में एम्बेड किया जाता है और संग्रहीत प्रोजेक्ट तब तक बढ़ता है जब तक कि यह लोड करने में धीमा न हो जाए और स्थानांतरित करने में अजीब न हो।

    इसके बजाय ऐसा करें

    Asset Manager को पहले दिन वास्तविक भंडारण में तार करें, भले ही वह भंडारण डिस्क पर एक फ़ोल्डर हो।

  8. प्रकाशन वर्कफ़्लो को परिभाषित नहीं करना

    आपके पास एक संपादक है जो सहेजता है और "यह एक पृष्ठ कैसे बन जाता है जिसे एक आगंतुक खोल सकता है?" का कोई जवाब नहीं है।

    इसके बजाय ऐसा करें

    संपादक बनाने से पहले चरण 8 से पाइपलाइन को स्केच करें। यह आमतौर पर आपके द्वारा संग्रहीत की गई चीज़ों को बदल देता है।

  9. प्रत्येक अनुकूलन को एक प्लगइन में रखना

    एक एकल 2,000-लाइन फ़ाइल जो ब्लॉक, प्रकार, पैनल और कमांड पंजीकृत करती है, और भागों में पुनः उपयोग या परीक्षण नहीं किया जा सकता है।

    इसके बजाय ऐसा करें

    प्रति चिंता एक प्लगइन। वे रचना करते हैं, और प्रत्येक को विकल्प दिए जा सकते हैं।

  10. अंत तक उत्तरदायी व्यवहार को अनदेखा करना

    ऐसे पृष्ठ जो डेस्कटॉप कैनवास पर सही दिखते हैं और फ़ोन पर टूटते हैं, जिनमें सैकड़ों डेस्कटॉप-केवल नियम पहले से ही लिखे गए हैं.

    इसके बजाय ऐसा करें

    निर्माण करते समय उपकरणों को स्विच करें। शैलियाँ प्रति डिवाइस लिखी जाती हैं, इसलिए एक चौड़ाई पर लेखन उस चौड़ाई को बेक करता है।

समस्या निवारण

सामान्य समस्याएं

पहले निर्माण पर पांच चीजें गलत होने की सबसे अधिक संभावना है, और प्रत्येक के लिए क्या जांचना है।

संपादक प्रकट नहीं होता है

आमतौर पर GrapesJS समस्या के बजाय एक बढ़ती समस्या।

जाँच

  • कंटेनर तत्व इस समय DOM में मौजूद है init() चलता है।
  • कंटेनर की ऊंचाई होती है - एक शून्य-ऊंचाई तत्व शून्य-ऊंचाई संपादक प्रदान करता है।
  • GrapesJS स्टाइलशीट भरी हुई है; इसके बिना संपादक मौजूद है लेकिन अदृश्य है।
  • इनिशियलाइज़ेशन क्लाइंट पर चलता है, सर्वर रेंडरिंग के दौरान नहीं।

शैलियाँ गायब हैं या संपादक टूटा हुआ दिखता है

दो अलग-अलग स्टाइलशीट शामिल हैं और न तो लोड करना आसान है।

जाँच

  • grapesjs/dist/css/grapes.min.css संपादक के अपने क्रोम के लिए लोड किया गया है।
  • आपके पेज का CSS कैनवास पर भेज दिया जाता है — यह iframe होता है, इसलिए आपके ऐप की स्टाइलशीट स्वचालित रूप से उस तक नहीं पहुंचती है।
  • Style Manager में सेक्टर कॉन्फ़िगर किए गए हैं; एक खाली सेक्टर सरणी एक खाली पैनल प्रस्तुत करती है।
  • चयनित घटक को उस संपत्ति के लिए unstylable चिह्नित नहीं किया गया है जिसे आप ढूंढ रहे हैं।

प्रोजेक्ट सहेजता नहीं है

storage:error GrapesJS को निगलने के बजाय विफलताओं की रिपोर्ट सुनें।

जाँच

  • storageManager कॉन्फ़िगर किया गया है, और प्रकार एक भंडारण से मेल खाता है जो वास्तव में पंजीकृत है।
  • urlStore पहुंच योग्य है और सफलता की स्थिति लौटाता है।
  • क्रेडेंशियल्स और हेडर भेजे जा रहे हैं - रिमोट स्टोरेज डिफ़ॉल्ट क्रेडेंशियल्स को शामिल करने के लिए।
  • नेटवर्क पैनल में कोई CORS त्रुटि नहीं है; एक अवरुद्ध प्रीफ्लाइट बिल्कुल एक मूक विफलता की तरह दिखती है।

React में, संपादक डुप्लिकेट करता है या फिर से रेंडर करने पर मर जाता है

लगभग हमेशा एक जीवनचक्र की समस्या होती है, GrapesJS नहीं।

जाँच

  • init() एक बार चलता है, एक खाली निर्भरता सरणी के साथ प्रभाव में।
  • destroy() सफाई में चलता है - React 18 Strict Mode विकास में दो बार प्रभाव डालता है।
  • React init() के बाद कभी भी बच्चों को कंटेनर तत्व में प्रस्तुत नहीं करता है।

बिल्ड या सर्वर आयात पर क्रैश हो जाता है

मॉड्यूल का मूल्यांकन होने पर GrapesJS विंडो को छूता है, इसलिए इसे सर्वर रेंडरिंग के दौरान आयात नहीं किया जा सकता है।

जाँच

  • संपादक घटक केवल क्लाइंट-साइड लोड किया जाता है - SSR अक्षम के साथ गतिशील आयात, या एक प्रभाव के अंदर एक आयात।
  • स्टाइलशीट को सर्वर-रेंडर किए गए मॉड्यूल में आयात नहीं किया जाता है।
अगले चरण

सीखना जारी रखें GrapesJS

ऊपर दिए गए संपादक के एक बार समझ में आने के बाद कहां जाना है, मोटे तौर पर कठिनाई के क्रम में।

अग्रवर्ती

संपादक के आसपास सब कुछ: वास्तुकला, किरायेदारी, प्रकाशन और उत्पादन।

ट्यूटोरियल या संदर्भ?

यह पृष्ठ बिल्ड है: इंस्टॉल करें, कॉन्फ़िगर करें, विस्तार करें, शिप करें। पूरी गाइड संदर्भ है - वास्तुकला, पारिस्थितिकी तंत्र और डिजाइन के पीछे का तर्क। अधिकांश लोग उस क्रम में दोनों को पढ़ते हैं।

पूरी गाइड पढ़ें
सेवाएं

GrapesJS संपादक बनाने में सहायता चाहिए?

इस ट्यूटोरियल का अधिकांश भाग एक दिन का काम है। इसके नीचे की परत - भंडारण, किरायेदारी, प्रकाशन, एक संपादक जो आपके डिजाइन सिस्टम से मेल खाता है - वह जगह है जहां परियोजनाएं लंबी हो जाती हैं। GJS.Market उस हिस्से को ले सकते हैं।

  • कस्टम घटक
  • कस्टम प्लगइन्स
  • SaaS पेज बिल्डर्स
  • माइग्रेशन
  • एकीकरण
  • व्हाइट-लेबल संपादक
  • भंडारण और API एकीकरण
  • React/Next.js/Vue/Angular एकीकरण
  • उत्पादन वास्तुकला
FAQ

अक्सर पूछे जाने वाले प्रश्न

GrapesJS क्या है?

GrapesJS एक ओपन-सोर्स वेब बिल्डर फ्रेमवर्क है: एक ड्रैग-एंड-ड्रॉप विज़ुअल एडिटर जिसे आप अपने स्वयं के एप्लिकेशन में एम्बेड करते हैं। यह आपको एक कैनवास, एक घटक वृक्ष, एक स्टाइल मैनेजर, एक परिसंपत्ति प्रबंधक और एक निर्यात चरण देता है, और इसके आसपास के एप्लिकेशन के लिए खाते, भंडारण और प्रकाशन छोड़ देता है।

क्या GrapesJS मुफ़्त है?

हाँ। GrapesJS व्यावसायिक रूप से डाउनलोड करने और उपयोग करने के लिए स्वतंत्र है। कोई लाइसेंस शुल्क नहीं है, कोई सीट गिनती नहीं है और कोई होस्ट की गई सेवा नहीं है जिसे आपको खरीदना है - आप इसे स्वयं चलाते हैं। वैकल्पिक प्लगइन्स बाज़ार से भुगतान किया जा सकता है; संपादक स्वयं नहीं है।

क्या GrapesJS खुला स्रोत है?

हाँ। कोर BSD-3-Clause लाइसेंस के तहत प्रकाशित किया गया है, और आधिकारिक React रैपर @grapesjs/react MIT के तहत प्रकाशित किया गया है। दोनों व्यावसायिक उपयोग और संशोधन की अनुमति देते हैं। स्रोत GitHub पर है और पैकेज npm पर है।

मैं GrapesJS कैसे स्थापित करूं?

या तो एक बिल्ड चरण के साथ एक प्रोजेक्ट में npm install grapesjs, या एक सादे CDN फ़ाइल में HTML से दो टैग। दोनों आपको एक ही लाइब्रेरी देते हैं; CDN मार्ग को किसी टूलींग की आवश्यकता नहीं है। स्टाइलशीट के साथ-साथ स्क्रिप्ट को लोड करना याद रखें - इसके बिना संपादक रेंडर करता है लेकिन टूटा हुआ दिखता है।

मैं अपना पहला GrapesJS संपादक कैसे बनाऊं?

अपने पृष्ठ पर एक खाली तत्व जोड़ें, फिर grapesjs.init({ container: '#gjs' }) पर कॉल करें। वास्तव में बस इतना ही चाहिए। व्यवहार में आप ऊंचाई भी चाहते हैं, fromElement: गलत ताकि संपादक मौजूदा मार्कअप को न अपनाए, और storageManager: तब तक गलत जब तक आप यह तय नहीं कर लेते कि परियोजनाएं कहां रहेंगी।

GrapesJS Block क्या है?

एक Block पैलेट में एक प्रविष्टि है जिसे उपयोगकर्ता खींचता है। इसमें एक लेबल, एक श्रेणी, एक आइकन और बनाने के लिए सामग्री होती है। इसका अपना कोई व्यवहार नहीं है - यह केवल Components का उत्पादन करता है। GrapesJS कोर कोई ब्लॉक नहीं भेजता है: आप उन्हें लिखते हैं, या आप एक प्रीसेट प्लगइन जोड़ते हैं।

GrapesJS Component क्या है?

एक Component कैनवास में एक नोड है: एक प्रकार, विशेषताओं, शैलियों, बच्चों और traits वाला एक मॉडल। कैनवास Components का एक पेड़ है, और निर्यात किया गया HTML उस पेड़ से उत्पन्न होता है, न कि इसके विपरीत।

मैं एक कस्टम घटक कैसे बनाऊँ?

editor.Components.addType('my-type', { model, view }) पर कॉल करें, वैकल्पिक रूप से एक अंतर्निहित प्रकार का विस्तार करते हैं। मॉडल में डिफ़ॉल्ट, बच्चों, traits और ताले droppable, stylable, removable - होते हैं जो यह तय करते हैं कि एक लेखक क्या बदल सकता है। isComponent जोड़ें ताकि GrapesJS सहेजे गए HTML को पार्स करते समय प्रकार को पहचाने।

मैं कस्टम ब्लॉक कैसे जोड़ूँ?

editor.Blocks.add('मेरा-ब्लॉक', { लेबल, श्रेणी, मीडिया, सामग्री })। सामग्री या तो एक HTML स्ट्रिंग या एक घटक परिभाषा लेती है जैसे { प्रकार: 'मेरा प्रकार' }। ऑब्जेक्ट फॉर्म वह है जिसका उपयोग आप अपने स्वयं के घटक प्रकार होने के बाद करते हैं।

मैं GrapesJS परियोजनाओं को कैसे सहेजूं?

Storage Manager को प्रकार के साथ कॉन्फ़िगर करें: 'रिमोट' और लोड/स्टोर यूआरएल, editor.Storage.add() के साथ एक कस्टम स्टोरेज पंजीकृत करें, या इसे पूरी तरह से छोड़ दें और अपने कोड से getProjectData() और loadProjectData() पर कॉल करें। भंडारण डिफ़ॉल्ट रूप से चालू है और localStorage पर लिखता है, जो शायद ही कभी वह होता है जो आप उत्पादन में चाहते हैं।

मैं HTML और CSS कैसे निर्यात करूं?

editor.getHtml() और editor.getCss()। जानने योग्य दो बातें: getHtml() शरीर के तत्व में लिपटे कैनवास को लौटाता है, और getCss() में GrapesJS का अपना संरक्षित कैनवास रीसेट शामिल है जब तक कि आप avoidProtected पास नहीं कर लेते: सत्य।

क्या मैं GrapesJS के साथ React का उपयोग कर सकता हूँ?

हाँ। इसे एक खाली निर्भरता सरणी के साथ प्रभाव में प्रारंभ करें, इसे सफाई में नष्ट करें, और React को फिर कभी कंटेनर में प्रस्तुत न होने दें। एक आधिकारिक आवरण भी है, @grapesjs/react, यदि आप संपादक के UI को React घटकों के रूप में लिखना चाहते हैं।

क्या मैं GrapesJS के साथ Next.js का उपयोग कर सकता हूँ?

हां, एक चेतावनी के साथ: GrapesJS मॉड्यूल स्कोप पर विंडो को छूता है, इसलिए इसे केवल क्लाइंट पर लोड किया जाना चाहिए - सर्वर रेंडरिंग अक्षम के साथ एक गतिशील आयात, या एक प्रभाव के अंदर एक आयात। बाकी सब कुछ सादे React के समान है।

क्या मैं GrapesJS का उपयोग Vue या Angular के साथ कर सकता हूँ?

हाँ। GrapesJS एक सादे DOM तत्व में बदल जाता है, इसलिए यह किसी भी ढांचे के साथ काम करता है: माउंट हुक में init() और टियरडाउन हुक में destroy() को कॉल करें। कोई आधिकारिक Vue या Angular आवरण नहीं है - एकीकरण किसी भी तरह से कुछ पंक्तियाँ हैं।

क्या मैं GrapesJS के साथ SaaS पेज बिल्डर बना सकता हूँ?

हां, और यह इसे चुनने के सबसे आम कारणों में से एक है। GrapesJS संपादन परत की आपूर्ति करता है; आपका एप्लिकेशन खातों, अनुमतियों, किरायेदारी, भंडारण, टेम्पलेट और प्रकाशन की आपूर्ति करता है। शुरू करने से पहले यह जानना कि विभाजन एक छोटी परियोजना और एक लंबी परियोजना के बीच का अंतर है।

क्या मैं प्लगइन्स के साथ GrapesJS बढ़ा सकता हूँ?

हाँ। एक प्लगइन एक फ़ंक्शन है जो संपादक इंस्टेंस प्राप्त करता है, इसलिए यह ब्लॉक, घटक प्रकार, कमांड, पैनल, traits और स्टाइल सेक्टर पंजीकृत कर सकता है। प्लगइन्स को usePlugin() के साथ पंजीकृत करें; पुराना grapesjs.plugins.add() API बहिष्कृत है।

मुझे GrapesJS प्लगइन्स कहां मिल सकते हैं?

आधिकारिक तौर पर बनाए रखा प्लगइन्स npm संगठन के तहत GrapesJS पर रहते हैं। GJS.Market श्रेणी के अनुसार समुदाय और वाणिज्यिक प्लगइन्स को सूचीबद्ध करता है - ब्लॉक, घटक, भंडारण, संपत्ति, समृद्ध पाठ संपादक, प्रीसेट और डेवलपर टूल - और इस पृष्ठ पर प्रत्येक सूची इससे आती है।
आपका कदम

GrapesJS के साथ निर्माण के लिए तैयार हैं?

कोर संपादक से शुरू करें, इसे अपने उत्पाद के लिए अनुकूलित करें, और जब आपको अधिक कार्यक्षमता की आवश्यकता हो तो इसे प्लगइन्स और एकीकरण के साथ बढ़ाएं।

यहां से शुरू करें

ट्यूटोरियल शुरू करें

GrapesJS स्थापित करें और अगले दस मिनट में एक संपादक चालू करें।

चरण 1 पर जाएँ
हमारे साथ निर्माण करें

हमारी टीम के साथ निर्माण करें

कस्टम घटक, भंडारण एकीकरण और उत्पादन वास्तुकला, आपके साथ किया गया।

हमसे बात करो

इस पृष्ठ पर सभी नमूनों की GrapesJS 0.23.6 पर 2026-09-03 के खिलाफ जाँच की गई थी।