Vue 3 ·Nuxt ·GrapesJS

Vue 页面构建器与 GrapesJS

为 Vue 3 和 Nuxt 构建一个可视化拖拽页面构建器,配备自定义块、组件、模板、响应式编辑以及你自己的存储和发布工作流程。

Vue 3 和 Nuxt视觉拖拽自定义组件可重复使用的块响应式剪辑你的后台可通过插件扩展
app.yourproduct.com/pages/editor
Vue 页面构建器

方块

  • Hero
  • 特色
  • 定价
  • 推荐
  • FAQ

你的页面

桌面·平板电脑·移动端
三个面板和一个画布:左边是块库,中间是页面,右边是样式控件,底部是设备宽度。这就是用户获得的界面——也是你不必自己构建的部分。

查看Vue集成指南

0.23.6

本页所对比的GrapesJS版本

100+

GJS.Market 上的插件和模板

BSD-3-Clause

编辑器核心的许可

$0

运行编辑器本身的成本

先去看

一个真正的页面构建器,运行于此页面

这是GrapesJS本身,不是截图。拖入一个块,选择一个元素,重新样式,切换设备宽度。编辑器由一个“init()”调用创建——在一个调用存在“onMounted”的Vue应用中,你看到的所有内容表现都一样。

  • Drag & drop
  • Style Manager
  • Layer Manager
  • Desktop / Tablet / Mobile
  • HTML + CSS export
为什么不从头开始

无需从零开始,就能构建一个可视化页面构建器

生产页面构建器远不止是几个Vue组件。它是一个画布、一个拖拽系统、一个组件模型、一个样式引擎、响应式编辑、撤销历史、资产管理、存储和导出。这里是整个表面,以及每个部分最终归谁所有。

  • GrapesJS 核心

    编辑画布

    用户可以直接编辑独立文档,拥有自己的样式和滚动功能。

  • GrapesJS 核心

    拖拽

    投放目标、插入点、重新排序和嵌套规则。

  • GrapesJS 核心

    组件模型

    类型化元素,拥有各自的设置、约束和行为。

  • GrapesJS 核心

    选择与工具栏

    点击选择、悬停轮廓、按元素工具栏和徽章。

  • GrapesJS 核心

    Style Manager

    字体、颜色、间距和布局控制都绑定在选择器上。

  • GrapesJS 核心

    响应式剪辑

    设备宽度和断点范围样式在同一画布中。

  • GrapesJS 核心

    Layer Manager

    页面的树状结构保持可导航性。

  • GrapesJS 核心

    撤销与重做

    每次编辑都有命令历史,而不仅仅是文本。

  • GrapesJS 核心

    HTML 与 CSS 导出

    从当前文档生成的干净标记和样式表。

  • 插件

    区块库

    用户拖入的现成部分。你的,或者安装好的。

  • 插件

    模板

    整个起始布局,这样没人会遇到空白画布。

  • 插件

    资产管理

    上传、媒体库和图像处理。

  • 插件

    富文本编辑

    内置编辑器之外的内联文本格式。

  • 插件

    多页项目

    一个项目里有超过一页。

  • 你的Vue应用

    存储

    项目数据被写入和读取的地方。你的API,你的数据库。

  • 你的Vue应用

    认证与角色

    谁可以开启、编辑并发布哪个项目。

  • 你的Vue应用

    多租户

    将一个客户的页面、资源和模板与另一个客户的分离。

  • 你的Vue应用

    发布与托管

    将批准的输出变成你基础设施上的实时页面。

  • 你的Vue应用

    计划与账单

    每个客户应享有的权利以及他们为此支付的费用。

谁拥有它GrapesJS 核心插件你的Vue应用

中间栏是GJS.Market的意义所在:它是实际功能,你安装的,而不是调度。右侧的列永远不会成为别人的问题——那是你的产品,本页在每个涉及它的部分都明确说明了这一点。

参见五步积分
建筑

Vue 是你的框架。GrapesJS 是你的编辑器。

GrapesJS 不是你的应用替代品,也不是托管服务。它是一个编辑引擎,安装在一条路由的一个元素中。图中其上下的所有部分都归你所有。

  1. 你的Vue / Nuxt申请

    所有让产品属于你的元素。GrapesJS对此毫无意见。

    • 认证
    • 用户
    • 布线
    • 账单
    • 业务逻辑
    • APIs
  2. GrapesJS 编辑器

    一个挂载实例,在一个组件内,在同一条路由上。这就是你没有构建的那层。

    • 画布
    • 方块
    • 组成部分
    • 风格
    • 层次
    • 资产
  3. 你的后台

    编辑会给你两个文物和一个媒体流。接下来发生的事由你的API决定。

    • JSON 计划
    • HTML + CSS
    • 媒体
    • 角色
  4. 你的数据库

    你设计的模式中的普通行。这里没有任何必须采用的GrapesJS格式。

    • 项目
    • 版本
    • 租户
    • 页面

从头到下读:你的Vue应用程序认证用户并将其导向到编辑器页面;编辑器生成项目数据;你的API将其写入数据库。编辑器从不与数据库通信,数据库也不必理解编辑器。

编辑器如何安装到Vue组件中
反对意见

GrapesJS能替代Vue吗?

不是。这是大多数Vue开发者问的第一个问题,答案会影响页面其余部分的阅读方式。这两层不重叠:一层运行你的应用程序,另一层运行其中的编辑表面。

Vue / Nuxt

Vue继续负责

你的应用程序,完全按照你今天构建的样子。

  • 应用 UI
  • 布线
  • 认证
  • 业务逻辑
  • 国家管理
  • APIs 与数据取用
  • 计费与计划
  • 用户与权限
GrapesJS

GrapesJS 提供

视觉编辑层,你在一个元素里给它。

  • 视觉画布
  • 拖拽
  • 方块
  • 组成部分
  • 风格
  • 层次
  • 资产
  • 器件宽度

顺便说一句:画布渲染的是iframe内部的普通DOM,而不是挂载的Vue组件。你的应用是Vue;用户编辑的是HTML和CSS,然后你的应用会随意渲染。

能力

视觉页面构建器所需的一切

这是编辑器在第一天给你的,在安装任何插件之前。每个插件都可以配置——面板、分类、约束和标签都是你自己设置的。

拖拽

用户通过拖拽部分和元素到画布中,设置下放目标、重新排序和嵌套来构建布局。

组成部分

定义你自己的元素类型,带有它们的设置、约束和行为,并在每个项目中重复使用。

方块

用户从面板中提取的即用版块。将它们按符合产品词汇的类别进行分组。

Style Manager

字体、颜色、间距和布局控制。限制属性集,防止用户通过样式设计脱离你的设计系统。

响应式剪辑

在桌面、平板和移动端之间切换画布宽度,并写入带有断点范围的样式。

层次

页面的结构树,因此深度嵌套的布局保持可选择和可重新排序。

资产

一个用于图像和媒体的资产管理工具,并以你已经使用的存储或CDN为后盾。

模板

可重复使用的起始布局,这样新页面就是一个实体,而不是空白画布。

出口

从当前文档生成HTML和CSS,或者拿项目数据自己渲染。

定制化

围绕你的产品创建一个页面构建器

通用网站构建器和属于你产品中的构建器的区别在于组件集。不要强行将你的内容模型纳入别人的元素类型——注册你自己的。

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

每一步都是编辑器实例上的普通配置:一个组件类型、一个插入组件的块、一个排列多个组件的模板、一个对它们生效的命令,以及一个暴露组件的面板。

建造/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' },
  });
}
  • 组件类型定义了元素的定义:它接受什么、拒绝什么以及它暴露哪些设置。
  • 块是用户在面板中看到的——同一类型可以伴奏多个带有不同预设的块。
  • 特质会变成设置侧边栏,这样用户就能配置元素,而不是编辑标记。
  • “droppable: false”和匹配约束是防止设计元件被拆解的方法。
  • 命令允许你附加自己的操作——发布、复制到另一个租户、请求审查。
  • 这些都不是 Vue 特有的:插件是一个接收编辑器的功能,所以它也能在 Nuxt、React 或普通 HTML 中工作。

不要强行把你的产品做成通用的网站建设工具。根据你自己的内容模型和设计系统定制编辑器。

治理

保持你的设计系统受控

一个不受限制的画布会产生让其所处产品尴尬的页面。编辑器可以双向配置——有用的设置不是最大自由,而是有界自由。

用户应该能够做的事情

  • 从批准的块中按任意顺序组装页面
  • 在原地撰写并编辑自己的文案
  • 从素材库中交换图片
  • 在定义布局变体中选择
  • 根据设备宽度调整内容
  • 从模板出发,再从中偏离它

编辑器应保持不变的条件

  • 字体比例与字体家族
  • 品牌调色板,作为命名颜色而非挑选器展示
  • 采用间距步进,而不是任意像素值
  • 哪些组件可以嵌套在哪个内部
  • 某个角色或计划甚至能看到哪些阻挡
  • 模板保证结构部分

给予用户创作自由,同时不让他们破坏你的产品设计体系。

内容

不要让用户从一块空白的画布开始

决定页面构建器是否被使用的最大因素,是第一次访问时块面板里等待的内容。构建你产品真正需要的部分,或者安装库并重新命名。

  • Hero

    头条、配角和主要动作。

  • 特征网格

    一个不断重复的能力或优势网格。

  • 定价

    规划带有特色和行动号召的专栏。

  • 推荐

    带出处的引用,排成一排或轮播。

  • FAQ

    问答对,可展开或平面。

  • 联系方式

    在你自己的终端上发布一个表单板块。

  • CTA带

    一个全宽的带,只有一个清晰的动作。

  • 页脚

    导航栏、法律链接和品牌标志。

持久性

把项目保存到你自己的后台

GrapesJS 不托管任何东西,也不选择数据库。你注册存储适配器时有两种方法——加载和存储——并且都与你的 API 通信。没有任何数据离开你的基础设施。

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

编辑只知道“load()”和“store()”这两个呼号。这些呼号最终会在哪里——Postgres、MySQL、Mongo、S3、一个无头CMS——是编辑从未参与的决定。

components/PageBuilder.vue — 存储适配器ts
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}`);
        },
      });
    },
  ],
});
  • 将适配器注册为插件,使其在编辑器首次加载前就已存在。
  • 'autosave' 搭配 'stepsBeforeSave' 批次时,是写入而不是每次按键触发一次。
  • 将项目JSON作为真实信息源存储;编辑器会重新加载它。
  • 保持版本为普通行——修订历史是结构决策,不是编辑器功能。
  • 授权服务器上的每一次加载和存储。请求中的项目ID是申诉,不是许可。
  • 通过监听编辑器的存储事件,在你自己的 Vue UI 中保存 Surface 状态。

你控制你的数据和后端。编辑器就像你应用的其他部分一样,是你 API 的一个客户端。

数据模型

你应该储存什么?

编辑部会导出两个伪影,它们不能互换。存储错误的伪影就是导致六个月后页面无法编辑的错误。

JSON项目——真相的源头

完整可编辑文档:组件、样式、资源、页面。反馈给“load()”,用户会从中断处恢复。这是你绝不能丢失的一行。

HTML + CSS —— 输出

当前文档的渲染,按需生成。每次发布时重新生成,而不是将其视为状态;它不能被转换回可编辑项目。

两者都保留,原因不同

JSON 是编辑者读取的内容。HTML 是访客阅读的内容。只存储第二个是单向门——页面永远渲染,永远无法编辑。

在发布时保存这两个神器ts
// 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.

再编辑一次

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

出版

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

存储项目数据以便编辑。需要发布输出时生成HTML和CSS。

交付

从视觉编辑到制作

创作和发布是不同的工作。GrapesJS 在用户满意页面时完成;之后的流程就是你的工作流程,在你的基础设施上。

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

在产品需要的地方插入审核、审批或排程——编辑对保存到上线之间的步骤没有意见。

已发表成果可以去的地方

  • 你自己的API中的一个REST端点
  • 你已经在运行一台无头的CMS
  • 静态文件,发布时构建并部署
  • 一个自定义后端,可以根据要求渲染页面
  • 在上述任一台前方放一台CDN。
  • 你现有的部署流程,保持不变

GrapesJS 负责创作。你的基础设施负责发布——编辑器没有捆绑主机,本页面也不会假装有其他。

SaaS 架构

构建一个多租户的Vue页面构建器

每个客户都有自己的页面、资源、模板和品牌。这种隔离性是你数据模型和API的特性——编辑者只是被分配到合适的项目。

Your Vue SaaS

  • 组织A

    • Pages
    • Assets
    • Templates
    • Brand
  • 组织B

    • Pages
    • Assets
    • Templates
    • Brand
  • 组织C

    • Pages
    • Assets
    • Templates
    • Brand

你的Vue应用和后端实现了什么

  • 每个项目、资产和模板行都要有租户ID
  • 服务器端授权适用于每次加载、存储和发布调用
  • 按租户存储资产,这样一个客户的上传内容就不会被另一个客户列出
  • 租户范围模板和块集
  • 编辑器创建时采用了每个租户的品牌标识
  • 租户内部的角色:谁可以编辑,谁可以批准,谁可以发布

多租户不是GrapesJS的功能。编辑器中没有强制执行,依赖客户端选择正确租户的页面构建器不是多租户——它是一个共享数据库,采用UI约定。

探索SaaS页面构建页面
品牌形象

把你的Vue编辑器变成你自己的产品

界面中没有任何东西必须看起来像库。面板、图标、措辞和工作流程都是配置——大多数自发的GrapesJS构建器都无法认出是GrapesJS。

  • 定制标志与配色方案
  • 自定义面板和工具栏
  • 每个客户定制模块和模板
  • UI 内的自定义术语
  • 这些角色会改变编辑所揭示的内容
  • 权限在你的服务器上被强制执行,反映在UI中
生态系统

用插件扩展你的Vue页面构建器

插件是一个接收编辑器实例的函数。 这就是整个合同内容——这也是为什么这些文件没有单独的Vue版本。同一个软件包可以兼容Vue组件、Nuxt页面、React应用或普通HTML文件,因为它们都不是它所连接的。
  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

为了明确说不存在的内容:Vue 没有官方的 GrapesJS 封装器,GJS.Market 上也没有专门针对 Vue 的插件。你自己从“onMounted”中调用“grapesjs.init()”,这是五行,目录中的所有插件都能正常工作。

从顶部开始,只添加产品实际覆盖的层。大多数建筑商从不安装下半部分的任何东西。

市场

插件能解决你本来需要安排的部分

GJS.Market的真实列表,按他们移除的问题分组。所有列表都安装到你Vue组件创建的同一个编辑器实例中。

购物清单

搭建你的Vue页面构建栈

同一个目录,只是根据你正在构建的产品来切割。安装与你情况相匹配的协议栈,忽略其他的——一个加载所有插件的编辑器更慢更难用,而不是更好。

所示价格为当前 GJS.Market 挂牌价格;免费插件已标注。

目录

每个类别,按你需要的顺序

如果上面的堆栈与你的产品不匹配,可以从这里开始。这些是目录部分,大致按照构建者进入它们的顺序排列。

浏览所有内容
买卖还是组装

每个功能都是自己构建,而不是用插件扩展

这两列都不是免费的。问题只是你的队伍应该花时间在哪一栏。

考量内部构建从 GJS.Market 安装
获得该能力发展时间在你的路线图上安装和配置
保持功能正常你要永远维持它作为公开包维护
再利用仅内部代码这是其他产品已经运行的解决方案
范围你自己构建每一个功能只添加产品所需的内容
成本落在哪里工程时间曾经的挂牌价
你的团队负责什么编辑基础设施你的产品

本表中故意不显示任何成本或时间数据——我们不了解你的团队,任何数字都是虚构的。

真正的比较

从零开始构建Vue页面构建器,而不是GrapesJS。

逐行说明你自己写的内容和已经存在的内容。“可扩展”意味着引擎提供钩子,你提供行为——通常是几行,有时是插件。

能力从零开始GrapesJS
编辑画布建造收录
拖拽建造收录
组件模型建造收录
方块建造可扩展性
Style Manager建造收录
响应式剪辑建造收录
层树建造收录
撤销与重做建造收录
资产建造可扩展性
模板建造可扩展性
存储建造可扩展性
HTML / CSS 导出建造收录
画布中的Vue组件建造未包含在内——画布渲染的是DOM
多租户、角色、出版建造未包含——您的申请

包含 = 随核心一同出厂。可扩展 = 文档化的扩展点,以及存在插件。
已在2026-09-02上验证过GrapesJS、0.23.6。

构建你的Vue产品。不要重建可视化编辑器。

积分

将GrapesJS与Vue 3整合

五步,一个组成部分。 没有官方的 Vue 封装器,你也不需要:GrapesJS 渲染成一个普通元素,所以唯一针对 Vue 的问题是哪个生命周期钩子调用了“init()”。安装 grapesjs 0.23.6,创建组件,挂载时初始化,传递插件,卸载时销毁。

  1. 安装GrapesJS
  2. 创建编辑器组件
  3. 挂载时初始化
  4. 配置插件
  5. 下车时摧毁
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”,不是“ref”:编辑器是一个大型且无反应的对象,深度代理会免费消耗性能。
  • “onMounted”从不在服务器上运行,这也是为什么在Nuxt中它安全,无需额外设备。
  • “destroy()”在卸载事宜上——一种路线变更,导致编辑挂载泄露听众和iframe。
  • 布线时显示“storageManager: false”,等API准备好再换适配器。
  • 导入一次编辑器样式表;它负责面板样式,不是你的应用程序。
  • 之后的所有内容——事件、包装器、可组合表单——都在集成指南中。
阅读完整的Vue集成指南
Nuxt

Vue 3 + Nuxt

GrapesJS 需要一个浏览器 DOM。在 Nuxt 的服务器渲染下没有“文档”,所以编辑器必须在客户端创建——而 “onMounted” 已经保证了这一点。“<ClientOnly>” 是腰带和支架版本,也是备用标记所在。

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

服务器渲染编辑器周围的所有内容;编辑器本身在组件挂载后才会出现。

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>

复制,非假设

播放时间
Node 20, no DOM
GrapesJS
0.23.6
导入模块
import('grapesjs') → resolves
呼叫init()
grapesjs.init() → ReferenceError: document is not defined

在纯 Node 上运行,2026-09-02 上不使用 DOM。区别很重要:导入是安全的,所以你不需要动态导入来保持捆绑包服务器安全——你需要在浏览器中完成初始化调用。

  • 如果你想要服务器渲染的备援代替编辑器,可以使用“<ClientOnly>”。
  • '.client.vue' 后缀是 Nuxt 用来表达整个组件同样内容的方式。
  • SSR并不是本页最有趣的部分——它是一个边界,而且是两行的。
  • 编辑器路由之外的所有内容在服务器上渲染和现在完全一样。
避免这些

构建Vue页面构建器时应避免的4个错误

这些问题一开始就便宜,客户进入编辑器后修复成本较高。

  • 错误

    SSR 期间初始化

    在服务器上运行的任何地方调用“init()”都会被抛弃,因为没有“文档”可以渲染画布。

    该怎么办

    编辑器只用“onMounted”创建,如果想要服务器渲染的备用,就用“<ClientOnly>”包裹路由。

  • 错误

    只保存HTML

    渲染出来的输出无法被转换回可编辑文档。以这种方式保存的每一页在发布时都会被冻结。

    该怎么办

    将项目JSON作为真实数据源存储,发布时重新生成HTML和CSS。

  • 错误

    为用户提供无限的空白画布

    完全自由会产生破坏设计系统的页面,而首次运行时面板中没有任何内容,则根本不会产生页面。

    该怎么办

    发布精心策划的块和模板,并限制用户可访问的样式属性。

  • 错误

    安装所有插件

    每个插件都会添加面板、捆绑权重和用户必须理解的表面。拥挤的编辑器更难用,但功能不强。

    该怎么办

    先从产品形状的堆栈开始,真正需要时再添加插件。

发射前

Vue 页面构建器的生产检查表

这些因素区分了一个可用的演示和可以展示给付费客户的演示。

编辑

生命周期与配置

实例在每次路径变更中都表现正常。

  • 'init()' 每次挂载运行一次,从不在服务器上运行
  • “destroy()”在卸载和路线变更时运行
  • 插件注册时间早于第一个“load()”
  • 自定义组件和模块在一个地方注册
  • 编辑器样式表只加载一次
数据

项目数据

用户输入的内容不会丢失。

  • Project JSON 是存储的真相来源
  • 自动保存开启,并使用合理批处理
  • 版本会被保留,这样错误的编辑才能恢复
  • Publish 会将 HTML 和 CSS 分别写入项目之外
  • 加载失败以错误的形式出现,绝不会以空白画布的形式出现
用户体验

剪辑体验

非开发者也能独立制作好页面。

  • 用户熟悉类别的精心整理区块
  • 每个页面类型至少有一个模板
  • 存档状态在你自己的UI中可见
  • 设备宽度是可达且明显的
  • 空状态说明下一步该做什么

首发体验决定了采用率,而非功能数量。

安全性

服务器端执行

每条规则在客户端无法触及的地方都会被执行。

  • 每个编辑器路由的认证
  • 每次加载、存储和发布调用均需授权
  • 按类型和规模上传验证,服务器端
  • 发布前已消毒的HTML。
  • 租户隔离是在服务器上检查的,而不是从请求中推断出来的
出版

让页面上线

从批准的草稿到实时URL的路径被定义。

  • 与已发布成果相匹配的预览
  • 一个显式发布操作,独立于保存
  • 在流程需要的地方进行审核或批准
  • 发布后的缓存失效
  • 回滚到上一个版本的路径
性能

性能考量

编辑器依赖很重,它只属于一条路由。构建器中大多数性能问题都源于加载它在不需要的地方。

  • 只加载实际编辑的路由编辑器,不要在你的应用壳里加载。
  • 懒惰地加载重插件和面板,而不是在启动时注册所有内容。
  • 避免编辑器实例处于深度反应状态——“shallowRef”是专门用于此类对象的。
  • 不要在每次更改时都把编辑器状态镜像到Vue参考;要听你实际渲染的事件。
  • 分页或懒惰地加载大型资产库,而不是给资产管理器成千上万行。
  • 安装你产品使用的插件;每多一个插件就要增加捆绑包的尺寸和面板空间。
安全性

安全考量

页面构建器接受用户的任意内容,并将其转化为其他人看到的页面。将所有输入视为不可信,将所有客户端规则视为装饰性。

  • 授权每个项目在服务器上加载、存储和发布。
  • 在查询中强制执行租户隔离,而不是在发出租户的组件中。
  • 在上传到达存储之前,按类型和规模进行验证。
  • Sanitise在提供给任何人之前就已经发布了HTML。
  • 像验证其他端点一样,验证编辑器与API通信的对象。
  • 保护发布端点分别——发布是特权操作。
  • 即使UI已经隐藏了按钮,也要重新检查服务器权限。

切勿只依赖客户端权限。

谁会这么做

谁在开发Vue页面构建器?

不同的产品,一种架构。如果你认出了你的团队,接下来的页面内容就是为你写的。

SaaS 公司

为现有产品添加视觉编辑功能,使客户停止为内容变更提交工单。

代理机构

为每个客户构建定制编辑体验,基于他们维护的一个代码库。

CMS 平台

为客户提供平台已有内容的视觉编辑。

营销平台

让竞选团队在没有开发者参与的情况下启动页面。

企业队

创建受控的内部编辑工作流程,包括角色、审核和审批。

问题

Vue 页面构建器 FAQ

什么是Vue页面构建器?

Vue 应用程序中的可视化编辑器,允许用户通过将部分拖到画布上来组装和样式页面,而无需写标记。Vue 应用提供路由、用户和数据;编辑器提供画布。

我可以和Vue 3一起使用GrapesJS吗?

是的。GrapesJS 渲染成一个普通的 DOM 元素,所以你在 'onMounted' 里创建它,然后在 'onBeforeUnmount' 里销毁它。不需要用到封装库。

我可以将 GrapesJS 与 Nuxt 一起使用吗?

是的。编辑器是在客户端创建的;'onMounted' 已经保证了这一点,'<ClientOnly>' 会给你一个服务器渲染的备份。

GrapesJS和Nuxt SSR兼容吗?

在服务器端导入模块是安全的——只有“init()”需要DOM。因此,周围页面会正常服务器渲染,编辑器在组件挂载后才会出现。

GrapesJS 是 Vue 页面构建器吗?

它是一个框架无关的编辑引擎,不是Vue库。当你把它挂载到Vue组件中并连接到你自己的存储和发布时,它就变成了Vue页面构建器。

我该如何将GrapesJS与Vue整合?

安装包,添加带有容器元素的组件,带你的插件和模块在“onMounted”中调用“grapesjs.init()”,卸载时调用“destroy()”。完整指南涵盖事件、组合和包装器。

我可以用Composition API吗?

是的,这很自然——生命周期钩子正是创建和拆解该在的位置。把实例放在“shallowRef”而不是“ref”里。

GrapesJS有官方的Vue封装吗?

没有。官方有 React 封装,但没有针对 Vue 的封装;npm 上的包针对的是 Vue 2,自 2022 年以来未更新。自己调用“init()”大约五行,避免依赖未维护的代码。

我可以创建自定义方块吗?

是的。区块会在编辑器的Block Manager上注册,带有你自己的标记、标签和分类,你可以根据产品词汇来组合它们。

我可以创建自定义组件吗?

是的。定义你自己的组件类型,带有它们自己的设置、约束和行为,然后将它们作为块暴露出来。这就是构建器不再显得通用的方式。

Vue 组件会在画布内部渲染吗?

不行。画布是一个独立文档,渲染的是普通的DOM,所以它编辑的是HTML和CSS,而不是挂载Vue组件。你的应用程序是Vue;编辑后的页面是标记,你的应用可以随意渲染。

我可以创建可重复使用的模板吗?

可以。把整个布局保存为起点,可以通过自己的存储,或者用目录里的模板管理插件保存。

我可以把项目保存到自己的后台吗?

是的,这正是设计的预期。你注册一个存储适配器,使用“加载”和“存储”方法调用你的API——编辑器从不直接与数据库通信。

我应该存储项目JSON还是HTML?

存储项目JSON:它是编辑器重新加载的可编辑真实来源。发布时生成HTML和CSS。仅存储HTML会使页面永久无法编辑。

我可以用Vue做一个SaaS页面构建器吗?

是的。你的Vue应用负责账户、图纸和路由;编辑器负责创作;你的API负责项目。这种组合是作为产品出售的建筑机常见的形状。

我可以构建一个多租户页面构建器吗?

是的,但租约存在于你的应用程序和数据库中,而不是在编辑器中。按租户范围确定每个项目、资产和模板,并在服务器端强制执行。

我可以创建一个白标页面构建器吗?

是的。标志、颜色、面板、术语和可用模块都是配置的,这样每个客户都能获得一个看起来像你产品的环境。

我能用Vue构建一个登陆页面构建器吗?

是的——它是最常见的第一版。策划一小部分营销版块,添加模板,让营销团队通过现有的发布流程发布。

我可以用 Vue 构建一个 CMS 编辑器吗?

是的。注册与内容模型镜像的组件类型,这样编辑者就能用视觉方式处理你的实体,而不是用自由形式的标记。

我可以用插件来扩展编辑器吗?

是的。插件是一个接收编辑器实例的功能,所以整个 GJS.Market 目录在 Vue 应用中可以保持不变——没有专门针对 Vue 的版本需要寻找。

我可以商业使用GrapesJS吗?

是的。核心是BSD-3-Clause授权的,允许商业使用,包括你销售的产品内。检查你安装的任何插件的单独许可证。

需要帮助构建你的Vue页面构建器吗?

需要帮助将GrapesJS与Vue或Nuxt集成,创建自定义模块和组件,连接后端,或构建生产准备的编辑流程吗?我们负责这项工作。

对于那些宁愿发布产品而非编辑器基础设施的团队来说。

从这里开始

无需从零开始,即可构建你的Vue页面构建器

应用用Vue,视觉编辑用GrapesJS。添加你自己的组件、模块、模板、存储和发布流程——需要时再用GJS.Market插件扩展构建器。

开发者

开始

五步一个组件。安装包,今天下午在你的Vue应用里运行编辑器。

开始
产品团队

浏览插件

模块、模板、存储、资源和导出——安装你本来会放在路线图上的功能。

浏览插件
公司

获取实施帮助

集成、自定义组件、后端布线以及与团队共同构建的生产编辑工作流程。

跟我们聊聊

你的Vue应用。你的编辑器。你的产品。