Next.js + GrapesJS

Next.js पेज बिल्डर के साथGrapesJS

GrapesJS, कस्टम घटकों, लगातार प्रोजेक्ट डेटा और अपने स्वयं के प्रकाशन वर्कफ़्लो के साथ अपने Next.js एप्लिकेशन के अंदर एक विज़ुअल ड्रैग-एंड-ड्रॉप पेज बिल्डर बनाएं।

Next.js App RouterReactखींचें और छोड़ेंदृश्य संपादनHTML & CSSएक्स्टेंसिबल
your-app.com/editor
Next.js

ब्लॉक

  • Hero
  • फ़ीचर ग्रिड
  • मूल्य निर्धारण
  • फार्म
  • पाद लेख

आपका पेज

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

GrapesJS द्वारा संचालित

संपादक का प्रयास करें

26k+

GitHub सितारे

1.4M+

npm डाउनलोड/माह

BSD-3-Clause

कोर लाइसेंस

100+

GJS.Market पर प्लगइन्स

GrapesJS आंकड़े 2026-09-03 npm रजिस्ट्री और GitHub API के खिलाफ सत्यापित किए गए हैं। मुख्य पुस्तकालय BSD-3-Clause है; आधिकारिक React आवरण MIT है।

बिल्ड-बनाम-एडॉप्ट प्रश्न

संपादक इंजन के निर्माण के बिना एक Next.js पेज बिल्डर बनाएं

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

  • खींचें और छोड़ेंGrapesJS कोर
  • कैंवसGrapesJS कोर
  • घटक वृक्षGrapesJS कोर
  • चयन और होवरGrapesJS कोर
  • ब्लॉकGrapesJS कोर
  • बिछानाGrapesJS कोर
  • उत्तरदायी संपादनGrapesJS कोर
  • पूर्ववत करें / फिर से करेंGrapesJS कोर
  • संपत्ति प्रबंधनGrapesJS कोर
  • क्रमबद्धताGrapesJS कोर
  • आदेशGrapesJS कोर
  • प्लगइन सिस्टमGrapesJS कोर
  • भंडारGrapesJS कोर
  • बहु-पृष्ठ परियोजनाएंप्लगइन या एक्सटेंशन
  • टेम्पलेट लाइब्रेरीप्लगइन या एक्सटेंशन
  • उपयोगकर्ता और अनुमतियांआपका Next.js ऐप
  • प्रकाशन-व्‍यवसायआपका Next.js ऐप
इसे कौन बनाता हैआपका Next.js ऐपGrapesJS कोरप्लगइन या एक्सटेंशन

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

एक पेज बिल्डर एक विशेषता की तरह दिखता है और वास्तव में एक छोटा उत्पाद है। दृश्य भाग - ब्लॉकों का एक पैनल, एक कैनवास, एक स्टाइल साइडबार - एक दर्जन सबसिस्टम के शीर्ष पर बैठता है जो सभी को उपयोग करने योग्य लगने से पहले काम करना पड़ता है।

संपादक इंजन को फिर से बनाने के बजाय, GrapesJS का उपयोग करें और अपने उत्पाद पर ध्यान केंद्रित करें।

परिणाम

आप Next.js पेज बिल्डर के साथ क्या बना सकते हैं?

एक ही संपादक इंजन बहुत अलग उत्पादों का समर्थन करता है। उनके बीच क्या परिवर्तन होता है आपके द्वारा पंजीकृत किए गए ब्लॉक, किसे प्रकाशित करने की अनुमति है, और आउटपुट कहां जाता है।

Next.js लैंडिंग पेज बिल्डर

मार्केटिंग को अभियान पृष्ठों को विज़ुअल रूप से बनाने और संपादित करने दें, जबकि मार्ग, लेआउट और विश्लेषण आपके कोडबेस में बने रहें.

लैंडिंग पेज बिल्डर

Next.js CMS संपादक

सामग्री टीमों को अपने मौजूदा सामग्री मॉडल के शीर्ष पर दृश्य पृष्ठ संपादन दें, उन्हें रिपॉजिटरी दिए बिना।

हेडलेस CMS संपादक

Next.js SaaS पेज बिल्डर

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

SaaS पेज बिल्डर

Next.js वेबसाइट बिल्डर

उपयोगकर्ताओं को पूर्ण बहु-पृष्ठ साइटों - नेविगेशन, पृष्ठों, संपत्तियों - को इकट्ठा करने दें और उन्हें अपने स्वयं के डोमेन के तहत प्रकाशित करें।

ड्रैग एंड ड्रॉप बिल्डर

Next.js ईमेल बिल्डर

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

ईमेल बिल्डर

व्हाइट-लेबल पेज बिल्डर

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

व्हाइट-लेबल बिल्डर

दृश्य HTML संपादक

उन उपयोगकर्ताओं के लिए अंतर्निहित HTML और CSS को उजागर करें जो दृश्य परत से बाहर निकलना चाहते हैं और सीधे मार्कअप संपादित करना चाहते हैं।

दृश्य HTML संपादक

Next.js पेज बिल्डर

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

  • Drag & drop
  • Blocks
  • Layers
  • Style Manager
  • Responsive devices
  • Assets
  • Undo / redo

क्या होता है जब कोई उपयोगकर्ता किसी ब्लॉक को खींचता है

  1. Next.js application
  2. Client Component
  3. GrapesJS
  4. Project data
  5. Next.js API
  6. Database
  7. Publish

तीन जिम्मेदारियां, तीन मालिक।

Next.js रूटिंग, प्रमाणीकरण, डेटा फ़ेचिंग और तैनात सतह का मालिक है। GrapesJS कैनवास के अंदर सब कुछ का मालिक है। आपका API एक प्रोजेक्ट का मालिक है, इसे कौन संपादित कर सकता है और कब लाइव हो जाता है। नीचे दिया गया प्रत्येक अनुभाग उन तीन बक्सों में से एक है जो खोले गए हैं।

Next.js एप्लिकेशन को संभालता है। GrapesJS दृश्य संपादन को संभालता है। आपका बैकएंड दृढ़ता और प्रकाशन को संभालता है। उस श्रृंखला में कुछ भी आपको अपनी मौजूदा वास्तुकला को छोड़ने की आवश्यकता नहीं है।

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

GrapesJS Next.js आवेदन में कैसे फिट बैठता है

GrapesJS एक परत है, ढांचा नहीं। यह एक कैनवास को आपके द्वारा दिए गए DOM नोड में प्रस्तुत करता है और उस कैनवास में हर चीज के लिए API को उजागर करता है। रूटिंग के बारे में इसकी कोई राय नहीं है, आपके डेटाबेस के बारे में कोई राय नहीं है, और आपके बाकी ऐप के साथ उस तत्व से परे कोई रनटाइम संबंध नहीं है जो इसे सौंपा गया था।

NEXT.JS

  • App Router
  • Authentication
  • Users
  • Permissions
  • API
  • Database
  • Billing
  • Publishing

CLIENT EDITOR

GRAPESJS

  • Canvas
  • Components
  • Blocks
  • Style Manager
  • Assets
  • Commands
  • Storage

यही कारण है कि एकीकरण छोटा है। संपादक एक समृद्ध API के साथ एक क्लाइंट-साइड विजेट है - कोड संपादक या चार्टिंग लाइब्रेरी के समान आकार, प्रतिस्पर्धी एप्लिकेशन फ्रेमवर्क नहीं। वह सब कुछ जो आपके उत्पाद को आपका बनाता है, लाइन के Next.js पक्ष पर रहता है।

GrapesJS + React एकीकरण

GrapesJS Next.js की जगह नहीं लेता है। यह आपके एप्लिकेशन के लिए आवश्यक विज़ुअल संपादन परत जोड़ता है।

जल्दी शुरू

GrapesJS Next.js App Router के साथ प्रयोग करें

GrapesJS को एक ब्राउज़र की आवश्यकता है। यह तत्वों को मापता है, श्रोताओं को जोड़ता है और जिस क्षण यह आरंभ होता है DOM को उत्परिवर्तित करता है, इसलिए संपादक Client Component के अंदर आता है और इसका सेटअप एक प्रभाव के अंदर होता है। यही पूरी बाधा है - बाकी सब कुछ सामान्य है React।

npm install grapesjs
components/GrapesEditor.tsxtsx
'use client';

import { useEffect, useRef } from 'react';
import grapesjs, { type Editor } from 'grapesjs';
import 'grapesjs/dist/css/grapes.min.css';

export default function GrapesEditor() {
  const containerRef = useRef<HTMLDivElement>(null);
  const editorRef = useRef<Editor | null>(null);

  useEffect(() => {
    if (!containerRef.current) return;

    // Runs only in the browser: effects never execute during SSR.
    const editor = grapesjs.init({
      container: containerRef.current,
      height: '100vh',
      storageManager: false,
      blockManager: {
        blocks: [
          {
            id: 'section',
            label: 'Section',
            content: '<section class="py-16"><h2>Headline</h2></section>',
          },
          { id: 'text', label: 'Text', content: '<p>Edit me</p>' },
        ],
      },
    });

    editorRef.current = editor;

    // Strict Mode mounts twice in development; without this you get two editors.
    return () => {
      editor.destroy();
      editorRef.current = null;
    };
  }, []);

  return <div ref={containerRef} />;
}
ऐप/एडिटर/पेज.टीएसएक्सtsx
import GrapesEditor from '@/components/GrapesEditor';

// A Server Component. It renders the Client Component; it never touches
// the editor instance, and no 'use client' is needed here.
export default function EditorPage() {
  return <GrapesEditor />;
}

उदाहरण इस तरह क्यों दिखता है

'use client'

मॉड्यूल को Client Component के रूप में चिह्नित करता है ताकि React हुक उपलब्ध हों और कोड ब्राउज़र को भेजा जाता है।

useRef, useState नहीं

संपादक उदाहरण डेटा प्रस्तुत नहीं करता है। इसे राज्य अनुसूची में रखना बिना किसी लाभ के हर परिवर्तन पर एक पुनः प्रस्तुत करता है।

useEffect

सर्वर रेंडरिंग के दौरान प्रभाव कभी नहीं चलते हैं, इसलिए DOM मौजूद होने के बाद ही आरंभीकरण होने की गारंटी है।

editor.destroy()

React Strict Mode विकास में दो बार घटकों को माउंट करता है। सफाई के बिना आपको एक नोड पर दो संपादक ढेर हो जाते हैं।

वह एक कार्यशील संपादक है। इस पृष्ठ का बाकी हिस्सा उन चार चीजों के बारे में है जिन्हें आप आगे जोड़ते हैं: परियोजना कहां संग्रहीत है, उपयोगकर्ता क्या खींच सकते हैं, जब वे प्रकाशित करते हैं तो क्या होता है, और उनमें से कौन सा आपको स्वयं लिखने की आवश्यकता नहीं है।

रूटिंग

App Router बनाम Pages Router

दोनों काम करते हैं। वे इस बात में भिन्न होते हैं कि ग्राहक की सीमा कहाँ खींची गई है, और यही अंतर है कि वेब पर इतनी GrapesJS + Next.js सलाह एक आधुनिक परियोजना पर विफल हो जाती है।
अधिक:

App Router

A Client Component संपादक को रखता है; इसके चारों ओर का मार्ग Server Component रहता है। किसी गतिशील आयात की आवश्यकता नहीं है, क्योंकि संपादक पहले से ही केवल ब्राउज़र में आरंभ किया गया है।

tsx
// components/GrapesEditor.tsx
'use client';
// …useRef + useEffect + grapesjs.init()

// app/editor/page.tsx — stays a Server Component
import GrapesEditor from '@/components/GrapesEditor';
export default function Page() {
  return <GrapesEditor />;
}
  • 'use client' निर्देश सीमा को चिह्नित करता है - इसके नीचे की हर चीज ब्राउज़र को भेजी जाती है।
  • रूट फ़ाइल Server Component रहती है और संपादक को प्रस्तुत करने से पहले प्रमाण, पैरा और डेटा की प्रतीक्षा कर सकती है।
  • एक Client Component अभी भी डिफ़ॉल्ट रूप से सर्वर पर पूर्व-प्रस्तुत किया जाता है। प्रभाव नहीं हैं, जो केवल grapesjs.init() ब्राउज़र को रखता है।
  • next/dynamic के साथ ssr: false को Server Component के अंदर अस्वीकार कर दिया जाता है — Next.js आपको इसे Client Component में ले जाने के लिए कहता है।
Legacy

Pages Router

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

pages/editor.tsxtsx
import dynamic from 'next/dynamic';

// In the Pages Router every page is a client entry point, so ssr: false
// is allowed here — and skips the prerender pass entirely.
const GrapesEditor = dynamic(() => import('@/components/GrapesEditor'), {
  ssr: false,
  loading: () => <p>Loading editor…</p>,
});

export default function EditorPage() {
  return <GrapesEditor />;
}
  • ssr: false की अनुमति है और सर्वर रेंडर पास को पूरी तरह से छोड़ देता है।
  • लोडिंग विकल्प आपको एक प्लेसहोल्डर देता है जबकि संपादक चंक डाउनलोड करता है।
  • एक ही GrapesEditor घटक अपरिवर्तित काम करता है - केवल जिस तरह से इसे आयात किया जाता है वह अलग होता है।

यदि आप माइग्रेट कर रहे हैं, तो डायनेमिक () रैपर को पार न करें। App Router में यह या तो Server Component के अंदर पूरी तरह से विफल हो जाता है या डुप्लिकेट काम करता है जो 'use client' पहले से ही करता है।

सर्वर घटक

GrapesJS और React Server Components

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

जहां सीमा बैठती है

  1. Server Component
  2. Page / data
  3. Client Component
  4. GrapesJS editor
ऐप/प्रोजेक्ट्स/[प्रोजेक्टआईडी]/एडिटर/पेज.टीएसएक्सtsx
import GrapesEditor from '@/components/GrapesEditor';

export default async function EditorPage({
  params,
}: {
  params: Promise<{ projectId: string }>;
}) {
  const { projectId } = await params;

  // Server side: auth, permissions and data fetching stay here.
  const res = await fetch(`${process.env.API_URL}/projects/${projectId}`, {
    cache: 'no-store',
  });
  const initialProject = await res.json();

  // The Client Component receives plain, serialisable props.
  return <GrapesEditor projectId={projectId} initialProject={initialProject} />;
}
  • प्रमाणीकरण और अनुमति जांच सर्वर पर चलती है, इससे पहले कि संपादक बंडल डाउनलोड करने लायक हो।
  • परियोजना का प्रारंभिक डेटा सर्वर-साइड प्राप्त किया जाता है और एक सादे, क्रमबद्ध प्रोप के रूप में पारित किया जाता है।
  • संपादक का उदाहरण Client Component के अंदर रहता है। इसके बारे में कुछ भी धारावाहिक नहीं है, इसलिए इसके बारे में कुछ भी सीमा पार नहीं करता है।
  • Server Actions को सहेजने के लिए क्लाइंट घटक से कॉल किया जा सकता है - वे सीमा के क्लाइंट पक्ष पर केवल कार्य हैं।

आसपास के एप्लिकेशन के लिए Server Components का उपयोग करते समय संपादक क्लाइंट-साइड रखें।

SSR

क्या GrapesJS Next.js SSR के साथ काम करता है?

हां, लेकिन संपादक को क्लाइंट पर ही इनिशियलाइज़ किया जाना चाहिए क्योंकि यह ब्राउज़र APIs और DOM पर निर्भर करता है।

उस उत्तर का उपयोगी संस्करण अधिक विशिष्ट है, क्योंकि इसके दो हिस्से अलग-अलग तरीके से विफल होते हैं।

स्थानीय रूप से पुनः प्रस्तुत किया गया

runtime
Node 20, no DOM
grapesjs
0.23.6
import
import('grapesjs') → resolves
init
grapesjs.init() → ReferenceError: document is not defined

2026-09-02

लाइब्रेरी को DOM-कम रनटाइम में आयात करना ठीक है। init() कॉल करना नहीं है। इसलिए नियम "GrapesJS को सर्वर से दूर रखें" नहीं है - यह "init() को रेंडर पथ से बाहर रखें" है, जिसकी पहले से ही गारंटी है।

  • आयात सुरक्षित है। GrapesJS को एक मॉड्यूल में बंडल करना जिसका सर्वर मूल्यांकन भी करता है, फेंकता नहीं है।
  • आरंभीकरण नहीं है। grapesjs.init() दस्तावेज़ पढ़ता है, इसलिए इसे माउंट के बाद चलना चाहिए - जो कि useEffect का अर्थ है।
  • 'use client' "केवल क्लाइंट" के समान नहीं है। Client Components सर्वर पर पहले से प्रस्तुत किए जाते हैं; प्रभाव वह है जो वहां नहीं चलता है।
  • इसलिए dynamic(..., { ssr: false }) App Router में वैकल्पिक है। संपादक के हिस्से को प्रारंभिक पेलोड से बाहर रखने के लिए इसके लिए पहुंचें, न कि किसी दुर्घटना को ठीक करने के लिए।
  • एक प्रकाशित पृष्ठ को प्रस्तुत करना पूरी तरह से एक अलग समस्या है - नीचे देखें। उस पृष्ठ को किसी संपादक रनटाइम की आवश्यकता नहीं है, इसलिए इसे किसी और चीज़ की तरह स्थिर रूप से उत्पन्न किया जा सकता है।
संलेखन बनाम सेवारत

आपका संपादक आपका प्रकाशित पृष्ठ होना जरूरी नहीं है

यह जल्दी सही होने के लिए सबसे उपयोगी चीज है, और गलत होने में सबसे आसान है। संपादक एक संलेखन वातावरण है। प्रकाशित पृष्ठ आपके स्वयं के Next.js रेंडरिंग आर्किटेक्चर का उपयोग कर सकता है - स्थिर पीढ़ी, स्ट्रीमिंग, पुनर्वैधीकरण, एज कैशिंग, यह सब।

लेखन

  1. GrapesJS
  2. Project data
  3. Database

परोसना

  1. Publish
  2. HTML + CSS
  3. Public page
दो पाइपलाइनें, एक कलाकृति उनके बीच से गुजर रही है। केवल पहले को GrapesJS की जरूरत है।
ऐप/पी/[स्लग]/पेज.टीएसएक्सtsx
// The public route. GrapesJS is not imported here, so the editor
// bundle never reaches a visitor.
export const revalidate = 3600;

export default async function PublishedPage({
  params,
}: {
  params: Promise<{ slug: string }>;
}) {
  const { slug } = await params;
  const res = await fetch(`${process.env.API_URL}/published/${slug}`, {
    next: { revalidate: 3600 },
  });

  // Already sanitised on the way in — see the publish route below.
  const { html, css } = await res.json();

  return (
    <>
      <style dangerouslySetInnerHTML={{ __html: css }} />
      <div dangerouslySetInnerHTML={{ __html: html }} />
    </>
  );
}

GrapesJS को कभी भी किसी विज़िटर द्वारा खोले गए पृष्ठ पर नहीं चलना पड़ता है। संपादक को उन मुट्ठी भर लोगों के पास भेजें जो संपादन करते हैं, और सादे HTML और CSS को बाकी सभी के लिए भेजते हैं।

दृढ़ता

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

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

  1. GrapesJS
  2. Project data
  3. Next.js API
  4. Your backend
  5. Database
संपादक आपके डेटाबेस से कभी बात नहीं करता है। यह एक मार्ग से बात करता है, जो आप वास्तव में जो कुछ भी उपयोग करते हैं उससे बात करता है।
components/GrapesEditor.tsx — भंडारणts
const editor = grapesjs.init({
  container: containerRef.current,
  storageManager: {
    type: 'nextjs-api',
    autosave: true,
    stepsBeforeSave: 5,
  },
  plugins: [
    // Registered as a plugin so the adapter exists before the first load.
    (editor) => {
      editor.Storage.add('nextjs-api', {
        async load() {
          const res = await fetch(`/api/projects/${projectId}`);
          return res.ok ? res.json() : {};
        },
        async store(project) {
          await fetch(`/api/projects/${projectId}`, {
            method: 'PUT',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(project),
          });
        },
      });
    },
  ],
});
ऐप/एपीआई/प्रोजेक्ट्स/[प्रोजेक्टआईडी]/route.tsts
import { NextResponse } from 'next/server';

// Your own persistence layer — Postgres, MySQL, Mongo, S3, a headless CMS.
// GrapesJS never talks to it; it only ever talks to this route.
import { loadProject, saveProject } from '@/lib/projects';
import { requireProjectAccess } from '@/lib/auth';

export async function GET(
  _request: Request,
  { params }: { params: Promise<{ projectId: string }> },
) {
  const { projectId } = await params;
  await requireProjectAccess(projectId);

  return NextResponse.json(await loadProject(projectId));
}

export async function PUT(
  request: Request,
  { params }: { params: Promise<{ projectId: string }> },
) {
  const { projectId } = await params;
  await requireProjectAccess(projectId);

  const project = await request.json();
  if (typeof project !== 'object' || project === null) {
    return NextResponse.json({ error: 'Invalid project' }, { status: 400 });
  }

  await saveProject(projectId, project);
  return NextResponse.json({ ok: true });
}
  • लोड: एडॉप्टर का load() init पर चलता है और उस प्रोजेक्ट को पुनर्स्थापित करता है जिस पर उपयोगकर्ता आखिरी बार काम कर रहा था।
  • सहेजें: store() पूरी परियोजना को JSON के रूप में प्राप्त करता है। संपादक में विफलता को सामने लाने के लिए एक अस्वीकृत वादा लौटाएं।
  • ऑटोसेव: autosave stepsBeforeSave बैचों के साथ परिवर्तन होता है ताकि आप हर कीस्ट्रोक पर न लिख सकें।
  • ड्राफ़्ट: ड्राफ़्ट प्रोजेक्ट और प्रकाशित आउटपुट को अलग-अलग कॉलम में रखें, इसलिए संपादन कभी भी विज़िटर जो देखते हैं उसे परिवर्तित नहीं करता है।
  • संस्करण: प्रोजेक्ट डेटा एक JSON दस्तावेज़ है — संस्करणों की एक परिशिष्ट-केवल तालिका में एक सम्मिलित करने की लागत आती है और रोलबैक खरीदती है।
  • प्रकाशन: अपनी अनुमति जांच के साथ एक अलग समापन बिंदु, सहेजें मार्ग पर ध्वज नहीं।

उदाहरण: Supabase के साथ परियोजनाओं का भंडारण

लिब/projects.tsts
import { createClient } from '@supabase/supabase-js';

const supabase = createClient(
  process.env.SUPABASE_URL!,
  process.env.SUPABASE_SERVICE_ROLE_KEY!, // server only — never NEXT_PUBLIC_
);

export async function loadProject(projectId: string) {
  const { data } = await supabase
    .from('projects')
    .select('project')
    .eq('id', projectId)
    .single();

  return data?.project ?? {};
}

export async function saveProject(projectId: string, project: unknown) {
  await supabase
    .from('projects')
    .upsert({ id: projectId, project, updated_at: new Date().toISOString() });
}

यह loadProject और saveProject को आयात के ऊपर के मार्ग की सीमा को लागू करता है। Prisma, Drizzle, Mongo, DynamoDB या REST कॉल के लिए किसी मौजूदा बैकएंड पर बॉडी को स्वैप करें और पृष्ठ पर और कुछ भी नहीं बदलता है।

उदाहरण: प्रोजेक्ट स्टोरेज को Vercel/Next.js परिनियोजन से जोड़ना

प्रकाशन लिखता है HTML और CSS आपका सार्वजनिक मार्ग वापस पढ़ता है। पुनर्वैधीकरण, कैशिंग और रेंडरिंग रणनीति सामान्य Next.js चिंताएँ बनी रहती हैं - संपादक अनुरोध पथ में नहीं है।

प्रकाशित-पृष्ठ मार्ग देखें

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

कैनवास का विस्तार

अपने Next.js पेज बिल्डर के लिए कस्टम घटक बनाएं

बॉक्स से बाहर कैनवास उपयोगकर्ताओं को सामान्य HTML देता है। कस्टम घटक प्रकार वे हैं कि संपादक इसके बजाय आपके उत्पाद के मार्कअप का उत्पादन कैसे शुरू करता है - वही अनुभाग जो आपका Next.js ऐप पहले से ही प्रस्तुत करता है, केवल उन गुणों के साथ जिन्हें आप उजागर करने का निर्णय लेते हैं।

एक घटक प्रकार पंजीकृत करनाts
// Your design system, expressed as something users can drop in,
// edit and style — but not break.
editor.Components.addType('pricing-table', {
  isComponent: (el) =>
    el.tagName === 'SECTION' && el.classList.contains('pricing'),

  model: {
    defaults: {
      tagName: 'section',
      classes: ['pricing'],
      // Structure the user cannot accidentally dismantle.
      droppable: false,
      // Fields exposed in the Settings panel.
      traits: [
        { name: 'plan', label: 'Plan name', type: 'text' },
        { name: 'price', label: 'Price', type: 'text' },
        { name: 'billing', label: 'Billing period', type: 'select',
          options: [
            { id: 'month', label: 'Monthly' },
            { id: 'year', label: 'Yearly' },
          ] },
      ],
      components: [
        { type: 'text', tagName: 'h3', content: 'Starter' },
        { type: 'text', tagName: 'p', content: '$19 / month' },
        { type: 'link', content: 'Choose plan', attributes: { href: '#' } },
      ],
    },
  },
});

सामान्य कस्टम घटक

  • Hero — शीर्षक, उप-शीर्षक, पृष्ठभूमि और कार्रवाई के लिए एक कॉल
  • मूल्य निर्धारण तालिका - योजनाएँ, मूल्य और संपादन योग्य फ़ील्ड के रूप में बिलिंग अवधि
  • उत्पाद कार्ड — टाइप किए गए पाठ के बजाय वास्तविक उत्पाद ID से बंधा हुआ
  • फ़ीचर ग्रिड — बच्चों की एक चर संख्या के साथ एक निश्चित लेआउट
  • प्रपत्र — फ़ील्ड उपयोगकर्ता आपके सबमिशन समापन बिंदु पर व्यवस्थित कर सकते हैं, वायर्ड कर सकते हैं
  • नेविगेशन — आपके मार्गों से खींचा गया है ताकि लिंक बासी न हो सकें
  • एप्लिकेशन घटक - एक चार्ट, एक बुकिंग विजेट, कुछ भी आपका SaaS पहले से ही शिप करता है

कस्टम घटक यह हैं कि संपादक आपके डिज़ाइन सिस्टम और आपके व्यवसाय मॉडल से कैसे मेल खाता है। droppable: गलत उपयोगकर्ता को संरचना को नष्ट करने से रोकता है; traits तय करें कि वे कौन से गुण बदल सकते हैं।

एक ब्लॉक लाइब्रेरी बनाएं

ब्लॉक वे हैं जो उस पैनल में दिखाई देते हैं जिससे उपयोगकर्ता खींचता है। घटक प्रकार मौजूद होने के बाद एक को पंजीकृत करने में कुछ पंक्तियाँ खर्च होती हैं।

एक ब्लॉक पंजीकृत करनाts
// A block is what the user drags. A component is what it becomes.
editor.Blocks.add('pricing-table', {
  label: 'Pricing table',
  category: 'Marketing',
  media: '<svg viewBox="0 0 24 24" width="24" height="24">' +
    '<rect x="3" y="4" width="18" height="16" rx="2" fill="currentColor"/></svg>',
  content: { type: 'pricing-table' },
});

ब्लॉक घटक नहीं हैं

  • एक ब्लॉक एक प्रारंभिक बिंदु है - एक लेबल, एक आइकन और वह सामग्री जो इसे सम्मिलित करती है। यह पैनल में मौजूद है, पृष्ठ में नहीं।
  • एक घटक संपादक के अंदर एक संरचित तत्व है, जिसका अपना मॉडल, traits और नियम हैं। यह एक बार डालने के बाद पृष्ठ में मौजूद होता है।
  • एक घटक प्रकार कई ब्लॉक (एक दो-कॉलम और एक तीन-कॉलम मूल्य निर्धारण तालिका) का समर्थन कर सकता है, और एक ब्लॉक घटकों के पूरे पेड़ को सम्मिलित कर सकता है।
  • पुनः प्रयोज्य अनुभाग — hero, सुविधाएँ, प्रशंसापत्र, पाद लेख
  • मार्केटिंग ब्लॉक - मूल्य निर्धारण तालिकाएं, लोगो दीवारें, कार्रवाई के लिए कॉल
  • लेआउट ब्लॉक - कॉलम, स्पेसर, कंटेनर
  • प्रपत्र — संपर्क, साइनअप, बहु-चरण
  • ईकॉमर्स ब्लॉक — उत्पाद ग्रिड, कार्ट सारांश, चेकआउट संकेत
  • एप्लिकेशन ब्लॉक — आपका उत्पाद जो कुछ भी करता है वह एक पृष्ठ दिखाने में सक्षम होना चाहिए

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

Asset Manager चयन और सम्मिलन को संभालता है। फ़ाइलें कहाँ रहती हैं, उन्हें कौन अपलोड कर सकता है और जिसके माध्यम से अनुमति है वह अनुबंध का आपका पक्ष है।

Asset Manager — कस्टम अपलोडts
assetManager: {
  // The library the user already has, loaded from your backend.
  assets: initialAssets,

  uploadFile: async (event) => {
    const files = event.dataTransfer
      ? event.dataTransfer.files
      : (event.target as HTMLInputElement).files;
    if (!files) return;

    const body = new FormData();
    Array.from(files).forEach((file) => body.append('files', file));

    // Your route authenticates the user and validates type and size
    // before anything is written to storage.
    const res = await fetch('/api/assets', { method: 'POST', body });
    const { urls } = await res.json();

    editor.AssetManager.add(urls);
  },
},
  1. GrapesJS Asset Manager
  2. Next.js API
  3. Your storage
  4. CDN
अपलोड एक बार ब्राउज़र छोड़ देते हैं और आपके द्वारा लिखे गए मार्ग पर उतरते हैं।
  • अपने स्वयं के रूट हैंडलर के माध्यम से अपलोड करें ताकि सत्र कुकी, दर सीमा और ऑडिट लॉग सभी लागू हों।
  • उन टीमों के लिए बाहरी URL की अनुमति दें जो पहले से ही कहीं और छवियों को होस्ट करती हैं.
  • उपयोगकर्ता की मौजूदा लाइब्रेरी को प्रीलोड करें ताकि पिकर उनकी संपत्ति पर खुल जाए, न कि एक खाली पैनल।
  • सर्वर पर MIME प्रकार और आकार को मान्य करें। संपादक का फ़ाइल इनपुट एक सुझाव है, नियंत्रण नहीं।
  • CDN से परोसें और प्रोजेक्ट में CDN URL संग्रहीत करें, इसलिए प्रकाशित पृष्ठ कभी भी मीडिया के लिए आपके मूल स्थान पर न आएं।
  • बड़े पुस्तकालयों को पृष्ठांकित करें - परिसंपत्ति पैनल खुशी-खुशी दस हजार थंबनेल प्रस्तुत करने का प्रयास करेगा।
डेटा मॉडल

प्रोजेक्ट डेटा बनाम HTML और CSS

संपादक दो अलग-अलग चीजें पैदा करता है और वे विनिमेय नहीं हैं। गलत को संग्रहीत करना वह गलती है जो "अपने पृष्ठ को संपादित करें" को "शुरू करें" में बदल देती है।

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

घटकों, शैलियों, पृष्ठों और संपत्तियों का वर्णन करने वाला एक JSON दस्तावेज़। यह संपादन योग्य स्रोत है - एकमात्र कलाकृति जो संपादन सत्र को ठीक उसी तरह पुनर्स्थापित कर सकती है जैसे उपयोगकर्ता ने इसे छोड़ा था।

HTML

कैनवास की प्रदान की गई सामग्री। आगंतुकों को सेवा देने के लिए बिल्कुल सही, स्रोत के रूप में हानिपूर्ण: घटक प्रकार, traits और संपादक स्थिति चली गई है।

CSS

संपादक द्वारा उत्पन्न स्टाइलशीट, जिसमें प्रत्येक ब्रेकपॉइंट के नियम शामिल हैं। HTML के साथ परोसा जाता है, जब भी आप प्रकाशित करते हैं तो पुनः उत्पन्न होता है।

दोनों कलाकृतियाँ, एक संपादक सेts
// Project data — the editable source. This is what you store.
const project = editor.getProjectData();

// HTML and CSS — the rendered output. Generate this when you publish.
const html = editor.getHtml();
const css = editor.getCss();

// Reopening an editing session needs the project data, not the HTML:
editor.loadProjectData(project);

संपादन

  1. User edits
  2. Project data
  3. Database

प्रतिपादन

  1. Project data
  2. HTML + CSS
  3. Preview / publish

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

कार्यप्रवाह

ड्राफ्ट से प्रकाशित पृष्ठ तक

  1. 1
    संपादित करें

    उपयोगकर्ता संपादक में काम करता है

    परियोजना डेटा में परिवर्तन जमा होते हैं। एक आगंतुक अभी तक कुछ भी नहीं देखता है।

  2. 2
    ड्राफ्ट सहेजें

    स्वतः सहेजें परियोजना लिखता है

    आपका स्टोरेज एडाप्टर प्रोजेक्ट JSON को आपके API पर डिबाउंस या स्टेप काउंट पर पोस्ट करता है।

  3. 3
    पूर्वसमीक्षा

    मसौदे को उस तरह से प्रस्तुत करें जिस तरह से एक आगंतुक करेगा

    एक निजी मार्ग जो मसौदा परियोजना से HTML और CSS उत्पन्न करता है - वही कोड पथ प्रकाशन का उपयोग करता है, बिना लिखे के।

  4. 4
    स्‍वीकृति

    जो कोई भी पृष्ठ का मालिक है वह इसे बंद कर देता है

    वैकल्पिक, और पहली बार जोड़ने लायक है जब कोई टूटी हुई मूल्य निर्धारण तालिका प्रकाशित करता है।

  5. 5
    प्रकाशित करना

    आउटपुट फ्रीज करें

    HTML और CSS उत्पन्न करें, सैनिटाइज़ करें, एक नए संस्करण के रूप में स्टोर करें, और उस पर लाइव स्लग को इंगित करें।

  6. 6
    रोलबैक

    स्लग को किसी पुराने संस्करण पर इंगित करें

    सस्ता अगर प्रत्येक प्रकाशन एक अद्यतन के बजाय एक सम्मिलित था। बाद में जोड़ना महंगा है।

ऐप/एपीआई/पब्लिश/route.tsts
import { NextResponse } from 'next/server';
import sanitizeHtml from 'sanitize-html';

import { publishPage } from '@/lib/projects';
import { requireProjectAccess } from '@/lib/auth';

export async function POST(request: Request) {
  const { projectId, html, css } = await request.json();

  // Permissions are enforced here, not by hiding a button in the editor.
  const user = await requireProjectAccess(projectId);

  if (typeof html !== 'string' || typeof css !== 'string') {
    return NextResponse.json({ error: 'Invalid payload' }, { status: 400 });
  }

  // Sanitise on the way in, once — not on every render.
  const page = await publishPage({
    projectId,
    html: sanitizeHtml(html),
    css,
    publishedBy: user.id,
  });

  return NextResponse.json({ url: `/p/${page.slug}` });
}
कैटलॉग

प्लगइन्स के साथ अपने Next.js पेज बिल्डर का विस्तार करें

GrapesJS संपादक इंजन प्रदान करता है। प्लगइन्स एक विशिष्ट उत्पाद की आवश्यकता वाली विशेष कार्यक्षमता जोड़ते हैं - और पहले सप्ताह के बाद भी एक पेज बिल्डर की कमी में से अधिकांश पहले से ही एक के रूप में मौजूद है।

ब्राउज़ करें GrapesJS प्लगइन्स
बाज़ार

Next.js बिल्ड के लिए प्लगइन्स

GJS.Market कैटलॉग से लाइव लिस्टिंग, संपादक माउंट होने के बाद एक Next.js टीम द्वारा पूछे जाने वाले प्रश्न द्वारा समूहीकृत की जाती है।

स्कोप नियंत्रण

हर सुविधा को स्वयं न बनाएं

प्लगइन्स विकास कार्य को खत्म नहीं करते हैं। वे बदलते हैं कि यह किस तरह का काम है, और यह अंतर उत्पाद के जीवन पर बढ़ जाता है।
घर में लिखित

इसे स्वयं बनाएं

आपके द्वारा लिखी गई प्रत्येक क्षमता एक स्थायी पंक्ति वस्तु बन जाती है।

    कैटलॉग से

    एक प्लगइन स्थापित करें

    किसी ने पहले ही आपके संपादक के सामान्य आधे हिस्से को हल कर लिया है।

      संपादक के लिए GrapesJS कोर का उपयोग करें और केवल वही क्षमताएं जोड़ें जिनकी आपके उत्पाद को वास्तव में आवश्यकता है।

      निर्णय

      स्क्रैच से एक Next.js पेज बिल्डर बनाएं या GrapesJS का उपयोग करें?

      क्षमता के आधार पर, आप क्या लिखने के लिए साइन अप करेंगे। "एक्स्टेंसिबल" का अर्थ है कि लाइब्रेरी इंटरफ़ेस और डिफ़ॉल्ट प्रदान करती है, और आपसे इसे अपने बैकएंड पर इंगित करने की अपेक्षा करती है।

      योग्‍यताअपने आप को बनाएंGrapesJS
      कैंवसनिर्माणशामिल
      खींचें और छोड़ेंनिर्माणशामिल
      अवयवनिर्माणशामिल
      ब्लॉकनिर्माणशामिल
      बिछानानिर्माणशामिल
      उत्तरदायी संपादननिर्माणशामिल
      संपत्तिनिर्माणएक्स्टेंसिबल
      भंडारनिर्माणएक्स्टेंसिबल
      आदेशनिर्माणशामिल
      प्लगइन्सपारिस्थितिकी तंत्र का निर्माण करेंप्लगइन आर्किटेक्चर

      GrapesJS API पर 2026-09-02 के विरुद्ध सत्यापित किया गया।

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

      वाणिज्यिक उत्पाद

      Next.js के साथ एक SaaS पेज बिल्डर बनाएं

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

      NEXT.JS

      • Authentication
      • Organizations
      • Users
      • Permissions
      • Billing
      • Editor

      GRAPESJS

      PROJECT API

      • Database
      • Publishing
      • बहु-उपयोगकर्ता: कई लोग अलग-अलग परियोजनाओं को संपादित करते हैं, और अंततः एक ही।
      • अनुमतियाँ: कौन संपादित कर सकता है, कौन प्रकाशित कर सकता है, जो केवल देख सकता है। लागू सर्वर-साइड।
      • संगठन और टीमें: प्रोजेक्ट एक खाते से संबंधित होते हैं, किसी व्यक्ति के नहीं।
      • बिलिंग: परियोजनाओं, पृष्ठों, सीटों या प्रकाशित डोमेन की गणना के रूप में व्यक्त की गई योजना सीमाएं।
      • प्रकाशन: वह चरण जहां आपका उत्पाद लाइव होने वाली चीज़ों की ज़िम्मेदारी लेता है.
      • व्हाइट-लेबल: आपके पैनल, आपके आइकन, आपके रंग - संपादक को बोल्ट नहीं दिखना चाहिए।

      संपादक आपके आवेदन में एक मार्ग है। इसके आस-पास सब कुछ वही है जो आप वास्तव में बेच रहे हैं।

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

      प्रदर्शन और सुरक्षा संबंधी विचार

      पहले वास्तविक उपयोगकर्ता द्वारा संपादक खोलने से पहले पढ़ने लायक दो सूचियाँ हैं, बाद में नहीं।

      प्रदर्शन

      संपादक को तेज़ रास्ते से दूर रखें

      GrapesJS एक पर्याप्त क्लाइंट-साइड लाइब्रेरी है। यह एक संलेखन मार्ग पर ठीक है और हर जगह महंगा है।

      • आलसी-लोड GrapesJS इसलिए इसका हिस्सा संपादक मार्ग के साथ लाया जाता है, ऐप शेल के साथ नहीं।
      • केवल तभी प्रारंभ करें जब संपादक की वास्तव में आवश्यकता हो - न कि डैशबोर्ड पर जो केवल इससे लिंक करता है।
      • संपादक इंस्टेंस को React स्थिति से बाहर रेफरी में रखें।
      • संपादक के स्वामित्व वाले घटक को फिर से प्रस्तुत करने से बचें; GrapesJS जीवनचक्र React नहीं है।
      • आलसी-लोड भारी प्लगइन्स उन सभी को init पर पंजीकृत करने के बजाय।
      • पूरी लाइब्रेरी को पैनल में लोड करने के बजाय बड़े परिसंपत्ति संग्रह को पृष्ठांकित करें।

      संपादक एक संलेखन उपकरण है। आपको आमतौर पर प्रत्येक प्रकाशित पृष्ठ पर पूर्ण संपादक रनटाइम की आवश्यकता नहीं होती है।

      प्रतिभूति

      संपादक आउटपुट को उपयोगकर्ता इनपुट के रूप में मानें

      क्योंकि यह है। कैनवास द्वारा उत्पादित कुछ भी ब्राउज़र से नेटवर्क पर आया जिसे आप नियंत्रित नहीं करते हैं।

      • इसे संग्रहीत करने से पहले उत्पन्न या उपयोगकर्ता द्वारा प्रदान किए गए HTML को साफ करें, जहां भी इसे मार्कअप के रूप में प्रस्तुत किया जाएगा।
      • अपलोड की गई संपत्ति सर्वर-साइड को मान्य करें: MIME प्रकार, आकार, और आप क्या वापस सेवा करने को तैयार हैं।
      • हर स्टोरेज एंडपॉइंट को प्रमाणित करें. किसी यूआरएल में प्रोजेक्ट आईडी प्राधिकरण नहीं है.
      • अनुमतियाँ सर्वर-साइड लागू करें; एक छिपा हुआ प्रकाशन बटन एक UI वरीयता है, नियंत्रण नहीं।
      • प्रोजेक्ट डेटा को लिखने से पहले और फिर से उससे रेंडर करने से पहले उसके आकार को मान्य करें।
      • प्रकाशन समापन बिंदुओं को बचत से अलग से सुरक्षित रखें — उनके पास अलग-अलग ब्लास्ट त्रिज्या है।
      • प्रकाशित मार्कअप प्रस्तुत करने वाले मार्गों के लिए Content Security Policy सेट करें।

      क्लाइंट-साइड एडिटर स्टेट पर कभी भरोसा न करें। संपादक लेखक के लिए एक सुविधा है, सीमा नहीं।

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

      सामान्य Next.js + GrapesJS गलतियाँ

      इस स्टैक के लिए रिपोर्ट की गई लगभग हर एकीकरण विफलता निम्नलिखित सात में से एक है।

      • गलती

        GrapesJS को Server Component के अंदर आरंभ करना

        Server Components में कोई हुक नहीं है, कोई प्रभाव नहीं है और कोई DOM नहीं है। आयात हल हो सकता है, लेकिन संपादक के लिए माउंट करने के लिए कहीं नहीं है।

        ठीक करना

        संपादक के स्वामित्व वाले मॉड्यूल के शीर्ष पर Client Component 'use client' का उपयोग करें।

      • गलती

        DOM मौजूद होने से पहले आरंभ करना

        रेंडर के दौरान init() कॉल करना, या एक रेफरी के खिलाफ जो अभी भी शून्य है, विफल हो जाता है क्योंकि कंटेनर तत्व अभी तक नहीं बनाया गया है।

        ठीक करना

        माउंट के बाद इनिशियलाइज़ करें, useEffect के अंदर, और रेफ के मौजूद होने पर गार्ड करें।

      • गलती

        GrapesJS के दौरान SSR चलाना

        सर्वर तक पहुंचने वाली init() पर कोई भी कॉल ReferenceError: दस्तावेज़ परिभाषित नहीं है। अकेले आयात हानिरहित है।

        ठीक करना

        संपादक आरंभीकरण क्लाइंट-साइड रखें। एक प्रभाव पर्याप्त है; गतिशील आयात एक अनुकूलन है, फिक्स नहीं।

      • गलती

        संपादक इंस्टेंस को React स्थिति में रखना

        संपादक एक बड़ी परिवर्तनशील वस्तु है जो लगातार बदलती रहती है। इसे राज्य शेड्यूल में संग्रहीत करने से कुछ भी हासिल नहीं होता है।

        ठीक करना

        रेफरी का प्रयोग करें। उन चीजों के लिए राज्य रखें जो UI वास्तव में प्रस्तुत करता है, जैसे कि एक बचत संकेतक।

      • गलती

        संपादक को अनावश्यक रूप से फिर से प्रस्तुत करना

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

        ठीक करना

        GrapesJS जीवनचक्र को सामान्य React रेंडरिंग से अलग रखें - एक बार माउंट करें, फिर इसे अपने स्वयं के API के माध्यम से चलाएं।

      • गलती

        केवल HTML भंडारण

        HTML आउटपुट है, स्रोत नहीं। HTML से किसी प्रोजेक्ट को फिर से खोलने से घटक प्रकार, traits और संपादक स्थिति खो जाती है, इसलिए अगला संपादन एक चपटे पृष्ठ से शुरू होता है।

        ठीक करना

        यदि उपयोगकर्ताओं को संपादन जारी रखने की आवश्यकता है तो प्रोजेक्ट डेटा जारी रखें। प्रकाशित करने पर HTML उत्पन्न करें।

      • गलती

        हर सार्वजनिक पेज पर GrapesJS चल रहा है

        संपादक रनटाइम को उन आगंतुकों के लिए शिपिंग करना जो कुछ भी संपादित नहीं कर सकते हैं, बिना किसी वापसी के बंडल आकार, मेमोरी और Core Web Vitals की लागत होती है।

        ठीक करना

        प्रकाशित सामग्री से संपादक रनटाइम अलग करें - प्रकाशित पृष्ठों को सादे HTML और CSS के रूप में प्रस्तुत करें।

      रोडमैप

      स्टार्ट स्मॉल, फिर स्केल

      तीन स्कोप, प्रत्येक इसके पहले वाले में जोड़ता है। अधिकांश टीमें पहले पर ओवरशूट करती हैं और तीसरे से आश्चर्यचकित होती हैं।

      1. 1सप्ताह एक

        MVP

        साबित करें कि संपादन अनुभव सही है, इससे पहले कि आप इसके आसपास कुछ भी बनाएं।

        • GrapesJS एक ग्राहक घटक में घुड़सवार
        • मुट्ठी भर बुनियादी ब्लॉक
        • स्थानीय या एकल-प्रोजेक्ट भंडारण
        • एक मार्ग पर सरल प्रकाशन
        यहां से शुरू करें
      2. 2पहले वास्तविक उपयोगकर्ता

        उत्पादन

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

        • प्रत्येक संपादक मार्ग पर प्रमाणीकरण
        • अपने स्वयं के API के पीछे बैकएंड भंडारण
        • संपत्ति अपलोड और एक मीडिया लाइब्रेरी
        • आपके डिज़ाइन सिस्टम से मेल खाने वाले कस्टम घटक
        • अनुमतियाँ सर्वर-साइड लागू की गईं
        • संस्करण और प्रकाशन वर्कफ़्लो
        भंडारण अनुभाग देखें
      3. 3वाणिज्यिक

        SaaS

        संपादक के चारों ओर उत्पाद परत, जिसके लिए आप वास्तव में शुल्क लेते हैं।

        • संगठन और टीमें
        • बिलिंग और योजना सीमाएँ
        • व्हाइट-लेबल संपादक UI
        • आपके उपयोगकर्ताओं के लिए क्यूरेट किया गया एक प्लगइन सेट
        • एक टेम्पलेट लाइब्रेरी
        • प्रकाशित पृष्ठों पर विश्लेषिकी
        SaaS पेज बिल्डर

      प्रोटोटाइप से व्यावसायिक उत्पाद तक का रास्ता आपके एप्लिकेशन के माध्यम से चलता है, संपादक के माध्यम से नहीं।

      FAQ

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

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

      हाँ। GrapesJS एक क्लाइंट-साइड लाइब्रेरी है जो DOM तत्व में माउंट होती है, इसलिए यह किसी भी React एप्लिकेशन के अंदर चलती है, जिसमें Next.js भी शामिल है। grapesjs स्थापित करें, इसे Client Component के अंदर प्रभाव में प्रारंभ करें, और इसे अनमाउंट करने पर नष्ट कर दें।

      क्या GrapesJS Next.js App Router के साथ काम करता है?

      हाँ, और App Router अनुशंसित एकीकरण है। 'use client' को उस घटक के शीर्ष पर रखें जो संपादक का मालिक है और GrapesJS को useEffect में प्रारंभ करें। रूट फ़ाइल स्वयं Server Component रह सकती है।

      क्या GrapesJS React Server Components के साथ काम करता है?

      यह उनके साथ काम करता है। संपादक स्वयं Server Component नहीं हो सकता है - इसे हुक, प्रभाव और DOM की आवश्यकता होती है। Server Components प्रमाणीकरण, डेटा फ़ेचिंग और पेज शेल को संभालें, फिर Client Component में क्रमबद्ध प्रॉप्स पास करें जो संपादक का मालिक है।

      क्या GrapesJS Next.js SSR का समर्थन करता है?

      संपादक को लपेटने वाले घटक को सर्वर-रेंडर किया जा सकता है; संपादक को स्वयं ब्राउज़र में प्रारंभ करना होगा। grapesjs.init() दस्तावेज़ पढ़ता है और Node रनटाइम में फेंकता है, इसलिए उस कॉल को एक प्रभाव के अंदर रखें। प्रकाशित पृष्ठों को किसी संपादक रनटाइम की आवश्यकता नहीं होती है और इसे स्थिर रूप से उत्पन्न किया जा सकता है।

      GrapesJS को Client Component की आवश्यकता क्यों है?

      क्योंकि यह सीधे DOM के साथ इंटरैक्ट करता है - तत्वों को मापना, श्रोताओं को जोड़ना और iframe कैनवास प्रस्तुत करना - और क्योंकि इसे अपने जीवनचक्र को प्रबंधित करने के लिए React हुक की आवश्यकता होती है। न तो Server Component में उपलब्ध है।

      मैं GrapesJS को Next.js में कैसे प्रारंभ करूं?

      एक कंटेनर div पर एक रेफरी के साथ एक Client Component बनाएं, एक खाली निर्भरता सरणी के साथ grapesjs.init({ container }) को useEffect के अंदर कॉल करें, लौटाए गए संपादक को दूसरे रेफरी में रखें, और क्लीनअप फ़ंक्शन में editor.destroy() को कॉल करें।

      क्या मुझे dynamic(..., { ssr: false }) का उपयोग करना चाहिए?

      Pages Router में, हाँ - यह पूर्व-प्रतिपादन को छोड़ने का मानक तरीका है। App Router में यह वैकल्पिक है और इसका उपयोग Server Component के अंदर नहीं किया जा सकता है: Next.js वहां ssr: false को अस्वीकार कर देता है और आपको इसे Client Component में स्थानांतरित करने के लिए कहता है। इसे केवल App Router में उपयोग करें ताकि संपादक खंड को प्रारंभिक पेलोड से बाहर रखा जा सके।

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

      editor.Storage.add() के साथ एक कस्टम स्टोरेज एडाप्टर पंजीकृत करें, जिसके load() और store() को Next.js रूट हैंडलर कहते हैं। मार्ग अनुरोध को प्रमाणित करता है और आपके डेटाबेस में प्रोजेक्ट JSON को पढ़ता या लिखता है। autosave को stepsBeforeSave के साथ चालू करें ताकि लिखें बैच में हों।

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

      हाँ, और इस पृष्ठ पर एक उदाहरण है। Supabase लोड/सेव सीमा का एक कार्यान्वयन है - Postgres, MySQL, मोंगो, S3 या मौजूदा REST API उसी तरह काम करते हैं, क्योंकि संपादक केवल आपके मार्ग से बात करता है।

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

      हाँ। GrapesJS BSD-3-Clause लाइसेंस प्राप्त और स्व-होस्ट किया गया है, जिसमें प्रति सीट शुल्क नहीं है और लूप में कोई होस्ट की गई सेवा नहीं है, इसलिए आप इसे एक वाणिज्यिक उत्पाद में एम्बेड कर सकते हैं। काम ज्यादातर SaaS परत है - संगठन, अनुमतियां, बिलिंग, प्रकाशन - जो सामान्य Next.js काम है।

      क्या मैं कस्टम ब्लॉक बना सकता हूँ?

      हाँ। editor.Blocks.add() एक लेबल, एक श्रेणी, एक आइकन और उसके द्वारा सम्मिलित की गई सामग्री के साथ एक ब्लॉक पंजीकृत करता है। Blocks कच्चा HTML सम्मिलित कर सकता है या आपके स्वयं के घटक प्रकारों में से एक को इंस्टेंट कर सकता है।

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

      हाँ। editor.Components.addType() अपने स्वयं के मॉडल, traits, नियमों और बाल संरचना के साथ एक घटक प्रकार को परिभाषित करता है - उपयोगकर्ताओं को इसे तोड़ने से रोकते हुए कैनवास के अंदर आपके डिज़ाइन सिस्टम को उजागर करने का तंत्र।

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

      हाँ। editor.getHtml() और editor.getCss() किसी भी समय कैनवास आउटपुट लौटाते हैं, और getProjectData() संपादन योग्य JSON स्रोत लौटाता है। संपादन के लिए प्रोजेक्ट डेटा संग्रहीत करें; प्रकाशित करते समय HTML और CSS उत्पन्न करें।

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

      हाँ। प्लगइन्स ऐसे फ़ंक्शन हैं जो संपादक इंस्टेंस प्राप्त करते हैं, इसलिए उन्हें Next.js में उसी तरह पंजीकृत किया जाता है जैसे कहीं और - init पर प्लगइन्स विकल्प के माध्यम से, या अपने onEditor हैंडलर से संपादक API को कॉल करके।

      क्या मैं Next.js के साथ सीएमएस संपादक बना सकता हूं?

      हां, और यह सबसे आम उपयोगों में से एक है। अपने मौजूदा सामग्री मॉडल पर GrapesJS प्रोजेक्ट डेटा को मैप करें, ब्लॉक सेट को उन घटकों तक सीमित करें जिन्हें आपके Next.js टेम्पलेट प्रस्तुत कर सकते हैं, और संपादकों को रिपॉजिटरी को छुए बिना नेत्रहीन रूप से काम करने दें।

      क्या मैं Next.js पेज बिल्डर को स्व-होस्ट कर सकता हूँ?

      हाँ। GrapesJS एक npm पैकेज है जिसमें कोई होस्ट किया गया बैकएंड, लाइसेंस सर्वर या टेलीमेट्री नहीं है, इसलिए पूरा बिल्डर - संपादक, भंडारण और प्रकाशित पृष्ठ - जहां भी आपका Next.js एप्लिकेशन चलता है, वहां चलता है।

      GrapesJS के साथ अपना Next.js पेज बिल्डर बनाएं

      अपने एप्लिकेशन आर्किटेक्चर के लिए Next.js और विज़ुअल एडिटिंग इंजन के लिए GrapesJS का उपयोग करें। कोर एडिटर से शुरुआत करें और अपने उत्पाद को प्लगइन्स, ब्लॉक और इंटीग्रेशन के साथ विस्तारित करें जिनकी आपको आवश्यकता है।

      Next.js के साथ एप्लिकेशन बनाएं। GrapesJS के साथ दृश्य संपादन जोड़ें। इसे GJS.Market के साथ बढ़ाएं।