GrapesJS + Vue 3

GrapesJS Vue: Vue 3 के साथ एक विज़ुअल एडिटर बनाएं

विज़ुअल पेज बिल्डरों, CMS संपादकों, लैंडिंग पेज बिल्डरों, ईमेल संपादकों और व्हाइट-लेबल संपादन अनुभवों का निर्माण करने के लिए ओपन-सोर्स GrapesJS विज़ुअल एडिटर को Vue 3 और Nuxt एप्लिकेशन में एकीकृत करें।

Vue 3Composition APITypeScriptखुला स्रोतHTML & CSSएक्स्टेंसिबल
संपादक कहाँ बैठता है

Vue आपके आवेदन को शक्ति प्रदान करता है। GrapesJS संपादन को शक्ति प्रदान करता है।

विभाजन किसी भी कोड से पहले नामकरण के लायक है। आपका Vue एप्लिकेशन रूटिंग, उपयोगकर्ताओं, अनुमतियों और डेटा का मालिक है। GrapesJS कैनवास और उसके अंदर हेरफेर करने वाली हर चीज का मालिक है। दोनों एक DOM नोड और एक सेव कॉल पर मिलते हैं।

  1. Vue 3 application
  2. GrapesJS editor
  3. HTML + CSS + project data
  4. Your API / CMS / SaaS

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

संक्षिप्त जवाब

क्या आप GrapesJS के साथ Vue का उपयोग कर सकते हैं?

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

इसे करने के दो तरीके

प्रत्यक्ष एकीकरण

grapesjs आयात करें, grapesjs.init() को onMounted() में कॉल करें, editor.destroy() को onUnmounted() में कॉल करें। कोई अतिरिक्त निर्भरता नहीं, आपके और संपादक के बीच कुछ भी नहीं API।

एक Vue-उन्मुख परत

उस जीवनचक्र को अपने स्वयं के कंपोजेबल - या एक सामुदायिक पैकेज में लपेटें - ताकि घटकों को अनिवार्य के बजाय Vue-आकार API मिले। एक से अधिक स्क्रीन एक संपादक को माउंट करने के बाद उपयोगी।

GrapesJS React के लिए एक आधिकारिक फ्रेमवर्क रैपर, @grapesjs/react प्रकाशित करता है। Vue परियोजना से कोई समतुल्य GrapesJS पैकेज नहीं है, इसलिए कोई भी Vue रैपर जो आपको npm पर मिलता है, वह एक सामुदायिक परियोजना है। इसे अपनाने से पहले इसकी Vue और GrapesJS सहकर्मी श्रेणियों की जाँच करें।

श्रम विभाजन

GrapesJS के लिए Vue क्या है?

Vue 3 एक एप्लिकेशन फ्रेमवर्क है। GrapesJS एक विज़ुअल एडिटिंग इंजन है। वे विभिन्न समस्याओं को हल करते हैं, और एकीकरण ठीक से साफ है क्योंकि वे ओवरलैप नहीं होते हैं।

आपका Vue कोड
  • रूटिंग
  • प्रमाणीकरण
  • अनुमतियां
  • आवेदन UI
  • API और डेटा परत
GrapesJS में
  • Canvas
  • Drag & drop
  • Component tree
  • Block Manager
  • Style Manager
  • Device Manager
  • UndoManager
  • Commands
  • Serialization
प्लगइन या एडाप्टर
  • Asset Manager
  • Storage Manager
  • Rich Text Editor
  • Export

इनमें से पांच आपके हैं। बाकी पहले से मौजूद हैं, और शेष दो निर्माण के बजाय कॉन्फ़िगरेशन हैं।

चरण 1

GrapesJS 3 में Vue स्थापित करें

एक निर्भरता। GrapesJS अपनी TypeScript परिभाषाएँ भेजता है, इसलिए जोड़ने के लिए कोई अलग @types पैकेज नहीं है।

npm install grapesjs

स्टाइलशीट आयात करें

इसके बिना संपादक अनस्टाइल है। Vite या Nuxt प्रोजेक्ट में आप इसे संपादक बनाने वाले घटक या कंपोज़ेबल से आयात कर सकते हैं; वैश्विक स्टाइलशीट वाले ऐप में, इसके बजाय इसे एक बार वहां आयात करें।

एकीकरण की क्या जरूरत है

  • कैनवास के लिए एक DOM तत्व, एक टेम्पलेट रेफरी के माध्यम से पहुंचा
  • grapesjs.init() उस तत्व के मौजूद होने के बाद कहा जाता है
  • editor.destroy() को तब कहा जाता है जब घटक चला जाता है
  • GrapesJS स्टाइलशीट कहीं लोड की गई है
  • केवल-ब्राउज़र निष्पादन — Nuxt अनुभाग देखें
चरण 2

एक न्यूनतम कार्य Vue 3 उदाहरण

इसे एक घटक में कॉपी करें और यह चलता है। इस खंड के बाद सब कुछ इसके अतिरिक्त है, न कि इसका पुनर्लेखन।

VisualEditor.vueVUE
<template>
  <div ref="editorContainer" class="editor-shell"></div>
</template>

<script setup lang="ts">
import { onMounted, onUnmounted, shallowRef, ref } from 'vue';
import grapesjs, { type Editor } from 'grapesjs';
import 'grapesjs/dist/css/grapes.min.css';

// A template ref: the name matches the ref="" attribute above.
const editorContainer = ref<HTMLDivElement | null>(null);

// shallowRef, not ref — see "Performance" further down the page.
const editor = shallowRef<Editor | null>(null);

onMounted(() => {
  if (!editorContainer.value) return;

  editor.value = grapesjs.init({
    container: editorContainer.value,
    height: '100%',
    fromElement: false,
    storageManager: false,
  });
});

onUnmounted(() => {
  editor.value?.destroy();
  editor.value = null;
});
</script>

<style scoped>
.editor-shell {
  height: 100vh;
}
</style>

ध्यान देने योग्य तीन बातें

  1. टेम्पलेट रेफरी नाम ref="" विशेषता से मेल खाता है - इस तरह Vue उन्हें <script setup> में बांधता है।

  2. संपादक shallowRef में रहता है, रेफरी नहीं Vue अन्यथा पूरे संपादक ऑब्जेक्ट ग्राफ़ को प्रतिक्रियाशील बनाता है।

  3. fromElement गलत है, इसलिए GrapesJS कंटेनर के अंदर जो भी मार्कअप था, उसके बजाय आपके द्वारा पास किए गए घटकों से शुरू होता है।

जीवनचक्र

GrapesJS Vue 3 Composition API के साथ

संपूर्ण एकीकरण एक जीवनचक्र मानचित्रण है। Vue आपको बताता है कि DOM नोड कब मौजूद है और यह कब गायब होने वाला है; GrapesJS को बिल्कुल उन्हीं दो क्षणों की आवश्यकता है।

VueGrapesJS
onMounted()
grapesjs.init()
कंटेनर तत्व अभी मौजूद है, और केवल अभी। पहले आरंभ करने से GrapesJS एक नल कंटेनर मिलता है।
onUnmounted()
editor.destroy()
श्रोताओं, कैनवास iframe और संपादक DOM को हटा देता है। इसे छोड़ने से हर मार्ग परिवर्तन पर लीक हो जाता है।
ref()
कंटेनर तत्व
एक टेम्पलेट रेफरी वह हैंडल है जिसके खिलाफ GrapesJS माउंट होता है।
shallowRef()
संपादक इंस्टेंस
इसे गहराई से प्रतिक्रियाशील बनाए बिना उदाहरण रखता है।

ऊपर से नीचे पढ़ें, यह दो पुस्तकालयों के बीच का पूरा अनुबंध है।

सर्वर पर न तो onMounted और न ही onUnmounted चलता है, यही वजह है कि एक सादे Vue एसपीए को अतिरिक्त कुछ भी नहीं चाहिए। एक सर्वर-रेंडर किए गए ऐप को एक और गार्ड की आवश्यकता होती है - Nuxt अनुभाग इसे कवर करता है।

पुनः प्रयोज्य

पुनः प्रयोज्य उपयोगGrapesJS कंपोज़ेबल बनाएं

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

useGrapesJS.tsTS
// composables/useGrapesJS.ts
import { onMounted, onUnmounted, shallowRef, type Ref } from 'vue';
import grapesjs, { type Editor, type EditorConfig } from 'grapesjs';
import 'grapesjs/dist/css/grapes.min.css';

type EditorOptions = Omit<EditorConfig, 'container'>;

export function useGrapesJS(
  container: Ref<HTMLElement | null>,
  options: EditorOptions = {},
) {
  const editor = shallowRef<Editor | null>(null);

  const init = (): Editor | undefined => {
    if (editor.value || !container.value) return;

    editor.value = grapesjs.init({
      container: container.value,
      height: '100%',
      fromElement: false,
      storageManager: false,
      ...options,
    });

    return editor.value;
  };

  const destroy = (): void => {
    editor.value?.destroy();
    editor.value = null;
  };

  onMounted(init);
  onUnmounted(destroy);

  return { editor, init, destroy };
}

इसका उपयोग करना

EditorScreen.vueVUE
<template>
  <div ref="editorContainer" class="editor-shell"></div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import { useGrapesJS } from '~/composables/useGrapesJS';

const editorContainer = ref<HTMLElement | null>(null);

const { editor } = useGrapesJS(editorContainer, {
  blockManager: {
    blocks: [
      {
        id: 'hero',
        label: 'Hero',
        category: 'Sections',
        content: '<section>…</section>',
      },
    ],
  },
});
</script>

कंपोजेबल आपको क्या खरीदता है

  • प्रति स्क्रीन एक के बजाय बनाए रखने के लिए एक एकीकरण
  • एक ही स्थान पर कॉन्फ़िगरेशन
  • Editor सेटअप जिसे स्वयं परीक्षण किया जा सकता है
  • कॉपी-पेस्ट के बिना एक ऐप में कई संपादक
  • इवेंट हैंडलिंग सभी घटकों में साझा की गई
  • Components जो Vue के रूप में पढ़ा जाता है, न कि DOM नलसाजी के रूप में

इसे आवश्यकता से अधिक बढ़ाने का विरोध करें। एक कंपोजेबल जो प्रत्येक GrapesJS मॉड्यूल को एक प्रतिक्रियाशील मुखौटे में लपेटता है, सीखने के लिए दूसरा API है और सिंक में रखने के लिए दूसरी चीज़ है।

Reactivity

GrapesJS ईवेंट को Vue से कनेक्ट करना

GrapesJS संपादक स्थिति का प्रबंधन करता है। Vue आवेदन स्थिति का प्रबंधन करता है। घटनाएँ सीम हैं: उन कुछ की सदस्यता लें जो आपका UI वास्तव में प्रतिबिंबित करता है, और उन्हें सामान्य रेफ में लिखें।

editor-events.tsTS
import { onMounted, ref, shallowRef } from 'vue';
import type { Editor, Component } from 'grapesjs';

const isReady = ref(false);
const isDirty = ref(false);
const saveState = ref<'idle' | 'saving' | 'saved' | 'error'>('idle');
const selectedName = ref<string | null>(null);

function bindEditorEvents(editor: Editor): void {
  editor.on('load', () => {
    isReady.value = true;
  });

  editor.on('component:selected', (component: Component) => {
    selectedName.value = component?.getName?.() ?? null;
  });

  editor.on('component:update', () => {
    isDirty.value = true;
  });

  editor.on('storage:start:store', () => {
    saveState.value = 'saving';
  });

  editor.on('storage:end:store', () => {
    saveState.value = 'saved';
    isDirty.value = false;
  });

  editor.on('storage:error', () => {
    saveState.value = 'error';
  });
}
आयोजनआपका UI इसके साथ क्या करता है
loadप्रोजेक्ट कैनवास पर होने के बाद लोडिंग स्थिति छुपाएं
component:selectedदिखाएँ कि आपके स्वयं के उपकरण पट्टी में कौन सा तत्व चयनित है
component:updateदस्तावेज़ को गंदा चिह्नित करें, सहेजें बटन सक्षम करें
storage:start:storeएक बचत संकेतक दिखाएं
storage:end:storeसहेजा गया दिखाएं, गंदा झंडा साफ़ करें
storage:errorकिसी विफलता को उस पर उपयोगकर्ता द्वारा कार्य किया जा सकता है

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

Nuxt & SSR

GrapesJS के साथ Nuxt का उपयोग करना

GrapesJS ब्राउज़र DOM APIs पर निर्भर करता है, इसलिए संपादक आरंभीकरण केवल ब्राउज़र संदर्भ में होना चाहिए। Nuxt में इसका मतलब है कि संपादक को सर्वर रेंडर से बाहर रखना - बाकी सब कुछ वही एकीकरण है जो आपके पास पहले से है।

pages/editor.vueVUE
<!-- pages/editor.vue -->
<template>
  <ClientOnly>
    <VisualEditor />

    <template #fallback>
      <p class="editor-placeholder">Loading the editor…</p>
    </template>
  </ClientOnly>
</template>
घटक/विज़ुअलएडिटर.client.vueVUE
<!-- components/VisualEditor.client.vue -->
<template>
  <div ref="editorContainer" class="editor-shell"></div>
</template>

<script setup lang="ts">
import { ref } from 'vue';
import { useGrapesJS } from '~/composables/useGrapesJS';

// Reached only in the browser: the .client suffix keeps this
// component out of the server render, and onMounted never runs
// on the server anyway.
const editorContainer = ref<HTMLElement | null>(null);
const { editor } = useGrapesJS(editorContainer);
</script>

दो सही विकल्प

<ClientOnly>

संपादक को लपेटें जहां इसका उपयोग किया जाता है। फ़ॉलबैक slot सर्वर को प्रस्तुत करने के लिए कुछ देता है, इसलिए जलयोजन से पहले कोई खाली फ्रेम नहीं है।

एक .client घटक

Nuxt का अपना नामकरण सम्मेलन: एक घटक जिसका फ़ाइल नाम .client में समाप्त होता है, केवल ब्राउज़र में प्रस्तुत किया जाता है। उपयोगी जब संपादक का उपयोग कई स्थानों पर किया जाता है।

दोनों मान्य हैं, और वे गठबंधन करते हैं। GrapesJS द्वारा न तो आवश्यक है - GrapesJS की आवश्यकता केवल यह है कि init() वहां चलता है जहां दस्तावेज़ मौजूद है।

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

जहां सीमा गिरती है

SSR एप्लिकेशन शेल को प्रस्तुत करता है। GrapesJS ब्राउज़र में चलता है। उस सीमा का नामकरण ही जलयोजन बग के स्रोत के बजाय Nuxt एकीकरण को पूर्वानुमानित बनाता है।

  1. Nuxt आवेदन
  2. SSR/आवेदन खोल
  3. केवल-क्लाइंट विज़ुअल एडिटर
  4. GrapesJS
  5. API/CMS/डेटाबेस

संपादक स्क्रीन एक ऐसा पृष्ठ नहीं है जिसे आप SEO के लिए सर्वर-रेंडर करते हैं - यह एक प्रमाणित उपकरण है। इसके द्वारा उत्पादित पृष्ठ वही हैं जिन्हें आप प्रस्तुत और अनुक्रमित करते हैं, और वे सादे HTML और CSS हैं।

एक पूर्ण Vue पेज बिल्डर बनाएं
निर्णय

क्या आपको Vue रैपर की आवश्यकता है GrapesJS?

नहीं। प्रत्यक्ष एकीकरण GrapesJS का उपयोग करने का एक पूर्ण, समर्थित तरीका है, और इस पृष्ठ पर दिए गए उदाहरण यही करते हैं। रैपर एक सुविधा है, आवश्यकता नहीं।

दृष्टिकोणके लिए सबसे अच्छासमंजन
प्रत्यक्ष GrapesJSअधिकतम नियंत्रणआप जीवनचक्र स्वयं लिखते हैं - लगभग पंद्रह पंक्तियाँ।
Vue रैपर/एकीकरणएक अधिक Vue-उन्मुख APIआपके और संपादक के बीच निर्भरता API, किसी और के रिलीज़ शेड्यूल पर।
कस्टम कंपोजेबलपुनः प्रयोज्य अनुप्रयोग एकीकरणआपका बनाए रखना है - लेकिन यह ऊपर दिखाई गई फ़ाइल है, और यह बासी नहीं होती है।

वास्तव में क्या प्रकाशित होता है

कुछ भी अपनाने से पहले जांच करने लायक है, क्योंकि इस प्रश्न के खोज परिणाम उनके द्वारा वर्णित पैकेजों से पुराने हैं।

आधिकारिक React आवरण
@grapesjs/react 2.0.0, MIT, GrapesJS अनुरक्षकों द्वारा प्रकाशित।
आधिकारिक Vue आवरण
कोई नहीं। GrapesJS परियोजना Vue पैकेज प्रकाशित नहीं करती है।
समुदाय Vue पैकेज
vue-grapesjs 0.1.0 एक तृतीय-पक्ष परियोजना है, जिसे अंतिम बार 2022-05-23 प्रकाशित किया गया था, जिसमें सहकर्मी श्रेणियाँ vue@^2.6.6 और grapesjs@^0.14.55 — Vue 2 और बहुत पुरानी GrapesJS हैं।

npm रजिस्ट्री के विरुद्ध जाँच की गई 2026-09-02. यदि आपको एक नया Vue पैकेज मिलता है, तो पहले इसका peerDependencies पढ़ें: वह एकल फ़ील्ड आपको बताता है कि क्या यह Vue 3 और वर्तमान GrapesJS को लक्षित करता है।

आज Vue 3 के लिए, ऊपर दिया गया कंपोजेबल रैपर है। यह बीस विषम पंक्तियाँ हैं, यह सीधे GrapesJS API का उपयोग करता है, और यह उस रिलीज़ के पीछे नहीं रह सकता जिस पर आप निर्भर हैं।

एकीकरण से परे

GrapesJS के साथ एक Vue पेज बिल्डर बनाएं

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

  • Canvas

    संपादन योग्य सतह और उसके डिवाइस की चौड़ाई।

  • Components

    आपके उपयोगकर्ता किस प्रकार रख सकते हैं, और उनके लक्षण।

  • Blocks

    जिस पैलेट से वे खींचते हैं।

  • Style Manager

    कौन से CSS गुण उजागर होते हैं, और किसके लिए।

  • Asset Manager

    छवियाँ और मीडिया, आपके संग्रहण से।

  • Storage Manager

    जहां प्रोजेक्ट डेटा लोड और सहेजा जाता है।

  • Commands

    नामित क्रियाएं, आपके स्वयं के UI के लिए बाध्यकारी।

  • Device Manager

    संपादन और आउटपुट के लिए उत्तरदायी ब्रेकपॉइंट।

  • Plugins

    ऊपर सब कुछ, पैक और पुनः प्रयोज्य।

जानें कि एक पूर्ण Vue पेज बिल्डर कैसे बनाया जाए
आप क्या बना सकते हैं

आप GrapesJS और Vue के साथ क्या बना सकते हैं?

एक ही संपादक कोर, अलग तरह से कॉन्फ़िगर किया गया है। इनमें से प्रत्येक ब्लॉक का एक अलग सेट, एक अलग भंडारण लक्ष्य और एक अलग प्रकाशन चरण है।

Vue Page Builder

अपने Vue एप्लिकेशन के अंदर विज़ुअल पेज संपादन बनाएं।

अधिक पढ़ें

Nuxt CMS संपादक

सामग्री टीमों को उन पृष्ठों पर एक दृश्य संपादन इंटरफ़ेस दें जो आपकी Nuxt साइट पहले से ही प्रस्तुत करती है।

अधिक पढ़ें

Vue लैंडिंग Page Builder

पुनः प्रयोज्य मार्केटिंग लेआउट बनाएं जिन्हें आपकी विकास टीम बिना किसी तैनाती के इकट्ठा कर सके।

अधिक पढ़ें

Vue ईमेल बिल्डर

ब्राउज़रों के बजाय मेल क्लाइंट के लिए आउटपुट के आकार के साथ ईमेल टेम्पलेट्स को नेत्रहीन रूप से बनाएं।

अधिक पढ़ें

SaaS विजुअल एडिटर

अपने उत्पाद में एक ब्रांडेड संपादक एम्बेड करें, अपने स्वयं के UI और अनुमतियों के तहत।

अधिक पढ़ें

दृश्य HTML Editor

उपयोगकर्ताओं को HTML और CSS पर दृश्य नियंत्रण दें, और ठीक वैसा ही वापस कर दें।

अधिक पढ़ें
उत्पादन

GrapesJS क्या स्टोर और जेनरेट करता है?

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

परियोजना डेटा

GrapesJS परियोजना की संपादन योग्य स्थिति - पृष्ठ, घटक, शैलियाँ, संपत्ति। इसे editor.getProjectData() के साथ पढ़ें, इसे editor.loadProjectData() के साथ पुनर्स्थापित करें। यही बनी रहने की बात है।

HTML

प्रदान किया गया मार्कअप, editor.getHtml() से। जब भी आप प्रकाशित करें तो इसे पुनः उत्पन्न करें। यह आउटपुट है, स्रोत नहीं।

CSS

संपादक ने editor.getCss() से जो शैलियाँ तैयार कीं। एक ही नियम: उत्पन्न, सत्य के स्रोत के रूप में संग्रहीत नहीं।

  1. User edits
  2. GrapesJS project data
  3. Your API / database
  4. HTML + CSS
  5. Preview / publish

संपादन योग्य प्रोजेक्ट डेटा संग्रहीत करें। जब आपको प्रस्तुत या प्रकाशित करने की आवश्यकता हो तो HTML और CSS उत्पन्न करें।

केवल प्रदान किए गए HTML को सहेजना वह गलती है जिसे बाद में पूर्ववत नहीं किया जा सकता है। आप प्रोजेक्ट डेटा से हमेशा HTML को पुनः उत्पन्न कर सकते हैं; आप HTML से प्रोजेक्ट डेटा को मज़बूती से पुनर्प्राप्त नहीं कर सकते।

publish.tsTS
// Editable state — store this, it is what the editor reloads.
const projectData = editor.getProjectData();

// Rendered output — regenerate this whenever you publish.
const html = editor.getHtml();
const css = editor.getCss();

await fetch(`/api/projects/${projectId}/publish`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ projectData, html, css }),
});

// Sanitize `html` on the server before it is served to anyone.
दृढ़ता

अपने Vue एप्लिकेशन में GrapesJS प्रोजेक्ट सहेजें

GrapesJS को परवाह नहीं है कि आपका बैकएंड क्या है। एक स्टोरेज एडाप्टर दो एसिंक फ़ंक्शन हैं - एक जो प्रोजेक्ट डेटा लौटाता है, एक जो इसे स्वीकार करता है - इसलिए संपादक आपके पास पहले से मौजूद API से बात करता है।

  1. Vue
  2. GrapesJS storage
  3. REST API
  4. Backend
  5. Database
storage.tsTS
import grapesjs, { type ProjectData } from 'grapesjs';

// Wherever your app keeps it — a route param, a prop, a store.
const projectId = props.projectId;

const editor = grapesjs.init({
  container: editorContainer.value!,
  fromElement: false,
  storageManager: {
    type: 'app-api',
    autosave: true,
    stepsBeforeSave: 10,
  },
  // Registered as a plugin so the adapter exists before
  // GrapesJS performs its first load.
  plugins: [
    (ed) => {
      ed.Storage.add('app-api', {
        async load(): Promise<ProjectData> {
          const res = await fetch(`/api/projects/${projectId}`);
          if (!res.ok) {
            throw new Error(`Load failed: ${res.status}`);
          }
          return await res.json();
        },

        async store(data: ProjectData) {
          const res = await fetch(`/api/projects/${projectId}`, {
            method: 'PUT',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify({ projectData: data }),
          });
          if (!res.ok) {
            throw new Error(`Save failed: ${res.status}`);
          }
        },
      });
    },
  ],
});

एडेप्टर क्या कवर करता है

load()
संपादक खुलने पर प्रोजेक्ट प्राप्त करें।
store()
प्रोजेक्ट डेटा को अपने समापन बिंदु पर भेजें।
autosave
stepsBeforeSave के माध्यम से परिवर्तनों की एक निर्धारित संख्या के बाद आग लगती है।
Project JSON
क्रमबद्ध स्थिति - वह चीज़ जिसका आप संस्करण करते हैं।
Versioning
रोलबैक का समर्थन करने के लिए पूर्व पेलोड सर्वर-साइड रखें।
Publishing
एक अलग समापन बिंदु जो आउटपुट को प्रस्तुत और साफ करता है।

प्लगइन्स सरणी के माध्यम से एडॉप्टर को पंजीकृत करना मायने रखता है: यह गारंटी देता है कि भंडारण GrapesJS द्वारा अपना पहला लोड करने से पहले मौजूद है।

मीडिया

अपने Vue एप्लिकेशन में संपत्ति प्रबंधित करें

परिसंपत्ति प्रबंधक एक समापन बिंदु पर UI है। इसे अपने और हर मौजूदा नियम पर इंगित करें - प्रमाणीकरण, सत्यापन, कोटा, CDN - लागू होता रहता है।

assets.tsTS
// Fetched from your own API before the editor is created.
const assets = await fetch('/api/assets').then((res) => res.json());

const editor = grapesjs.init({
  container: editorContainer.value!,
  assetManager: {
    assets,

    // Uploads go to your endpoint, with your auth and
    // your validation.
    upload: '/api/assets',
    uploadName: 'files',
    multiUpload: true,
    autoAdd: true,
    headers: { Authorization: `Bearer ${token.value}` },
    credentials: 'same-origin',

    // Reject what the backend would reject anyway,
    // before the round trip.
    beforeUpload: (files: File[]) => {
      const limit = 5 * 1024 * 1024;
      const tooBig = files.some((f) => f.size > limit);
      if (tooBig) {
        toast.error('Images must be under 5 MB');
        return false;
      }
    },
  },
});
upload
आपका समापन बिंदु; uploadName वह फॉर्म फ़ील्ड है जिस पर यह पोस्ट करता है।
assets
प्रबंधक को उन URL के साथ बीज दें जिनके बारे में आपका API पहले से ही जानता है।
headers / credentials
प्रत्येक अपलोड के साथ भेजा जाता है, इसलिए आपका मौजूदा प्रमाणीकरण आवेदन करता रहता है।
beforeUpload
क्लाइंट-साइड को अस्वीकार करता है; आपका सर्वर अभी भी मान्य करता है।
Storage & CDN
GrapesJS कभी नहीं देखता कि बाइट्स कहां उतरते हैं - यह आपके द्वारा लौटाए गए URL को संग्रहीत करता है।
Asset URLs
प्रकाशित HTML में क्या समाप्त होता है, इसलिए उन्हें टिकाऊ मूल से परोसें।
आपकी शब्दावली

GrapesJS Vue अनुप्रयोगों के लिए कस्टम Vue बनाएं

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

pricing-card.tsTS
import type { Editor } from 'grapesjs';

export function pricingCardPlugin(editor: Editor): void {
  editor.Components.addType('pricing-card', {
    isComponent: (el) => el.dataset?.gjsType === 'pricing-card',
    model: {
      defaults: {
        tagName: 'section',
        attributes: { 'data-gjs-type': 'pricing-card' },
        // Traits become the settings panel for this component.
        traits: [
          { type: 'text', name: 'plan', label: 'Plan name' },
          { type: 'text', name: 'price', label: 'Price' },
          { type: 'checkbox', name: 'featured', label: 'Featured' },
        ],
        components: `
          <h3 data-gjs-type="text">Starter</h3>
          <p data-gjs-type="text">$0 / month</p>
          <a href="#">Choose plan</a>
        `,
      },
    },
  });

  editor.Blocks.add('pricing-card', {
    label: 'Pricing card',
    category: 'Marketing',
    content: { type: 'pricing-card' },
  });
}

// Pass it to the editor like any other plugin:
// grapesjs.init({ container, plugins: [pricingCardPlugin] })

विशिष्ट पहले पांच

  • Hero
  • Pricing card
  • Product card
  • Form
  • Navigation

कस्टम घटक भी हैं कि आप संपादक को कैसे विवश करते हैं। किसी प्रकार पर ड्रॉपेबल या ड्रैग करने योग्य सेट करना वह है जो उपयोगकर्ता को नेविगेशन बार के अंदर मूल्य निर्धारण कार्ड छोड़ने से रोकता है, और लक्षण वे हैं जो उन्हें कच्चे CSS नियंत्रण के बजाय एक लेबल फ़ील्ड देते हैं।

ये GrapesJS घटक प्रकार हैं, न कि Vue घटक। कैनवास DOM प्रस्तुत करता है; आपके Vue घटक आपके अनुप्रयोग को इसके चारों ओर प्रस्तुत करते हैं।

पारिस्थितिकी तंत्र

GrapesJS प्लगइन्स के साथ अपने Vue संपादक का विस्तार करें

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

plugins.tsTS
import grapesjs from 'grapesjs';
import basicBlocks from 'grapesjs-blocks-basic';
import { pricingCardPlugin } from '~/editor/pricing-card';

const editor = grapesjs.init({
  container: editorContainer.value!,
  plugins: [
    // Options go through a wrapper function: `pluginsOpts`
    // is keyed by string, so it only reaches plugins that
    // were passed to `plugins` by name.
    (ed) => basicBlocks(ed, { flexGrid: true }),
    pricingCardPlugin,
  ],
});

आपके उपयोगकर्ता क्या खींचते हैं

पैलेट, टेक्स्ट एडिटिंग और फॉर्म कंट्रोल जो कैनवास को पहले दिन उपयोगी बनाते हैं।

श्रेणी ब्राउज़ करें
बिल्ड बनाम एडॉप्ट

विज़ुअल एडिटर स्वयं बनाएं या GrapesJS का उपयोग करें?

यह तर्क नहीं है कि इमारत गलत है - इमारत का क्या मतलब है इसकी एक सूची। प्रत्येक पंक्ति एक सबसिस्टम है जो मौजूद है चाहे आपने इसके लिए योजना बनाई हो या नहीं।

योग्‍यताअपने आप को बनाएंGrapesJS
Canvasनिर्माणशामिल
Drag & dropनिर्माणशामिल
Componentsनिर्माणशामिल
Blocksनिर्माणशामिल
Style Managerनिर्माणशामिल
Asset Managerनिर्माणएक्स्टेंसिबल
Storage Managerनिर्माणएक्स्टेंसिबल
Pluginsएक पारिस्थितिकी तंत्र का निर्माण करेंप्लगइन आर्किटेक्चर
Vue integrationमूल निवासीफ्रेमवर्क-अज्ञेयवादी

Vue आपको एप्लिकेशन फ्रेमवर्क देता है। GrapesJS आपको विज़ुअल एडिटिंग इंजन देता है।

संपादक को पूरी तरह से Vue घटकों के साथ क्यों नहीं बनाया जाता?

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

Vue + GrapesJS अकेले Vue घटकों से एक अलग प्रस्ताव है।

उत्पादन में

GrapesJS + Vue के लिए उत्पादन वास्तुकला

एक वास्तविक एप्लिकेशन के अंदर संपादक कैसे बैठता है, एक बार उपयोगकर्ता, अनुमतियाँ और एक से अधिक प्रोजेक्ट होने के बाद।
  1. Vue / Nuxt

    आपका Nuxt या Vue एप्लिकेशन: शेल, सत्र, और किसे किस प्रोजेक्ट को खोलने की अनुमति है।

    • Application UI
    • Authentication
    • Users
    • Permissions
  2. GrapesJS

    संपादक, एक स्क्रीन पर घुड़सवार। यह एक परियोजना प्राप्त करता है और एक परियोजना का उत्सर्जन करता है।

    • Canvas
    • Components
    • Blocks
    • Styles
    • Assets
  3. Application API

    आपके अपने मार्ग। GrapesJS उन्हें आपके द्वारा लिखे गए स्टोरेज और एसेट एडेप्टर के माध्यम से कॉल करता है।

  4. Backend

    जहां परियोजनाएं, मीडिया, उपयोगकर्ता और संस्करण वास्तव में रहते हैं - इसके ऊपर संपादक द्वारा अपरिवर्तित।

    • Projects
    • Assets
    • Users
    • Versions

संपादक उस पेड़ में एक पत्ता है, जड़ नहीं। इसके ऊपर सब कुछ कोड है जिसे आपने वैसे भी लिखा होगा।

प्रदर्शन

प्रदर्शन संबंधी विचार

  • संपादक को गहराई से प्रतिक्रियाशील न बनाएं

    यह वह है जो वास्तव में काटता है। shallowRef, या एक सादा मॉड्यूल-स्कोप्ड चर - संपादक उदाहरण के आसपास कभी भी ref() नहीं। Vue एक बहुत बड़े ऑब्जेक्ट ग्राफ़ पर चलेगा और आंतरिक मंथन पर प्रभाव को फिर से चलाएगा।

  • जरूरत पड़ने पर ही इनिशियलाइज़ करें

    स्क्रीन पर संपादक बनाएं जो संपादित करता है, न कि किसी लेआउट या स्टोर में जो हर मार्ग माउंट करता है।

  • आलसी-लोड संपादक

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

  • अपडेट को वैश्विक स्थिति से बाहर रखें

    प्रत्येक component:update को एक स्टोर में धकेलने से प्रत्येक कीस्ट्रोक एक एप्लिकेशन-वाइड रेंडर में बदल जाता है।

  • बड़े परिसंपत्ति संग्रह को पेजिनेट करें

    संपादक में हजारों URL भेजने के बजाय परिसंपत्ति प्रबंधक को पृष्ठांकित समापन बिंदु से सीड करें।

  • घटक वृक्षों को प्रबंधनीय रखें

    बहुत गहरे दस्तावेज़ों को प्रस्तुत करने, क्रमबद्ध करने और अलग करने के लिए अधिक खर्च होता है। संरचना खुद को प्रोत्साहित करती है यदि आपके ब्लॉक करते हैं।

प्रतिभूति

सुरक्षा के मनन

विज़ुअल एडिटर एक ऐसी प्रणाली है जो उपयोगकर्ता-लिखित HTML को स्वीकार करती है। इसे इस तरह से ट्रीट करें।

सैनिटाइज प्रकाशित HTML
सर्वर पर सैनिटाइज़ करें, प्रकाशन समय पर, इससे पहले कि किसी आगंतुक को कुछ भी परोसा जाए।
अपलोड की पुष्टि करें
प्रकार, आकार और सामग्री - क्लाइंट-साइड चेक UX हैं, प्रवर्तन नहीं।
भंडारण समापन बिंदुओं को प्रमाणित करें
लोड और सेव सामान्य API मार्ग हैं और इसके लिए साधारण प्रमाणीकरण की आवश्यकता होती है।
अनुमतियाँ सर्वर-साइड लागू करें
संपादक में एक पैनल छिपाना एक प्राधिकरण मॉडल नहीं है।
प्रोजेक्ट डेटा को मान्य करें
यह एक ग्राहक से आता है और कुछ भी हो सकता है। इसे स्टोर करने से पहले इसकी जांच करें।
संपादक राज्य पर कभी भरोसा न करें
ब्राउज़र जो कुछ भी भेजता है उसके बारे में जो कुछ भी संपादित किया गया था वह एक दावा है, तथ्य नहीं।
प्रकाशन समापन बिंदुओं को सुरक्षित रखें
प्रकाशन से जनता जो देखती है उसे बदल जाता है; दर-सीमा और तदनुसार इसे अधिकृत करें।
समस्या निवारण

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

इस संयोजन के लिए रिपोर्ट किया गया लगभग हर एकीकरण मुद्दा इन सात में से एक है।

माउंट करने से पहले इनिशियलाइज़ करना

लक्षण

कंटेनर शून्य है, या संपादक कुछ भी नहीं में प्रस्तुत करता है।

ठीक करना

onMounted() के अंदर संपादक बनाएं। टेम्पलेट रेफरी में इससे पहले कोई तत्व नहीं है।

सफाई भूल जाना

लक्षण

याददाश्त बढ़ती है और बासी श्रोता मार्ग छोड़ने के बाद आग लगा देते हैं।

ठीक करना

editor.destroy() को onUnmounted() में कॉल करें और संदर्भ साफ़ करें।

पूरे संपादक को गहराई से प्रतिक्रियाशील बनाना

लक्षण

संपादक सुस्त महसूस करता है; Vue devtools स्टाल।

ठीक करना

उदाहरण को shallowRef में, या Vue प्रतिक्रियाशीलता के बाहर पूरी तरह से पकड़ें।

GrapesJS के दौरान SSR आरंभ करना

लक्षण

दस्तावेज़ परिभाषित नहीं है, या संपादक मार्ग पर जलयोजन बेमेल है।

ठीक करना

संपादक को केवल-क्लाइंट — <ClientOnly>, एक .client घटक, या दोनों को प्रस्तुत करें।

अनुप्रयोग स्थिति के साथ संपादक स्थिति का मिश्रण

लक्षण

सत्य के दो स्रोत, और संपादन जो नेविगेशन पर गायब हो जाते हैं।

ठीक करना

GrapesJS को प्रोजेक्ट का मालिक होने दें; केवल कुछ मूल्यों को मिरर करें जो आपके UI प्रदर्शित करता है।

CSS आयात भूल जाना

लक्षण

संपादक लोड होता है, लेकिन पैनल स्टाइल रहित और अनुपयोगी हैं।

ठीक करना

grapesjs/dist/css/grapes.min.css आयात करें, या इसे अपनी वैश्विक स्टाइलशीट में शामिल करें।

पुराने रैपर उदाहरणों की प्रतिलिपि बनाना

लक्षण

त्रुटियाँ टाइप करें, या Vue 2 जीवनचक्र हुक पर निर्मित एकीकरण।

ठीक करना

किसी भी आवरण को अपनाने से पहले peerDependencies की जाँच करें। कई लोकप्रिय उदाहरण Vue 3 से पहले के हैं।

Vue 2 पर समान एकीकरण mounted()() और onUnmounted() के बजाय mounted() और beforeDestroy() का उपयोग करता है; GrapesJS पक्ष अपरिवर्तित है। नए कार्य को Vue 3 को लक्षित करना चाहिए - इस पृष्ठ पर सब कुछ इसे मानता है।

जहाज भेजने से पहले

Vue + GrapesJS उत्पादन चेकलिस्ट

आदेश मोटे तौर पर इस पृष्ठ द्वारा पेश किए गए क्रम से मेल खाता है।

  1. GrapesJS स्थापित करें
  2. माउंट के बाद इनिशियलाइज़ करें
  3. अनमाउंट पर नष्ट करें
  4. GrapesJS CSS आयात करें
  5. हैंडल SSR/क्लाइंट-ओनली निष्पादन
  6. प्रत्यक्ष एकीकरण बनाम आवरण तय करें
  7. जहां उपयोगी हो वहां पुनः प्रयोज्य कंपोजेबल बनाएं
  8. उन संपादक ईवेंट को कनेक्ट करें जिन्हें आपका UI दर्शाता है
  9. भंडारण कॉन्फ़िगर करें
  10. एसेट कॉन्फ़िगर करें
  11. कस्टम घटक जोड़ें
  12. अपने उत्पाद की ज़रूरत के प्लगइन्स जोड़ें
  13. अनुमतियाँ सर्वर-साइड लागू करें
  14. प्रकाशित सामग्री को सैनिटाइज करें
  15. उत्तरदायी संपादन का परीक्षण करें
  16. उत्पादन निर्माण का परीक्षण करें
FAQ

GrapesJS और Vue: अक्सर पूछे जाने वाले प्रश्न

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

हाँ। GrapesJS एक ढांचा-अज्ञेयवादी लाइब्रेरी है जो DOM तत्व में प्रस्तुत होती है, इसलिए यह बिना एडाप्टर के Vue 3 में काम करती है। इसे onMounted() में इनिशियलाइज़ करें और इसे onUnmounted() में नष्ट कर दें।

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

npm install grapesjs चलाएँ। पैकेज में इसकी अपनी TypeScript परिभाषाएँ शामिल हैं। आपको इसकी स्टाइलशीट को भी लोड करना होगा, या तो grapesjs/dist/css/grapes.min.css आयात करके या इसे अपने वैश्विक CSS में शामिल करके।

मैं GrapesJS 3 में Vue कैसे प्रारंभ करूं?

कंटेनर तत्व पर एक टेम्पलेट रेफरी बनाएं, फिर grapesjs.init({ container: containerRef.value }) को onMounted() के अंदर कॉल करें। माउंट से पहले तत्व मौजूद नहीं है, इसलिए किसी भी पहले को इनिशियलाइज़ करने से GrapesJS को रेंडर करने के लिए कुछ भी नहीं मिलता है।

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

हाँ, और यह अनुशंसित तरीका है। onMounted() और onUnmounted() सीधे grapesjs.init() और editor.destroy() पर मैप करें, और संपूर्ण एकीकरण एक ही कंपोजेबल में फिट बैठता है।

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

हाँ। इस पृष्ठ पर प्रत्येक उदाहरण <script setup lang="ts"> का उपयोग करता है। ref() के साथ घोषित एक टेम्पलेट रेफरी स्वचालित रूप से मिलान ref="" विशेषता से जुड़ता है।

क्या GrapesJS Nuxt के साथ काम करता है?

हाँ। एकीकरण सादे Vue 3 के समान है; एकमात्र जोड़ संपादक को सर्वर रेंडर से बाहर रखना है, जिसमें <ClientOnly> या .client घटक है।

क्या GrapesJS Nuxt SSR के साथ काम करता है?

हाँ, संपादक के साथ केवल क्लाइंट-प्रदान किया गया है। GrapesJS को ब्राउज़र DOM APIs की आवश्यकता होती है, इसलिए यह सर्वर रेंडर के दौरान नहीं चल सकता है - लेकिन इसके द्वारा उत्पादित पृष्ठ सादे HTML और CSS हैं, और वे बिल्कुल वही हैं जो आप सर्वर-रेंडर और इंडेक्स करते हैं।

क्या मुझे Vue के लिए GrapesJS रैपर की आवश्यकता है?

नहीं। प्रत्यक्ष एकीकरण एक संपूर्ण दृष्टिकोण है और यहां उदाहरण इसी का उपयोग करते हैं। GrapesJS एक आधिकारिक React रैपर प्रकाशित करता है लेकिन कोई Vue समकक्ष नहीं है, इसलिए Vue पर कोई भी npm रैपर एक सामुदायिक परियोजना है - इसे अपनाने से पहले इसकी Vue और GrapesJS सहकर्मी श्रेणियों की जांच करें।

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

हाँ। GrapesJS पैकेज में TypeScript परिभाषाएँ हैं, इसलिए Editor प्रकार और कॉन्फ़िगरेशन ऑब्जेक्ट को अतिरिक्त @types निर्भरता के बिना टाइप किया जाता है।

क्या मैं GrapesJS परियोजनाओं को अपने Vue बैकएंड में सहेज सकता हूँ?

हाँ। editor.Storage.add() के साथ एक स्टोरेज एडाप्टर पंजीकृत करें जो load() और store() को लागू करता है। दोनों सामान्य एसिंक फ़ंक्शन हैं, इसलिए वे आपके पास पहले से मौजूद API को कॉल कर सकते हैं।

क्या मैं GrapesJS के साथ कस्टम घटक बना सकता हूँ?

हाँ। editor.Components.addType() एक घटक प्रकार को अपने स्वयं के traits और ड्रॉप नियमों के साथ परिभाषित करता है, और editor.Blocks.add() इसे पैलेट में रखता है। इस तरह संपादक आपके उत्पाद की शब्दावली सीखता है।

क्या मैं GrapesJS प्लगइन्स का उपयोग कर सकता हूं Vue?

हाँ। एक GrapesJS प्लगइन एक फ़ंक्शन है जो संपादक इंस्टेंस प्राप्त करता है, इसलिए यह इसे होस्ट करने वाले ढांचे से अप्रभावित रहता है। प्लगइन्स को grapesjs.init() की प्लगइन्स सरणी में पास करें।

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

हाँ - यह सामान्य मामला है। संपादक को माउंट करना छोटा हिस्सा है; बाकी इसके चारों ओर ब्लॉक, भंडारण, संपत्ति और अनुमतियों को कॉन्फ़िगर कर रहा है।

GrapesJS के साथ अपना Vue विज़ुअल एडिटर बनाएं

विज़ुअल एडिटिंग इंजन को अपने Vue या Nuxt एप्लिकेशन में एकीकृत करें, अपने डेटा और आउटपुट पर नियंत्रण रखें, और संपादक को उन प्लगइन्स के साथ विस्तारित करें जिनकी आपके उत्पाद की आवश्यकता है।

Vue के साथ अपना एप्लिकेशन बनाएं 3. GrapesJS के साथ विज़ुअल एडिटिंग जोड़ें।

पढ़ते रहिए

संबंधित मार्गदर्शिकाएँ