Vue继续负责
你的应用程序,完全按照你今天构建的样子。
- 应用 UI
- 布线
- 认证
- 业务逻辑
- 国家管理
- APIs 与数据取用
- 计费与计划
- 用户与权限
方块
你的页面
风格
0.23.6
本页所对比的GrapesJS版本
100+
GJS.Market 上的插件和模板
BSD-3-Clause
编辑器核心的许可
$0
运行编辑器本身的成本
这是GrapesJS本身,不是截图。拖入一个块,选择一个元素,重新样式,切换设备宽度。编辑器由一个“init()”调用创建——在一个调用存在“onMounted”的Vue应用中,你看到的所有内容表现都一样。
应用了没有主题的库存编辑器。这是你配置之前得到的——下面每个构建者都是从起点自定义的。
在iframe中加载外部演示。
生产页面构建器远不止是几个Vue组件。它是一个画布、一个拖拽系统、一个组件模型、一个样式引擎、响应式编辑、撤销历史、资产管理、存储和导出。这里是整个表面,以及每个部分最终归谁所有。
用户可以直接编辑独立文档,拥有自己的样式和滚动功能。
投放目标、插入点、重新排序和嵌套规则。
类型化元素,拥有各自的设置、约束和行为。
点击选择、悬停轮廓、按元素工具栏和徽章。
字体、颜色、间距和布局控制都绑定在选择器上。
设备宽度和断点范围样式在同一画布中。
页面的树状结构保持可导航性。
每次编辑都有命令历史,而不仅仅是文本。
从当前文档生成的干净标记和样式表。
用户拖入的现成部分。你的,或者安装好的。
整个起始布局,这样没人会遇到空白画布。
上传、媒体库和图像处理。
内置编辑器之外的内联文本格式。
一个项目里有超过一页。
项目数据被写入和读取的地方。你的API,你的数据库。
谁可以开启、编辑并发布哪个项目。
将一个客户的页面、资源和模板与另一个客户的分离。
将批准的输出变成你基础设施上的实时页面。
每个客户应享有的权利以及他们为此支付的费用。
中间栏是GJS.Market的意义所在:它是实际功能,你安装的,而不是调度。右侧的列永远不会成为别人的问题——那是你的产品,本页在每个涉及它的部分都明确说明了这一点。
参见五步积分GrapesJS 不是你的应用替代品,也不是托管服务。它是一个编辑引擎,安装在一条路由的一个元素中。图中其上下的所有部分都归你所有。
所有让产品属于你的元素。GrapesJS对此毫无意见。
一个挂载实例,在一个组件内,在同一条路由上。这就是你没有构建的那层。
编辑会给你两个文物和一个媒体流。接下来发生的事由你的API决定。
你设计的模式中的普通行。这里没有任何必须采用的GrapesJS格式。
从头到下读:你的Vue应用程序认证用户并将其导向到编辑器页面;编辑器生成项目数据;你的API将其写入数据库。编辑器从不与数据库通信,数据库也不必理解编辑器。
编辑器如何安装到Vue组件中不是。这是大多数Vue开发者问的第一个问题,答案会影响页面其余部分的阅读方式。这两层不重叠:一层运行你的应用程序,另一层运行其中的编辑表面。
你的应用程序,完全按照你今天构建的样子。
视觉编辑层,你在一个元素里给它。
顺便说一句:画布渲染的是iframe内部的普通DOM,而不是挂载的Vue组件。你的应用是Vue;用户编辑的是HTML和CSS,然后你的应用会随意渲染。
同一个引擎,只是配置不同。这些都是真实的产品形态,团队发布了——而且每个都有更深入的页面。
SaaS
让客户在产品内创建和编辑页面,无需离开产品,也无需开发人员。
探索SaaS构建器网站
完整的可视化网站创建体验:多页项目、模板、资源和发布。
参见着陆页角度市场营销
让市场团队按自己的时间安排启动活动页面,而不是按你的节奏。
探索登陆建造器内容
为内容团队提供一个可视化的编辑界面,覆盖你已有的内容模型。
参见CMS编辑器形式
从输入字段组件可视化地组合表单,然后发布到你自己的端点。
浏览表单插件电子邮件
可视化地编写和管理电子邮件模板,输出内容面向邮件客户端而非浏览器。
参见电子邮件建设文献
将文档、报告和单页文件可视化布局,然后从后端导出或渲染。
参见嵌入式编辑器代理机构
给每个客户发放一个品牌编辑环境,看起来像你的产品,而不是像图书馆。
探索白标这是编辑器在第一天给你的,在安装任何插件之前。每个插件都可以配置——面板、分类、约束和标签都是你自己设置的。
用户通过拖拽部分和元素到画布中,设置下放目标、重新排序和嵌套来构建布局。
定义你自己的元素类型,带有它们的设置、约束和行为,并在每个项目中重复使用。
用户从面板中提取的即用版块。将它们按符合产品词汇的类别进行分组。
字体、颜色、间距和布局控制。限制属性集,防止用户通过样式设计脱离你的设计系统。
在桌面、平板和移动端之间切换画布宽度,并写入带有断点范围的样式。
页面的结构树,因此深度嵌套的布局保持可选择和可重新排序。
一个用于图像和媒体的资产管理工具,并以你已经使用的存储或CDN为后盾。
可重复使用的起始布局,这样新页面就是一个实体,而不是空白画布。
从当前文档生成HTML和CSS,或者拿项目数据自己渲染。
通用网站构建器和属于你产品中的构建器的区别在于组件集。不要强行将你的内容模型纳入别人的元素类型——注册你自己的。
每一步都是编辑器实例上的普通配置:一个组件类型、一个插入组件的块、一个排列多个组件的模板、一个对它们生效的命令,以及一个暴露组件的面板。
// 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' },
});
}不要强行把你的产品做成通用的网站建设工具。根据你自己的内容模型和设计系统定制编辑器。
一个不受限制的画布会产生让其所处产品尴尬的页面。编辑器可以双向配置——有用的设置不是最大自由,而是有界自由。
给予用户创作自由,同时不让他们破坏你的产品设计体系。
决定页面构建器是否被使用的最大因素,是第一次访问时块面板里等待的内容。构建你产品真正需要的部分,或者安装库并重新命名。
头条、配角和主要动作。
一个不断重复的能力或优势网格。
规划带有特色和行动号召的专栏。
带出处的引用,排成一排或轮播。
问答对,可展开或平面。
在你自己的终端上发布一个表单板块。
一个全宽的带,只有一个清晰的动作。
导航栏、法律链接和品牌标志。
GrapesJS 不托管任何东西,也不选择数据库。你注册存储适配器时有两种方法——加载和存储——并且都与你的 API 通信。没有任何数据离开你的基础设施。
编辑只知道“load()”和“store()”这两个呼号。这些呼号最终会在哪里——Postgres、MySQL、Mongo、S3、一个无头CMS——是编辑从未参与的决定。
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}`);
},
});
},
],
});你控制你的数据和后端。编辑器就像你应用的其他部分一样,是你 API 的一个客户端。
编辑部会导出两个伪影,它们不能互换。存储错误的伪影就是导致六个月后页面无法编辑的错误。
完整可编辑文档:组件、样式、资源、页面。反馈给“load()”,用户会从中断处恢复。这是你绝不能丢失的一行。
当前文档的渲染,按需生成。每次发布时重新生成,而不是将其视为状态;它不能被转换回可编辑项目。
JSON 是编辑者读取的内容。HTML 是访客阅读的内容。只存储第二个是单向门——页面永远渲染,永远无法编辑。
// 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.再编辑一次
出版
存储项目数据以便编辑。需要发布输出时生成HTML和CSS。
创作和发布是不同的工作。GrapesJS 在用户满意页面时完成;之后的流程就是你的工作流程,在你的基础设施上。
在产品需要的地方插入审核、审批或排程——编辑对保存到上线之间的步骤没有意见。
已发表成果可以去的地方
GrapesJS 负责创作。你的基础设施负责发布——编辑器没有捆绑主机,本页面也不会假装有其他。
每个客户都有自己的页面、资源、模板和品牌。这种隔离性是你数据模型和API的特性——编辑者只是被分配到合适的项目。
Your Vue SaaS
组织A
组织B
组织C
你的Vue应用和后端实现了什么
多租户不是GrapesJS的功能。编辑器中没有强制执行,依赖客户端选择正确租户的页面构建器不是多租户——它是一个共享数据库,采用UI约定。
界面中没有任何东西必须看起来像库。面板、图标、措辞和工作流程都是配置——大多数自发的GrapesJS构建器都无法认出是GrapesJS。
为了明确说不存在的内容:Vue 没有官方的 GrapesJS 封装器,GJS.Market 上也没有专门针对 Vue 的插件。你自己从“onMounted”中调用“grapesjs.init()”,这是五行,目录中的所有插件都能正常工作。
从顶部开始,只添加产品实际覆盖的层。大多数建筑商从不安装下半部分的任何东西。
GJS.Market的真实列表,按他们移除的问题分组。所有列表都安装到你Vue组件创建的同一个编辑器实例中。
同一个目录,只是根据你正在构建的产品来切割。安装与你情况相匹配的协议栈,忽略其他的——一个加载所有插件的编辑器更慢更难用,而不是更好。
客户在你的产品内编辑自己的页面。
内容团队通过可视化编辑结构化内容。
详见CMS页面完整网站创建,多部分且响应式。
是活动和事务模板,不是网页。
参见电子邮件建设有限制的编辑,包含审查、角色和审批。
所示价格为当前 GJS.Market 挂牌价格;免费插件已标注。
如果上面的堆栈与你的产品不匹配,可以从这里开始。这些是目录部分,大致按照构建者进入它们的顺序排列。
这两列都不是免费的。问题只是你的队伍应该花时间在哪一栏。
| 考量 | 内部构建 | 从 GJS.Market 安装 |
|---|---|---|
| 获得该能力 | 发展时间在你的路线图上 | 安装和配置 |
| 保持功能正常 | 你要永远维持它 | 作为公开包维护 |
| 再利用 | 仅内部代码 | 这是其他产品已经运行的解决方案 |
| 范围 | 你自己构建每一个功能 | 只添加产品所需的内容 |
| 成本落在哪里 | 工程时间 | 曾经的挂牌价 |
| 你的团队负责什么 | 编辑基础设施 | 你的产品 |
本表中故意不显示任何成本或时间数据——我们不了解你的团队,任何数字都是虚构的。
逐行说明你自己写的内容和已经存在的内容。“可扩展”意味着引擎提供钩子,你提供行为——通常是几行,有时是插件。
| 能力 | 从零开始 | GrapesJS |
|---|---|---|
| 编辑画布 | 建造 | 收录 |
| 拖拽 | 建造 | 收录 |
| 组件模型 | 建造 | 收录 |
| 方块 | 建造 | 可扩展性 |
| Style Manager | 建造 | 收录 |
| 响应式剪辑 | 建造 | 收录 |
| 层树 | 建造 | 收录 |
| 撤销与重做 | 建造 | 收录 |
| 资产 | 建造 | 可扩展性 |
| 模板 | 建造 | 可扩展性 |
| 存储 | 建造 | 可扩展性 |
| HTML / CSS 导出 | 建造 | 收录 |
| 画布中的Vue组件 | 建造 | 未包含在内——画布渲染的是DOM |
| 多租户、角色、出版 | 建造 | 未包含——您的申请 |
包含 = 随核心一同出厂。可扩展 = 文档化的扩展点,以及存在插件。
已在2026-09-02上验证过GrapesJS、0.23.6。
构建你的Vue产品。不要重建可视化编辑器。
五步,一个组成部分。 没有官方的 Vue 封装器,你也不需要:GrapesJS 渲染成一个普通元素,所以唯一针对 Vue 的问题是哪个生命周期钩子调用了“init()”。安装 grapesjs 0.23.6,创建组件,挂载时初始化,传递插件,卸载时销毁。
npm install grapesjs<!-- 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>GrapesJS 需要一个浏览器 DOM。在 Nuxt 的服务器渲染下没有“文档”,所以编辑器必须在客户端创建——而 “onMounted” 已经保证了这一点。“<ClientOnly>” 是腰带和支架版本,也是备用标记所在。
服务器渲染编辑器周围的所有内容;编辑器本身在组件挂载后才会出现。
<!-- 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 上运行,2026-09-02 上不使用 DOM。区别很重要:导入是安全的,所以你不需要动态导入来保持捆绑包服务器安全——你需要在浏览器中完成初始化调用。
这些问题一开始就便宜,客户进入编辑器后修复成本较高。
错误
在服务器上运行的任何地方调用“init()”都会被抛弃,因为没有“文档”可以渲染画布。
该怎么办
编辑器只用“onMounted”创建,如果想要服务器渲染的备用,就用“<ClientOnly>”包裹路由。
错误
渲染出来的输出无法被转换回可编辑文档。以这种方式保存的每一页在发布时都会被冻结。
该怎么办
将项目JSON作为真实数据源存储,发布时重新生成HTML和CSS。
错误
完全自由会产生破坏设计系统的页面,而首次运行时面板中没有任何内容,则根本不会产生页面。
该怎么办
发布精心策划的块和模板,并限制用户可访问的样式属性。
错误
每个插件都会添加面板、捆绑权重和用户必须理解的表面。拥挤的编辑器更难用,但功能不强。
该怎么办
先从产品形状的堆栈开始,真正需要时再添加插件。
这些因素区分了一个可用的演示和可以展示给付费客户的演示。
实例在每次路径变更中都表现正常。
用户输入的内容不会丢失。
非开发者也能独立制作好页面。
首发体验决定了采用率,而非功能数量。
每条规则在客户端无法触及的地方都会被执行。
从批准的草稿到实时URL的路径被定义。
编辑器依赖很重,它只属于一条路由。构建器中大多数性能问题都源于加载它在不需要的地方。
页面构建器接受用户的任意内容,并将其转化为其他人看到的页面。将所有输入视为不可信,将所有客户端规则视为装饰性。
切勿只依赖客户端权限。
不同的产品,一种架构。如果你认出了你的团队,接下来的页面内容就是为你写的。
为现有产品添加视觉编辑功能,使客户停止为内容变更提交工单。
为每个客户构建定制编辑体验,基于他们维护的一个代码库。
为客户提供平台已有内容的视觉编辑。
让竞选团队在没有开发者参与的情况下启动页面。
创建受控的内部编辑工作流程,包括角色、审核和审批。
Vue 应用程序中的可视化编辑器,允许用户通过将部分拖到画布上来组装和样式页面,而无需写标记。Vue 应用提供路由、用户和数据;编辑器提供画布。
是的。GrapesJS 渲染成一个普通的 DOM 元素,所以你在 'onMounted' 里创建它,然后在 'onBeforeUnmount' 里销毁它。不需要用到封装库。
是的。编辑器是在客户端创建的;'onMounted' 已经保证了这一点,'<ClientOnly>' 会给你一个服务器渲染的备份。
在服务器端导入模块是安全的——只有“init()”需要DOM。因此,周围页面会正常服务器渲染,编辑器在组件挂载后才会出现。
它是一个框架无关的编辑引擎,不是Vue库。当你把它挂载到Vue组件中并连接到你自己的存储和发布时,它就变成了Vue页面构建器。
安装包,添加带有容器元素的组件,带你的插件和模块在“onMounted”中调用“grapesjs.init()”,卸载时调用“destroy()”。完整指南涵盖事件、组合和包装器。
是的,这很自然——生命周期钩子正是创建和拆解该在的位置。把实例放在“shallowRef”而不是“ref”里。
没有。官方有 React 封装,但没有针对 Vue 的封装;npm 上的包针对的是 Vue 2,自 2022 年以来未更新。自己调用“init()”大约五行,避免依赖未维护的代码。
是的。区块会在编辑器的Block Manager上注册,带有你自己的标记、标签和分类,你可以根据产品词汇来组合它们。
是的。定义你自己的组件类型,带有它们自己的设置、约束和行为,然后将它们作为块暴露出来。这就是构建器不再显得通用的方式。
不行。画布是一个独立文档,渲染的是普通的DOM,所以它编辑的是HTML和CSS,而不是挂载Vue组件。你的应用程序是Vue;编辑后的页面是标记,你的应用可以随意渲染。
可以。把整个布局保存为起点,可以通过自己的存储,或者用目录里的模板管理插件保存。
是的,这正是设计的预期。你注册一个存储适配器,使用“加载”和“存储”方法调用你的API——编辑器从不直接与数据库通信。
存储项目JSON:它是编辑器重新加载的可编辑真实来源。发布时生成HTML和CSS。仅存储HTML会使页面永久无法编辑。
是的。你的Vue应用负责账户、图纸和路由;编辑器负责创作;你的API负责项目。这种组合是作为产品出售的建筑机常见的形状。
是的,但租约存在于你的应用程序和数据库中,而不是在编辑器中。按租户范围确定每个项目、资产和模板,并在服务器端强制执行。
是的。标志、颜色、面板、术语和可用模块都是配置的,这样每个客户都能获得一个看起来像你产品的环境。
是的——它是最常见的第一版。策划一小部分营销版块,添加模板,让营销团队通过现有的发布流程发布。
是的。注册与内容模型镜像的组件类型,这样编辑者就能用视觉方式处理你的实体,而不是用自由形式的标记。
是的。插件是一个接收编辑器实例的功能,所以整个 GJS.Market 目录在 Vue 应用中可以保持不变——没有专门针对 Vue 的版本需要寻找。
是的。核心是BSD-3-Clause授权的,允许商业使用,包括你销售的产品内。检查你安装的任何插件的单独许可证。
应用用Vue,视觉编辑用GrapesJS。添加你自己的组件、模块、模板、存储和发布流程——需要时再用GJS.Market插件扩展构建器。
你的Vue应用。你的编辑器。你的产品。