PageKit: el creador de sitios GrapesJS autoalojado, con el código fuente incluido. Obtener acceso anticipado

Vue 3 · Nuxt · GrapesJS

Creador de páginas Vue con GrapesJS

Crea un creador visual de páginas de arrastrar y soltar para Vue 3 y Nuxt con bloques personalizados, componentes, plantillas, edición responsiva y tu propio flujo de trabajo de almacenamiento y publicación.

Vue 3 & NuxtArrastrar y soltar visualComponentes personalizadosBloques reutilizablesEdición responsivaTu backendExtensible con plugins
app.yourproduct.com/pages/editor
Creador de páginas Vue

Bloques

  • Hero
  • Características
  • Precios
  • Testimonios
  • FAQ

Tu página

Escritorio · Tablet · Móvil
Tres viñetas y un lienzo: una biblioteca de bloques a la izquierda, la página en el centro, controles de estilo a la derecha, anchos de los dispositivos en la parte inferior. Esa es la interfaz que tienen tus usuarios — y la parte que no tienes que construir.

Consulta la guía de integración de Vue

0.23.6

Versión de GrapesJS contra la que esta página está escrita

100+

Plugins y plantillas en GJS.Market

BSD-3-Clause

Licencia del núcleo editorial

$0

Coste de ejecutar el propio editor

Míralo primero

Un verdadero creador de páginas, funcionando en esta página

Esto es GrapesJS en sí, no una captura de pantalla. Arrastra un bloque, selecciona un elemento, cambia el estilo y cambia el ancho del dispositivo. El editor se crea con una llamada 'init()' — en una app Vue esa llamada vive en 'onMounted', y todo lo que ves aquí se comporta de forma idéntica.

  • Drag & drop
  • Style Manager
  • Layer Manager
  • Desktop / Tablet / Mobile
  • HTML + CSS export
¿Por qué no desde cero?

Crea un generador de páginas visual sin empezar de cero

Un creador de páginas de producción es mucho más que unos pocos componentes Vue. Es un lienzo, un sistema de arrastrar y soltar, un modelo de componentes, un motor de estilo, edición responsiva, deshacer historial, gestión de recursos, almacenamiento y exportación. Aquí está toda la superficie y quién acaba poseyendo cada pieza.

  • Núcleo GrapesJS

    Lienzo de edición

    Un documento aislado que los usuarios editan directamente, con sus propios estilos y desplazamientos.

  • Núcleo GrapesJS

    Arrastrar y soltar

    Drop targets, puntos de inserción, reordenación y reglas de anidamiento.

  • Núcleo GrapesJS

    Modelo de componentes

    Elementos tipados con sus propios ajustes, restricciones y comportamiento.

  • Núcleo GrapesJS

    Selección y barras de herramientas

    Haz clic para seleccionar, pasa el cursor en contornos, barras de herramientas por elemento y insignias.

  • Núcleo GrapesJS

    Style Manager

    Tipografía, color, espaciado y controles de disposición vinculados a los selectores.

  • Núcleo GrapesJS

    Edición responsiva

    Anchos de dispositivo y estilos con alcance de punto de ruptura en el mismo lienzo.

  • Núcleo GrapesJS

    Layer Manager

    Un árbol de la página para que las estructuras profundas se mantengan navegables.

  • Núcleo GrapesJS

    Deshacer y rehacer

    Un historial de comandos en cada edición, no solo en texto.

  • Núcleo GrapesJS

    Exportación HTML y CSS

    Limpia el marcado y la hoja de estilo generados a partir del documento actual.

  • Plugins

    Biblioteca de bloques

    Las secciones listas que los usuarios arrastran. Tuyas o instaladas.

  • Plugins

    Plantillas

    Configura los diseños iniciales completos para que nadie encuentre un lienzo en blanco.

  • Plugins

    Gestión de activos

    Subidas, bibliotecas multimedia y gestión de imágenes.

  • Plugins

    Edición de texto enriquecido

    Formato de texto en línea más allá del editor integrado.

  • Plugins

    Proyectos de varias páginas

    Más de una página dentro de un mismo proyecto.

  • Tu app Vue

    Almacenamiento

    Donde se escriben y leen los datos del proyecto. Tu API, tu base de datos.

  • Tu app Vue

    Autenticación y roles

    Quién puede abrir, editar y publicar qué proyecto.

  • Tu app Vue

    Multi-inquilina

    Aislar las páginas, recursos y plantillas de un cliente de las de otro.

  • Tu app Vue

    Publicación y alojamiento

    Convertir la salida aprobada en una página activa en tu infraestructura.

  • Tu app Vue

    Planes y facturación

    A qué tiene derecho cada cliente y a qué paga por ello.

De quién es el propietarioNúcleo GrapesJSPluginsTu app Vue

La columna del medio es el objetivo de GJS.Market: es una capacidad real que instalas en lugar de programar. La columna de la derecha nunca se convierte en problema de nadie más — ese es tu producto, y esta página es explícita sobre ello en cada sección que lo toca.

Consulta la integración de cinco pasos
Arquitectura

Vue es tu framework. GrapesJS es tu editor.

GrapesJS no es un sustituto de tu aplicación ni un servicio alojado. Es un motor de edición que se monta en un elemento de una ruta. Todo lo que está arriba y debajo de él en este diagrama sigue siendo tuyo.

  1. Tu solicitud Vue / Nuxt

    Todo lo que hace que el producto sea tuyo. GrapesJS no tiene opinión sobre nada de eso.

    • Autenticación
    • Usuarios
    • Enrutamiento
    • Facturación
    • Lógica de negocio
    • APIs
  2. El editor GrapesJS

    Una instancia montada, dentro de un componente, en una ruta. Esta es la capa que no estás construyendo.

    • Lienzo
    • Bloques
    • Componentes
    • Estilos
    • Capas
    • Activos
  3. Tu backend

    El editor te entrega dos artefactos y una transmisión multimedia. Lo que ocurre a continuación es decisión de tu API.

    • Proyecto JSON
    • HTML + CSS
    • Medios de comunicación
    • Roles
  4. Tu base de datos

    Filas ordinarias en un esquema que diseñaste. Nada aquí es un formato GrapesJS que tengas que adoptar.

    • Proyectos
    • Versiones
    • Inquilinos
    • Páginas

Léelo de arriba a abajo: tu aplicación Vue autentica al usuario y lo dirige a una página de editor; el editor produce los datos del proyecto; tu API los escribe en tu base de datos. El editor nunca se comunica con tu base de datos, y tu base de datos nunca tiene que entender al editor.

Cómo se monta el editor en un componente Vue
La objeción

¿El GrapesJS reemplaza al Vue?

No. Esta es la primera pregunta que hacen la mayoría de los desarrolladores de Vue, y la respuesta cambia cómo se lee el resto de la página. Las dos capas no se solapan: una ejecuta tu aplicación, la otra una superficie de edición dentro de ella.

Vue / Nuxt

Vue sigue siendo responsable de

Tu aplicación, exactamente como la construyes hoy.

  • Aplicación UI
  • Enrutamiento
  • Autenticación
  • Lógica de negocio
  • Gestión estatal
  • APIs y obtención de datos
  • Facturación y planes
  • Usuarios y permisos
GrapesJS

GrapesJS proporciona

La capa de edición visual, dentro de un elemento se la asignas.

  • Lienzo visual
  • Arrastrar y soltar
  • Bloques
  • Componentes
  • Estilos
  • Capas
  • Activos
  • Anchos de dispositivos

Una advertencia honesta mientras estamos aquí: el lienzo renderiza DOM liso dentro de un iframe, no componentes montados en Vue. Tu app es Vue; lo que tus usuarios editan es HTML y CSS que tu app renderiza como quiera.

Resultados

¿Qué puedes construir con Vue + GrapesJS?

El mismo motor, configurado de forma diferente. Cada uno de estos es una forma real de producto que los equipos se encientan encima de él — y cada uno tiene una página aquí que profundiza.

Capacidades

Todo lo que necesitas para un creador de páginas visual

Esto es lo que te da el editor el primer día, antes de instalar un único plugin. Cada uno es configurable: paneles, categorías, restricciones y etiquetas son tuyos para configurar.

Arrastrar y soltar

Los usuarios construyen los diseños arrastrando secciones y elementos al lienzo, con objetivos de caída, reordenación y anidamiento.

Componentes

Define tus propios tipos de elementos con sus propios ajustes, restricciones y comportamientos, y reutilízalos en cada proyecto.

Bloques

Las secciones listas para usar que los usuarios extraen del panel. Agrúpalas en categorías que coincidan con el vocabulario de tu producto.

Style Manager

Tipografía, color, espaciado y controles de diseño. Limita el conjunto de propiedades para que los usuarios no puedan salir de tu sistema de diseño con estilo.

Edición responsiva

Cambia el lienzo entre el ancho de escritorio, tablet y móvil, y escribe estilos con alcance de punto de interrupción en su lugar.

Capas

Un árbol estructural de la página, de modo que un diseño profundamente anidado se mantenga seleccionable y reordenable.

Activos

Un gestor de activos para imágenes y medios, respaldado por el almacenamiento o CDN que ya uses.

Plantillas

Diseños iniciales reutilizables, para que una nueva página empiece como algo en lugar de un lienzo vacío.

Exportación

Genera HTML y CSS a partir del documento actual, o toma los datos del proyecto y renderízalos a tu manera.

Personalización

Crea un creador de páginas alrededor de tu producto

La diferencia entre un creador genérico de sitios web y uno que pertenece a tu producto es el conjunto de componentes. No fuerces tu modelo de contenido en los tipos de elementos de otra persona: registra el tuyo propio.

  1. Your product
  2. Custom components
  3. Custom blocks
  4. Custom templates
  5. Custom commands
  6. Custom UI

Cada paso es una configuración ordinaria en la instancia del editor: un tipo de componente, un bloque que lo inserta, una plantilla que organiza varios, un comando que actúa sobre ellos y un panel que lo expone.

constructor/registerProductBlocks.tsts
// builder/registerProductBlocks.ts
import type { Editor } from 'grapesjs';

// A plugin is just a function that receives the editor, so everything below
// works identically in Vue, Nuxt, React or a plain HTML page.
export function registerProductBlocks(editor: Editor): void {
  // A custom component type: your own element, with your own settings.
  editor.DomComponents.addType('pricing-table', {
    isComponent: (el) => el.dataset?.gjsType === 'pricing-table',
    model: {
      defaults: {
        droppable: false,
        traits: [
          { name: 'plan', type: 'select', options: ['free', 'pro', 'team'] },
          { name: 'highlight', type: 'checkbox' },
        ],
      },
    },
  });

  // A block: what the user actually drags in from the panel.
  editor.BlockManager.add('pricing-table', {
    label: 'Pricing',
    category: 'Sections',
    content: { type: 'pricing-table' },
  });
}
  • Un tipo de componente define qué es un elemento: qué acepta, qué rechaza y qué ajustes expone.
  • Un bloque es lo que los usuarios ven en el panel: el mismo tipo puede respaldar varios bloques con diferentes presets.
  • Los rasgos se convierten en la barra lateral de la configuración, para que tus usuarios configuren los elementos en lugar de editar el marcado.
  • Las restricciones de 'droppable: false' y de coincidencia son la forma de evitar que un componente diseñado se desmonte.
  • Los comandos te permiten adjuntar tus propias acciones: publicar, duplicar a otro inquilino, solicitar revisión.
  • Nada de esto es específico de Vue: un plugin es una función que recibe el editor, así que también funciona en Nuxt, React o en HTML normal.

No fuerces tu producto a un creador de sitios web genérico. Personaliza el editor en función de tu propio modelo de contenido y sistema de diseño.

Gobernanza

Mantén tu sistema de diseño bajo control

Un lienzo sin restricciones produce páginas que avergüenzan al producto en el que viven. El editor es configurable en ambas direcciones — el entorno útil no es la máxima libertad, es la libertad acotada.

Lo que los usuarios deberían poder hacer

  • Ensambla páginas de bloques aprobados en cualquier orden
  • Escribe y edita su propio texto en el lugar
  • Intercambiar imágenes de la biblioteca de activos
  • Elige entre variantes de diseño definidas
  • Ajustar el contenido por ancho de dispositivo
  • Empieza desde una plantilla y diverge de ella

Lo que el editor debe mantener constante

  • Escala tipográfica y familias de fuentes
  • La paleta de la marca, expuesta como colores nombrados en lugar de un selector
  • Pasos de espaciado, en lugar de valores arbitrarios de píxeles
  • Qué componentes pueden anidar dentro de cuál
  • Incluso se puede ver qué bloquea un rol o plan determinado
  • Las secciones estructurales que garantiza una plantilla

Da a los usuarios libertad creativa sin permitir que rompan el sistema de diseño de tu producto.

Contenido

No empieces a los usuarios con un lienzo en blanco

El mayor factor que determina si un creador de páginas se utiliza es lo que está esperando en el panel de bloques en la primera visita. Construye las secciones que tu producto realmente necesita, o instala una biblioteca y cámbiala el nombre.

  • Hero

    Titular, línea de apoyo y acción principal.

  • Cuadrícula de características

    Una cuadrícula repetitiva de capacidades o beneficios.

  • Precios

    Columnas de planeo con reportajes y una llamada a la acción.

  • Testimonios

    Citas con atribución, en fila o en carrusel.

  • FAQ

    Pares de preguntas y respuestas, extensibles o planos.

  • Contacto

    Una sección de formulario que publica en tu propio endpoint.

  • Tira CTA

    Una banda de ancho completo con una acción clara.

  • Pie de página

    Columnas de navegación, enlaces legales y marcas de marca.

Persistencia

Guarda los proyectos en tu propio backend

GrapesJS no aloja nada ni elige una base de datos. Registras un adaptador de almacenamiento con dos métodos — cargar y almacenar — y ambos se comunican con tu API. Nada sale de tu infraestructura.

  1. Visual editor
  2. Project JSON
  3. Your API
  4. Your backend
  5. Your database

El editor solo conoce 'load()' y 'store()'. Donde acaban esas llamadas — Postgres, MySQL, Mongo, S3, un CMS sin cabeza — es una decisión en la que el editor nunca participa.

components/PageBuilder.vue — adaptador de almacenamientots
const editor = grapesjs.init({
  container: host.value!,
  storageManager: {
    type: 'app-api',
    autosave: true,
    stepsBeforeSave: 10,
  },
  // Registered as a plugin so the adapter exists before the first load().
  plugins: [
    (ed) => {
      ed.Storage.add('app-api', {
        async load() {
          const res = await fetch(`/api/projects/${props.projectId}`);
          if (!res.ok) throw new Error(`Load failed: ${res.status}`);
          return await res.json();
        },
        async store(project) {
          const res = await fetch(`/api/projects/${props.projectId}`, {
            method: 'PUT',
            headers: { 'Content-Type': 'application/json' },
            body: JSON.stringify(project),
          });
          if (!res.ok) throw new Error(`Save failed: ${res.status}`);
        },
      });
    },
  ],
});
  • Registra el adaptador como un plugin para que exista antes de que el editor realice su primera carga.
  • 'autosave' con 'stepsBeforeSave' escribe en lotes en lugar de disparar uno por pulsación.
  • Guarda el proyecto JSON como la fuente de la verdad; es lo que el editor recarga.
  • Mantén las versiones como filas ordinarias — el historial de revisiones es una decisión del esquema, no una función del editor.
  • Autoriza cada carga y almacenamiento en el servidor. El id del proyecto en la solicitud es una reclamación, no un permiso.
  • Guarda el estado de guardado de Surface en tu propio Vue UI escuchando los eventos de almacenamiento del editor.

Controlas tus datos y tu backend. El editor es un cliente de tu API como cualquier otra parte de tu app.

Modelo de datos

¿Qué deberías guardar?

Dos artefactos salen del editor y no son intercambiables. Almacenar el incorrecto es el error que hace que las páginas sean ineditables seis meses después.

Proyecto JSON — la fuente de la verdad

El documento completo editable: componentes, estilos, recursos, páginas. Devuélvelo a 'load()' y el usuario reanuda exactamente donde lo dejó. Esta es la fila que nunca debes perder.

HTML + CSS — la salida

Una representación del documento actual, producido bajo demanda. Regenerarlo en cada publicación en lugar de tratarlo como estado; no puede volver a convertirse en un proyecto editable.

Quédate con ambos, por diferentes motivos

El JSON es lo que lee el editor. El HTML es lo que leen tus visitantes. Almacenar solo el segundo es la puerta unidireccional: la página se renderiza para siempre y nunca podrá ser editada de nuevo.

Guardando ambos artefactos al publicarts
// The source of truth. Store it; the editor reloads from it.
const projectData = editor.getProjectData();

// The output. Regenerate it every time you publish.
const html = editor.getHtml();
const css = editor.getCss();

await $fetch(`/api/projects/${projectId}/publish`, {
  method: 'POST',
  body: { projectData, html, css },
});

// Authorize the request and sanitize `html` on the server —
// never in the component that produced it.

Para volver a editar

  1. Project JSON
  2. load()
  3. Editable again

Para publicar

  1. getHtml() + getCss()
  2. Sanitize
  3. Serve

Guarda los datos del proyecto para editar. Genera HTML y CSS cuando necesites un resultado publicable.

Entrega

Desde la edición visual hasta la producción

Autoría y publicación son trabajos diferentes. GrapesJS termina en el momento en que un usuario está satisfecho con una página; todo lo que viene después es tu flujo de trabajo, en tu infraestructura.

  1. Create
  2. Edit
  3. Save
  4. Review
  5. Publish
  6. Live page

Inserta revisión, aprobación o programación donde tu producto lo necesite: el editor no tiene opinión sobre los pasos entre guardar y estar en vivo.

A dónde puede ir la producción publicada

  • Un endpoint REST en tu propio API
  • Un CMS sin cabeza que ya usas
  • Archivos estáticos, compilados y desplegados en publish
  • Un backend personalizado que renderiza páginas a petición
  • Un CDN delante de cualquiera de los anteriores
  • Tu pipeline de despliegue actual, sin cambios

GrapesJS se encarga de la autoría. Tu infraestructura se encarga de la publicación — no hay hosting incluido con el editor, y esta página no pretenderá lo contrario.

Arquitectura SaaS

Crea un creador de páginas Vue multi-inquilino

Cada cliente recibe sus propias páginas, sus propios activos, sus propias plantillas y su propia marca. Ese aislamiento es una propiedad de tu modelo de datos y de tu API: al editor simplemente le entregan el proyecto adecuado.

Your Vue SaaS

  • Org A

    • Pages
    • Assets
    • Templates
    • Brand
  • Org B

    • Pages
    • Assets
    • Templates
    • Brand
  • Org C

    • Pages
    • Assets
    • Templates
    • Brand

¿Qué implementan tu app y backend de Vue?

  • Un ID de inquilino en cada fila de proyecto, activo y plantilla
  • Autorización en el lado del servidor en cada llamada de carga, almacenamiento y publicación
  • Almacenamiento de activos por inquilino, por lo que las subidas de un cliente nunca se listan a otro
  • Plantillas y conjuntos de bloques con alcance de inquilino
  • Se aplica la marca por inquilino cuando se crea el editor
  • Roles dentro de un inquilino: quién puede editar, quién puede aprobar, quién puede publicar

La multitenencia no es una función de GrapesJS. Nada en el editor la impone, y un constructor de páginas que depende del cliente para elegir el tenant correcto no es multi-inquilino: es una base de datos compartida con una convención UI.

Explora la página del creador de páginas SaaS
Imagen de marca

Convierte tu editor Vue en tu propio producto

Nada en la interfaz tiene que parecer una biblioteca. Los paneles, los iconos, la redacción y el flujo de trabajo son configuraciones — la mayoría de los constructores de GrapesJS que vienen son irreconocibles como GrapesJS.

  • Logotipo personalizado y esquema de colores
  • Paneles y barras de herramientas personalizados
  • Bloques y plantillas personalizados por cliente
  • Terminología personalizada a lo largo del UI
  • Roles que cambian lo que el editor expone
  • Permisos aplicados en tu servidor, reflejados en el UI
Ecosistema

Extiende tu creador de páginas Vue con plugins

Un plugin es una función que recibe la instancia del editor. Ese es todo el contrato — por eso no existe una edición Vue separada de ninguno de estos. El mismo paquete funciona en un componente Vue, una página Nuxt, una app React o un archivo HTML simple, porque ninguno de ellos es lo que se conecta.
  1. GrapesJS core
  2. Vue / Nuxt integration
  3. Blocks
  4. Templates
  5. Storage
  6. Assets
  7. Pages
  8. Forms
  9. Export
  10. AI & advanced features

Para aclarar lo que no existe: no hay un envoltorio oficial de GrapesJS para Vue ni ningún plugin específico de Vue en GJS.Market. Tú mismo llamas 'grapesjs.init()' desde 'onMounted', que son cinco líneas, y todos los plugins del catálogo funcionan sin cambios.

Empieza por arriba y añade solo las capas que tu producto realmente alcanza. La mayoría de los constructores nunca instalan nada desde la mitad inferior.

Mercado

Plugins que resuelvan las partes que de otro modo programarías

Listados reales de GJS.Market, agrupados por el problema que eliminan. Cada uno de ellos se instala en la misma instancia del editor que crea tu componente Vue.

Listas de la compra

Construye tu pila de creadores de páginas Vue

El mismo catálogo, aunque recortado por el producto que estás construyendo. Instala la pila que coincida con tu caso y ignora el resto: un editor con cada plugin cargado es más lento y difícil de usar, no mejor.

Los precios mostrados son los precios actuales de la lista de GJS.Market; los plugins gratuitos están marcados.

Catálogo

Cada categoría, en el orden en que las necesitarás

Si una pila superior no coincide con tu producto, empieza por aquí. Estas son las secciones del catálogo, aproximadamente en el orden en que un constructor crece en ellas.

Explora todo
Comprar vs construir

Construye cada función tú mismo en vez de extender con plugins

Ninguna de las dos columnas es gratuita. La cuestión es solo en cuál debería dedicar su tiempo tu equipo.

ConsideraciónHazlo en casaInstalar desde GJS.Market
Adquisición de la capacidadTiempo de desarrollo en tu hoja de rutaInstalar y configurar
Mantenerlo funcionandoLo mantienes para siempreMantenido como un paquete publicado
ReutilizaciónCódigo solo internoUna solución que otros productos ya ejecutan
AlcanceTú construyes cada función tú mismoAñade solo lo que tu producto necesite
Dónde está el costeTiempo de ingenieríaUn precio de lista, una vez
En qué trabaja tu equipoInfraestructura de editoresTu producto

No aparecen cifras de coste ni de tiempo en esta tabla a propósito — no conocemos a tu equipo, y cualquier número aquí sería inventado.

La comparación real

Construye un creador de páginas Vue desde cero frente a GrapesJS

Fila por fila, lo que estarías escribiendo tú mismo y lo que ya existe. "Extensible" significa que el motor proporciona el gancho y tú aportas el comportamiento — normalmente unas pocas líneas, a veces un plugin.

CapacidadDesde ceroGrapesJS
Lienzo de ediciónConstrucciónIncluido
Arrastrar y soltarConstrucciónIncluido
Modelo de componentesConstrucciónIncluido
BloquesConstrucciónExtensible
Style ManagerConstrucciónIncluido
Edición responsivaConstrucciónIncluido
Árbol de capasConstrucciónIncluido
Deshacer y rehacerConstrucciónIncluido
ActivosConstrucciónExtensible
PlantillasConstrucciónExtensible
AlmacenamientoConstrucciónExtensible
Exportación HTML / CSSConstrucciónIncluido
Componentes Vue en el lienzoConstrucciónNo incluido — el lienzo representa DOM
Multi-inquilinos, roles, publicaciónConstrucciónNo incluido — tu solicitud

Incluido = viene con el núcleo. Extensible = un punto de extensión documentado, más plugins donde existen.
Verificado contra GrapesJS 0.23.6 en 2026-09-02.

Construye tu producto Vue. No reconstruyas el editor visual.

Integración

Integra GrapesJS con Vue 3

Cinco pasos, un componente. No hay un envoltorio oficial de Vue y no lo necesitas: GrapesJS se renderiza en un elemento simple, así que la única pregunta específica de Vue es qué gancho de ciclo de vida llama a 'init()'. Instala grapesjs 0.23.6, crea el componente, inicializa en montaje, pasa tus plugins y destruye al desmontar.

  1. Instalar GrapesJS
  2. Crear el componente editor
  3. Inicializar en el montaje
  4. Configurar plugins
  5. Destruir al desmontar
npm install grapesjs
components/PageBuilder.vuevue
<!-- components/PageBuilder.vue -->
<template>
  <div ref="host" class="page-builder" />
</template>

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

// shallowRef, not ref: the editor is a large non-reactive instance and
// deep-proxying it costs performance for nothing.
const editor = shallowRef<Editor | null>(null);
const host = ref<HTMLElement | null>(null);

onMounted(() => {
  editor.value = grapesjs.init({
    container: host.value!,
    height: '100%',
    fromElement: false,
    storageManager: false,
    plugins: [],          // GJS.Market plugins go here
    blockManager: { blocks: [] },
  });
});

onBeforeUnmount(() => {
  editor.value?.destroy();
  editor.value = null;
});
</script>
  • 'shallowRef', no 'ref': el editor es un objeto grande y no reactivo y el deep-proxy de él no cuesta rendimiento sin cobrar nada.
  • 'onMounted' nunca se ejecuta en el servidor, lo que hace que sea seguro en Nuxt sin maquinaria adicional.
  • 'destroy()' en el desmontaje importa — un cambio de ruta que deja a un editor montado filtra a sus oyentes y a su iframe.
  • 'storageManager: falso' mientras cableas todo, luego cambia tu adaptador cuando el API esté listo.
  • Importa la hoja de estilo del editor una vez; es el estilo de los paneles, no tu aplicación.
  • Todo lo que haya pasado después de este punto — eventos, envoltorios, la forma composable — está en la guía de integración.
Lee la guía completa de integración de Vue
Nuxt

Vue 3 + Nuxt

GrapesJS necesita un navegador DOM. En el renderizado del servidor de Nuxt no hay 'documento', así que el editor tiene que crearse en el cliente — lo cual 'onMounted' ya garantiza. '<ClientOnly>' es la versión de correa y refuerzo, y es donde reside el marcado de respaldo.

  1. Nuxt SSR
  2. <ClientOnly>
  3. grapesjs.init()
  4. Browser DOM

El servidor renderiza todo lo que rodea al editor; el propio editor aparece una vez que el componente está montado en el navegador.

pages/editor.vuevue
<!-- pages/editor.vue -->
<template>
  <ClientOnly>
    <PageBuilder :project-id="route.params.id" />

    <template #fallback>
      <p class="editor-placeholder">Loading the editor…</p>
    </template>
  </ClientOnly>
</template>

<script setup lang="ts">
const route = useRoute();
</script>

Reproducido, no asumido

Duración
Node 20, no DOM
GrapesJS
0.23.6
Importación del módulo
import('grapesjs') → resolves
Llamando a init()
grapesjs.init() → ReferenceError: document is not defined

Ejecuta en Node normal sin DOM en 2026-09-02. La diferencia importa: la importación es segura, así que no necesitas una importación dinámica para mantener el paquete seguro para el servidor — necesitas que la llamada de entrada ocurra en el navegador.

  • Usa '<ClientOnly>' cuando quieras un recurso de respaldo renderizado por servidor en lugar del editor.
  • El sufijo '. client.vue' es la forma en que Nuxt dice lo mismo para todo un componente.
  • SSR no es la parte interesante de esta página — es un límite, y es uno de dos líneas.
  • Todo lo que está fuera de la ruta del editor se renderiza en el servidor exactamente igual que hoy.
Evita estos

4 errores que debes evitar al crear un creador de páginas Vue

Cada uno de estos es barato de conseguir al principio y caro de arreglar una vez que los clientes están en el editor.

  • El error

    Inicialización durante SSR

    Llamar a 'init()' en cualquier sitio que se ejecute en el servidor se lanza, porque no hay un 'documento' en el que renderizar el lienzo.

    ¿Qué hacer en su lugar

    Crea el editor solo en 'onMounted' y envuelve la ruta en '<ClientOnly>' si quieres un recurso de respaldo renderizado por el servidor.

  • El error

    Salvando solo el HTML

    La salida renderizada no puede volver a convertirse en un documento editable. Cada página guardada de esta manera se congela en el momento en que se publica.

    ¿Qué hacer en su lugar

    Guarda el proyecto JSON como fuente de verdad y regenera HTML y CSS cada vez que publiques.

  • El error

    Ofrecer a los usuarios un lienzo en blanco ilimitado

    La libertad total produce páginas que rompen tu sistema de diseño, y una experiencia de primera ejecución sin nada en el panel produce páginas en absoluto.

    ¿Qué hacer en su lugar

    Envía bloques y plantillas seleccionados y limita el estilo que los usuarios pueden alcanzar las propiedades.

  • El error

    Instalación de todos los plugins

    Cada plugin añade paneles, peso del paquete y una superficie que tus usuarios deben entender. Un editor saturado es más difícil de usar, no más capaz.

    ¿Qué hacer en su lugar

    Empieza con la pila para la forma de tu producto y añade un plugin cuando surja una necesidad real.

Antes del lanzamiento

Lista de verificación de producción para un creador de páginas Vue

Las cosas que separan una demo funcional de algo que puedes poner delante de los clientes que pagan.

Editor

Ciclo de vida y configuración

La instancia se comporta correctamente en cada cambio de ruta.

  • 'init()' se ejecuta una vez por montaje, nunca en el servidor
  • 'destroy()' funciona en desmontado y cambio de ruta
  • Los plugins se registran antes del primer 'load()'
  • Los componentes y bloques personalizados se registran en un solo lugar
  • La hoja de estilo del editor se carga exactamente una vez
Datos

Datos del proyecto

Nada de lo que un usuario haya escrito puede perderse.

  • Project JSON es la fuente almacenada de la verdad
  • El guardado automático está activado, con un loteo sensato
  • Las versiones se conservan, así que una mala edición puede recuperarse
  • Publish escribe HTML y CSS por separado del proyecto
  • Los fallos de carga aparecen como un error, nunca como un lienzo vacío
UX

La experiencia de edición

Un no desarrollador puede crear una buena página sin ayuda.

  • Bloques seleccionados en categorías que tus usuarios reconocen
  • Al menos una plantilla por tipo de página
  • El estado guardado es visible en tu propio UI
  • Los anchos de los dispositivos son alcanzables y evidentes
  • Los estados vacíos explican qué hacer a continuación

La experiencia de primera ejecución decide la adopción más que el número de funcionalidades.

Seguridad

Aplicación en el lado del servidor

Cada norma se aplica cuando el cliente no puede acceder a ella.

  • Autenticación en cada ruta de editor
  • Autorización en cada llamada de carga, almacenamiento y publicación
  • Validación de subida por tipo y tamaño, lado del servidor
  • HTML publicado desinfectado antes de servirlo
  • Aislamiento del inquilino comprobado en el servidor, no inferido de la solicitud
Publicación

Publicando páginas

Se define el camino desde un borrador aprobado hasta una URL activa.

  • Un avance que coincide con la producción publicada
  • Una acción explícita de publicación, separada de guardar
  • Revisa o aprueba cuando tu proceso lo requiera
  • Invalidación de caché tras la publicación
  • Un camino de retroceso a una versión anterior
Rendimiento

Consideraciones de rendimiento

El editor es una dependencia pesada y pertenece exactamente a una ruta. La mayoría de los problemas de rendimiento en un constructor provienen de cargarlo donde no es necesario.

  • Carga el editor solo en las rutas que realmente editan, no en tu shell de aplicación.
  • Cargan plugins y paneles con mucha pereza en lugar de registrar todo al inicio.
  • Mantén la instancia del editor fuera de una reactividad profunda — 'shallowRef' existe para objetos como este.
  • No reflejes el estado del editor en referencias Vue en cada cambio; escucha los eventos que realmente renderizas.
  • Paginar o cargar perezosamente grandes bibliotecas de activos en lugar de darle al administrador de activos miles de filas.
  • Instala los plugins que use tu producto; cada uno extra cuesta tamaño de paquete y espacio en paneles.
Seguridad

Consideraciones de seguridad

Un creador de páginas acepta contenido arbitrario de los usuarios y lo convierte en páginas que otras personas ven. Trata cada entrada como no confiable y cada regla del lado del cliente como decorativa.

  • Autoriza cada proyecto a cargar, almacenar y publicar en el servidor.
  • Haz cumplir el aislamiento del inquilino en la consulta, no en el componente que la emitió.
  • Valida las subidas por tipo y tamaño antes de que lleguen a tu almacenamiento.
  • Sanitise publicó HTML antes de administrárselo a nadie.
  • Autentica el API con el que el editor habla como cualquier otro endpoint.
  • Proteger los endpoints de publicación por separado — publicar es una acción privilegiada.
  • Vuelve a comprobar los permisos en el servidor incluso cuando el UI ya ocultó el botón.

Nunca confíes solo en permisos del lado del cliente.

¿Quién hace esto

¿Quién crea los constructores de páginas Vue?

Productos diferentes, una sola arquitectura. Si reconoces a tu equipo aquí, el resto de esta página está escrito para ti.

Empresas SaaS

Añadir edición visual a un producto existente para que los clientes dejen de presentar tickets por cambios de contenido.

Agencias

Crear una experiencia de edición personalizada por cliente, sobre una base de código que manten.

Plataformas CMS

Ofrecer a los clientes edición visual sobre contenido que la plataforma ya modela.

Plataformas de marketing

Permitir que los equipos de campaña lancen páginas sin que un desarrollador esté al tanto.

Equipos de Enterprise

Crear flujos de trabajo internos controlados de edición con roles, revisión y aprobación.

Preguntas

Creador de páginas Vue FAQ

¿Qué es un creador de páginas Vue?

Un editor visual dentro de una aplicación Vue que permite a alguien ensamblar y estilizar una página arrastrando secciones a un lienzo, en lugar de escribir marcado. La aplicación Vue proporciona las rutas, usuarios y datos; el editor proporciona el lienzo.

¿Puedo usar GrapesJS con Vue 3?

Sí. GrapesJS se renderiza en un elemento DOM simple, así que lo creas dentro de 'onMounted' y lo destruyes en 'onBeforeUnmount'. No hay ninguna biblioteca envolvente involucrada.

¿Puedo usar GrapesJS con Nuxt?

Sí. El editor se crea en el cliente; 'onMounted' ya garantiza eso, y '<ClientOnly>' te da una opción de respaldo renderizada por el servidor alrededor de ello.

¿Funciona GrapesJS con Nuxt SSR?

Importar el módulo es seguro en el servidor — solo 'init()' requiere un DOM. Así que el servidor de página que lo rodea se renderiza normalmente y el editor aparece una vez que el componente se monta en el navegador.

¿GrapesJS es un creador de páginas Vue?

Es un motor de edición independiente del framework, no una biblioteca Vue. Se convierte en un creador de páginas Vue cuando lo montas en un componente Vue y lo conectas a tu propio almacenamiento y publicación.

¿Cómo integro GrapesJS con Vue?

Instala el paquete, añade un componente con un elemento contenedor, llama a 'grapesjs.init()' en 'onMounted' con tus plugins y bloques, y llama a 'destroy()' al desmontar. La guía completa cubre eventos, composables y envoltorios.

¿Puedo usar el Composition API?

Sí, y es el encaje natural — los ganchos del ciclo de vida son exactamente donde deben la creación y el desmontaje. Mantén la instancia en 'shallowRef' en lugar de 'ref'.

¿Existe un envoltorio oficial de Vue para GrapesJS?

No. Hay un envoltorio oficial de React, pero nada para Vue; el paquete en npm está dirigido a Vue 2 y no se ha actualizado desde 2022. Llamar a 'init()' tú mismo son unas cinco líneas y evitar depender de código no mantenido.

¿Puedo crear bloques personalizados?

Sí. Los bloques se registran en el Block Manager del editor con tu propio marcado, etiqueta y categoría, y puedes agruparlos según el vocabulario de tu producto.

¿Puedo crear componentes personalizados?

Sí. Define tus propios tipos de componentes con sus propios ajustes, restricciones y comportamiento, y luego expóndelos como bloques. Así es como un constructor deja de parecer genérico.

¿Los componentes de Vue se renderizan dentro del lienzo?

No. El lienzo es un documento aislado que representa DOM simple, así que edita HTML y CSS en lugar de montar componentes Vue. Tu aplicación es Vue; la página editada es el marcado que tu app puede renderizar como quiera.

¿Puedo crear plantillas reutilizables?

Sí. Guarda los diseños completos como puntos de partida, ya sea a través de tu propio almacenamiento o con un plugin de gestión de plantillas del catálogo.

¿Puedo guardar proyectos en mi propio backend?

Sí, y ese es el diseño previsto. Registras un adaptador de almacenamiento con los métodos de 'carga' y 'almacenar' que llaman a tu API — el editor nunca se comunica directamente con tu base de datos.

¿Debería guardar el proyecto JSON o HTML?

Guarda el proyecto JSON: es la fuente editable de verdad que el editor recarga. Genera HTML y CSS cuando publiques. Almacenar solo HTML hace que la página sea permanentemente imposible de editar.

¿Puedo crear un creador de páginas SaaS con Vue?

Sí. Tu app Vue se encarga de cuentas, planos y rutas; el editor se encarga de la autoría; tu API se encarga de los proyectos. Esa combinación es la forma común de un constructor vendido como producto.

¿Puedo crear un constructor de páginas multi-inquilino?

Sí, pero la tenencia reside en tu aplicación y en tu base de datos, no en el editor. Escala cada proyecto, activo y plantilla por inquilino y haz cumplir el control del servidor.

¿Puedo crear un creador de páginas de marca blanca?

Sí. El logotipo, los colores, los paneles, la terminología y los bloques disponibles están configurados, para que a cada cliente se le pueda asignar un entorno que se parezca a tu producto.

¿Puedo crear un creador de páginas de aterrizaje con Vue?

Sí — es la primera versión más común. Selecciona un pequeño conjunto de secciones de marketing, añade plantillas y deja que el equipo de marketing publique a través de tu pipeline existente.

¿Puedo construir un editor CMS con Vue?

Sí. Registra tipos de componentes que reflejen tu modelo de contenido, para que los editores trabajen visualmente con tus entidades en lugar de con marcado libre.

¿Puedo ampliar el editor con plugins?

Sí. Un plugin es una función que recibe la instancia del editor, así que todo el catálogo de GJS.Market funciona en una app Vue sin cambios — no hay una edición específica de Vue que buscar.

¿Puedo usar GrapesJS comercialmente?

Sí. El núcleo está licenciado por BSD-3-Clause, lo que permite su uso comercial, incluso dentro de un producto que vendas. Revisa la licencia individual de cualquier plugin que instales.

¿Necesitas ayuda para crear tu creador de páginas Vue?

¿Necesitas ayuda para integrar GrapesJS con Vue o Nuxt, crear bloques y componentes personalizados, conectar tu backend o crear un flujo de trabajo de edición listo para producción? Nosotros hacemos ese trabajo.

Para equipos que prefieren lanzar el producto antes que la infraestructura de editor.

Empieza aquí

Construye tu creador de páginas Vue sin empezar de cero

Usa Vue para tu aplicación y GrapesJS para la experiencia de edición visual. Añade tus propios componentes, bloques, plantillas, flujo de trabajo de almacenamiento y publicación — y luego amplía el generador con plugins GJS.Market cuando necesites más.

Desarrolladores

Empieza

Cinco pasos y un componente. Instala el paquete y ten un editor ejecutado en tu app Vue esta tarde.

Empieza
Equipos de producto

Explorar plugins

Bloques, plantillas, almacenamiento, recursos y exportación — instala las capacidades que de otro modo pondrías en la hoja de ruta.

Explorar plugins
Empresas

Busca ayuda para implementar

Integración, componentes personalizados, cableado backend y un flujo de trabajo de edición de producción, construido con tu equipo.

Háblanos

Tu app Vue. Tu editor. Tu producto.