应用层
React / Next.js
你的应用界面、认证、路由、计费、用户、权限和API。编辑器是其中一条路径,不是整个产品。
方块
你的页面
风格
26k+
GitHub 星
100+
GJS.Market 上的插件
1.4M+
npm 下载量/月
$0
编辑许可费
未修改的开源编辑器。这是本页其他所有内容的基础——画布、块、样式管理器、设备切换、撤销/重做、导出。
从第三方演示网站加载实时编辑器。除非你要求,否则什么都不会被加载。
React 页面构建器是一种嵌入 React 应用程序中的可视化编辑界面,允许用户创建、修改和排列页面内容,而无需手动编写 HTML 和 CSS。
关键词是embedded。React页面构建器不是用户访问的独立网站——它是产品内部、登录、写入数据库的路径。
三层负责工作,且属于三个不同的所有者。混淆它们是页面构建器项目停滞的最常见原因。
应用层
你的应用界面、认证、路由、计费、用户、权限和API。编辑器是其中一条路径,不是整个产品。
编辑图层
可视化画布、组件、块、样式、拖放、命令和序列化。那部分需要几个月写,几年才能加固。
持久化层
项目存储、用户、权限、发布和业务逻辑。编辑器会把JSON和HTML交给你;文件放哪里、谁能看到,都是你的。
一个你可以放盒子的画布,就是一个周末。以下所有内容就是将原型变成你可以展示给付费客户的东西——而清单上的每一项都是必须有人构建、测试并持续工作的子系统。
制作第一个拖放原型相对容易。围绕它打造的编辑器在生产中可靠的部分是成本最高的部分。
写自己的编辑器是有充分理由的:你的编辑模型确实与现有任何东西都不同。除此之外,以下是这三种路径对团队的实际要求。
你拥有所有层级,包括那些与你的产品无关的层级。
你实现并维护
这些都是可能回归的子系统,没有一个能区分你的产品。
建立编辑基础,并围绕它构建你的申请。
你实现
编辑器不再是一个项目。它变成了一个你配置的依赖。
请参见代码在不涉及编辑器架构的情况下添加专业功能。
你安装
你接下来写的功能已经发布、定价并可安装。
浏览插件不要从零开始打造视觉编辑器。要围绕经过验证的编辑器基础打造你的React产品。
每个图层只有一个任务。保持它们分开,整个过程都能被替换——包括编辑器,这也是使用标准编辑器的意义所在。
GrapesJS
Canvas、组件、块、样式、命令、序列化。开源,自架,免许可费。
React / Next.js
你的仪表盘、认证、路由、计费和API。编辑器是你应用内的一个路由。
GJS.Market
你接下来会构建的功能——页面、模板、存储、邮件、SEO。
同一个编辑器核心,指向五个不同的产品。它们之间变化的是模块、存储模型和输出——而不是编辑器。
让你的客户在你的SaaS内部、品牌和基础设施中创建和定制页面。
构建一个SaaS页面构建器为营销人员提供着陆页的视觉界面,避免活动变更作为工程工单送达。
构建一个着陆页构建器多页面网站,具备视觉编辑、共享模板、导航和页面设置。
搭建一个网站建设器可视化邮件创建,输出 MJML,确保用户设计的内容能经受真实邮件客户端的访问。
构建一个React邮件构建器在不替换已有内容模型的情况下,为现有内容系统添加可视化编辑。
向CMS添加可视化编辑为公司内部团队提供内容和页面编辑接口,在托管平台不可行的情况下。
详见插件目录五个工具都自称为React的可视化编辑器,且不可互换。以下每个单元格均取自每个项目的文档或已发布的包元数据。
| 能力 | GrapesJS | Puck | Craft.js | Builder.io | Plasmic |
|---|---|---|---|---|---|
| React 积分 | 官方包装 | React 原生 API | React 原生 API | React SDK | React SDK + codegen |
| 许可 | BSD-3-Clause core, MIT React wrapper | MIT | MIT | MIT SDK, hosted platform | MIT |
| 自主机编辑器 | ✓ — 完全运行在你的应用中 | ✓ | ✓ | ——托管平台 | 部分 — 工作室自建有文档 |
| 嵌入你自己的应用界面 | ✓ | ✓ | ✓ | 通过积分 | 企业 — 白标与嵌入 |
| 视觉画布 | ✓ | ✓ — 同原点iframe | ✓ — 你提供周围的UI。 | ✓ | ✓ |
| 拖拽 | ✓ | ✓ | ✓ | ✓ | ✓ |
| 自定义组件 | ✓ — 自定义组件类型 | ✓ — config + render function | ✓ — 用户组件 | ✓ — 注册组件 | ✓ — 代码组件 |
| 你的React组件在画布中渲染出来 | 通过积分——画布渲染DOM | ✓ — 本地 | ✓ — 本地 | ✓ | ✓ |
| 现成编辑器界面 | ✓ — 默认界面包含 | ✓ | —— 你构建了用户界面 | ✓ — 托管用户界面 | ✓ — 主办演播室 |
| 任意CSS样式管理器 | ✓ — 风格经理 | 习俗 | 习俗 | ✓ | ✓ |
| 响应式/视口编辑 | ✓ — 设备管理器 | ✓ — 视窗 | 习俗 | ✓ | ✓ |
| 坚持保存到你自己的数据库 | ✓ — 存储管理器 + 自定义适配器 | ✓ — 你拥有数据 | ✓ — 序列化为JSON | ——内容存在于Builder中 | 具体情况是——项目在Plasmic中运行 |
| HTML / CSS 导出 | ✓ — getHtml() / getCss() | 习俗 | 习俗 | 看情况 | ✓ — 代码生成 |
| 插件生态系统 | ✓ — GJS.Market, 100+ plugins | ✓ — 插件API | — | ✓ | ✓ |
| 白标 | ✓ | ✓ | ✓ | 这取决于计划 | 企业号 |
| 电子邮件(MJML / 通讯) | ✓ — MJML 及通讯预设 | 习俗 | 习俗 | —— 已弃用的电子邮件模型 | — |
| 为你自己的终端客户嵌入 | ✓ | ✓ | ✓ | 这取决于计划 | 企业号 |
| 最新发布 | 0.23.6 · 2026-08-25 | 0.23.0 · 2026-08-07 | 0.2.12 · 2025-02-14 | 9.4.4 · 2026-09-02 | 2.0.26 · 2026-09-02 |
✓ = 文档化能力。自定义 = 支持,但你实现了。通过集成 / 依赖 / 企业 = 在供应商设定的条件下可用。— = 未提供,或未作为产品本身能力文档。
将2026-09-02与每个项目的官方文档、npm注册表元数据和GitHub仓库对照。产品功能和定价随时间变化——在做出架构决策前请查看当前文档。
这些问题没有绝对优越。它们是对不同问题的回答,而你真正问的问题通常写下来后很明显。
选择它
你需要一个可嵌入式的可视化编辑器,端到端控制:自架、深度定制、基于插件、以HTML/CSS为导向,并且能够扩展到页面、模板和邮件。最适合SaaS产品和CMS编辑器。
看看快速开局当
你的主要用例是组合和配置你已经发布的React组件。Puck的模型是一组带有类型字段的React组件配置——当编辑单位是设计系统而非自由格式CSS时,这种模式非常契合。
GrapesJS 与 Puck当
你需要一个低级别的React编辑器框架,并且打算自己构建编辑器体验。它提供拖放功能和组件状态模型;工具栏、面板和样式控件由你自己编写。
GrapesJS 与 Craft.js考虑它们
你需要一个受控的视觉编辑平台,并且愿意接受内容或项目由供应商端存在。两者都是强力产品;但都牺牲了一些架构控制,换取通往首页的路径更短。
比较其他选择三种结果,其中一种不是GrapesJS。如果比较页面无法告诉你何时该放弃,那就不是比较。
编辑者隐藏在你的登录信息后面,写入你的数据库,承载你的品牌形象。你预计会持续扩展多年。
如果用户配置的是你已经发布的组件实例,且明确不希望自由形式样式,那么以React为先的编辑器会比一般的可视化编辑器更自然。
内容模型决定了编辑器,而不是反过来。在你还不知道产品中“页面”是什么之前就选了编辑器,是这些项目最常被重写的方式。
两个包和一个组件。 封装器不捆绑核心库,所以两个都安装。下面的示例按写法运行——@grapesjs/react 封装器要求显式传递核心,这是大多数第三方教程省略的步骤。
npm i grapesjs @grapesjs/react'use client';
import grapesjs, { type Editor } from 'grapesjs';
import GjsEditor from '@grapesjs/react';
import 'grapesjs/dist/css/grapes.min.css';
export default function PageBuilder() {
const onEditor = (editor: Editor) => {
// The full GrapesJS API is yours from here: Blocks, Pages,
// DeviceManager, Commands, StorageManager.
editor.Blocks.add('hero', {
label: 'Hero',
category: 'Sections',
content: '<section class="hero"><h1>Headline</h1></section>',
});
};
return (
<GjsEditor
// Required. The wrapper does not bundle the core library.
grapesjs={grapesjs}
options={{
height: '100vh',
// Persistence is wired separately — see the storage step below.
storageManager: false,
}}
onEditor={onEditor}
/>
);
}每个部件的作用
可视化编辑表面。它在iframe内渲染DOM,这也是为什么样式不能从你的应用中泄漏。
用户从调色板拖拽出来。在这里注册你的产品板块,它们就会变成可编辑的内容。
将项目持久化到你自己的后端。本地和远程适配器都是内置的;自定义适配器则需要负载和存储方法。
扩展表面。从Tailwind模块到MJML邮件,所有文件都通过这种方式到达,无需分支编辑器。
存储是原型的结束和产品的开始。GrapesJS 提供本地和远程存储,并允许你用两种异步方法注册完全自定义的适配器——这样编辑器永远不需要知道你的后端长什么样。
// Persist projects to your own API. GrapesJS ships `local` and `remote`
// storage; `Storage.add` registers a fully custom adapter.
// Docs: grapesjs.com/docs/modules/Storage.html
const onEditor = (editor: Editor) => {
editor.Storage.add('api', {
async load() {
const res = await fetch(`/api/pages/${pageId}`);
return res.json(); // → the project JSON GrapesJS restores from
},
async store(project) {
await fetch(`/api/pages/${pageId}`, {
method: 'PUT',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(project),
});
},
});
};
// …then point the editor at it:
options={{
storageManager: { type: 'api', autosave: true, stepsBeforeSave: 5 },
}}编辑器会把HTML和CSS交还给你。你怎么处理它们,是应用决策:是从Next.js路由渲染,还是推送到CDN,或者以邮件形式发送。编辑器不在服务路径中。
// Editor output → a production page.
// getHtml/getCss return the exact markup the canvas rendered.
const html = editor.getHtml();
const css = editor.getCss();
await fetch('/api/publish', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ slug, html, css }),
});
// Your app renders it wherever you control — a Next.js route, a CDN
// object, an email send. The editor is not in the serving path.已与针对React 18/19和Next.js 15的@grapesjs/react 0.23.6进行了验证。有一点需要早点了解:React包装器是构建你的UI的around,而不是渲染React组件的inside。如果在画布中实时渲染React组件是硬性要求,那么优先渲染React的编辑器会更合适,这页对比中说明了这一点。
// app/editor/page.tsx — the editor is client-only.
// GrapesJS measures the DOM on init, so it must never render on the server.
import dynamic from 'next/dynamic';
const PageBuilder = dynamic(() => import('@/components/page-builder'), {
ssr: false,
loading: () => <EditorSkeleton />,
});
export default function EditorRoute() {
// Auth, params and data fetching stay on the server side of your app.
return <PageBuilder />;
}实用笔记
编辑器是树叶,不是树干。
安装编辑器
将GrapesJS集成到你的React应用中的路由中。此时你拥有了一个可用的画布和默认界面——只需一天的努力,而非一个季度的努力。
定义你的内容模型
决定产品中页面的定义,用户可以创建哪些页面,以及他们不能触碰的哪些内容。这个决定会限制后续所有内容,所以在写积木之前就先做决定。
添加块和组件
把你的产品部分变成模块和自定义组件类型。这时编辑器开始感觉像是产品的一部分,而不是一个通用工具。
连接存储
在你自己的API上注册一个存储适配器,支持自动保存和恢复。项目现在属于用户,草稿在关闭标签页后依然存在。
发布
将已保存的项目转换为生产页面——如Next.js路由、CDN对象、发送邮件。编辑器不参与服务路径。
大多数“我们需要更换编辑者”的讨论最终都只是关于缺失一项能力。更换编辑者花费四分之一;增加一项能力则花费一个下午。
官方包装器将GrapesJS作为React组件挂载,并交付编辑器实例。Starters和React的UI包更进一步。
React 插件MJML 和通讯预设将同一编辑器变成邮件构建器,输出能经受真实邮件客户端的攻击。
电子邮件插件区块包让用户在第一天就有东西可以拖动,而不是空荡荡的调色板和积压工单。
块插件模板和项目管理器可以添加保存的起始点、多项目处理和每页设置。
模板插件Tailwind 块包允许编辑器发布与代码库其他部分匹配的工具类。
Tailwind 插件存储适配器涵盖IndexedDB、Firestore和自定义REST端点——或者你自己写大约二十行。
存储插件内容生成、图片工具和无障碍/SEO审核员都直接插入同一个编辑器,无需分支。
浏览目录不要因为缺少一个功能就替换编辑器。扩展编辑器。
从编辑器核心开始,添加你产品真正需要的功能。以下价格、名称和缩略图均直接来自目录,因此这里不会偏离销售内容。
目录暂时无法使用。直接浏览市场。
三个购物清单,而不是一堆目录。每个清单都是该产品工作构建中除了免费核心外通常需要的。
对于面向客户的开发者来说,你的产品内部
用于多页网站创建
用于视觉邮件创建
建立邮件堆栈实时目录价格。堆叠是建议,不是捆绑——买你需要的零件。
编辑许可很少是关键数字。这些是每条路线创建的成本中心——故意避免虚构数字,因为只有团队的费率和范围能让数字变得真实。
初始版本是较小的那一部分。
成本中心
未来的每一个功能请求都会落到拥有编辑器的团队身上——也就是你。
编辑到来了;产品工作依然存在。
成本中心
核心无需支付许可费,上游维护则是别人的工作。
购买你即将安排的专题。
成本中心
每个插件都是从路线图中移除一条,而不是添加一项。
参见目录价格页面构建器中昂贵的部分并不是第一个演示。它包含了让编辑器具备制作准备所需的一切。
这里有一个屏幕展示整个论点。左侧列是只有你能做的工作,因为它是你的产品。另外两列是已经存在的工作。
页面构建器最昂贵的部分并不是第一个演示。它包含了让编辑器具备生产准备所需的一切——而且几乎没有什么是客户付钱给你的。
四个团队带着相同要求和截然不同的约束来到本页面。
你需要在产品内、域名、品牌下有可视化编辑器——而且不能让客户去第三方平台编辑自己的内容。
视觉编辑只是众多功能路线图中的一个功能。你需要它能顺利发布,而不是成为永久的内部平台团队。
你为一个又一个客户打造相同的编辑界面。一个可重复使用、可自我托管的基础比任何单一项目都更有价值。
你需要一个可扩展的编辑器核心,并能完全控制周围的应用,而不是继承别人的产品决策。
三个问题。四个答案中有两个不是GrapesJS。
你需要可视化编辑器在自己的应用里吗?
一眼就能看到每条路径
这些方法都远远超出上述矩阵——数据模型、迁移路径以及其他工具占优的情况。
先从 GrapesJS 开始,集成到 React,然后扩展你的编辑器,满足你产品所需的功能。
打开一个实时编辑器,然后快速启动,把一个挂载到你自己的React应用里。
试试GrapesJS模块、页面、模板、存储适配器、MJML电子邮件和SEO工具——按能力定价。
浏览GJS.Market插件在决定使用架构栈之前,先做架构评审、定制编辑器构建,或者第二意见。
咨询GrapesJS专家打造你的产品。而不是你的编辑架构。