拖放
用户将块和组件移动到画布上,而不是编辑模板文件。你可以决定哪些块存在、可以放置的位置以及它们可能包含什么。
用拖拽组件可视化构建HTML页面,编辑样式而不用手写CSS,并且控制你的应用生成的HTML和CSS。
26k+
GitHub 星
1.4M+
每月 npm 下载量
100+
GJS.Market 上的插件
BSD-3-Clause
核心许可
这就是页面的全部论点,包含在一个组件中。「Visual」标签页里就是用户拖动和编辑的画布。另外两个标签页是编辑器交还给代码的——没有隐藏的,没有专有的,只是标记和样式表文本,你可以随意存储、转换和发布。
<div id="editor">用户看到的内容:左侧是区块,中间是页面,右侧是样式控制。
方块
Build faster
Launch your next project.
Get started风格
<body>
<section class="hero">
<h1 class="hero__title">Build faster</h1>
<p class="hero__text">Launch your next project.</p>
<a href="/start" class="hero__cta">Get started</a>
</section>
</body>* { box-sizing: border-box; } body {margin: 0;}
.hero{
padding-top:96px;
padding-right:24px;
padding-bottom:96px;
padding-left:24px;
text-align:center;
background-color:rgb(15, 23, 42);
}
.hero__title{
font-size:48px;
color:rgb(255, 255, 255);
}
.hero__cta{
display:inline-block;
padding-top:14px;
padding-right:28px;
padding-bottom:14px;
padding-left:28px;
border-top-left-radius:8px;
border-top-right-radius:8px;
border-bottom-right-radius:8px;
border-bottom-left-radius:8px;
background-color:rgb(99, 102, 241);
color:rgb(255, 255, 255);
}
@media (max-width: 480px){
.hero__title{ font-size:32px; }
}两个代码窗格都是 GrapesJS 0.23.6 的真实返回值,只是为了便于阅读重新做了缩进——实际每次调用返回的都是一整行。在你基于它们开发之前,有两个细节值得先知道:getHtml() 序列化的是外层 wrapper,所以结果被包在 <body>…</body> 里;getCss() 会把简写声明展开成一条条独立属性,并把颜色统一写成 rgb()。样式表开头还有一小段 GrapesJS 注入的重置样式;getCss({ avoidProtected: true }) 不会输出它。
HTML拖放构建器允许用户可视化地组装页面结构,同时你的应用仍掌控底层内容、样式和发布工作流程。
用户将块和组件移动到画布上,而不是编辑模板文件。你可以决定哪些块存在、可以放置的位置以及它们可能包含什么。
内容、布局和样式通过面板编辑,而不是手写每条 CSS 规则。编辑器将这些选择转化为普通样式表规则。
将最终的HTML和CSS作为两个普通字符串检索,带到你自己的应用程序、自己的存储和发布流程中。
它是一款编辑器,用户可以通过将部分拖到画布上,通过控件而非代码进行调整,然后输出真正的HTML和CSS来组装网页。要做到这一点,它必须将以下所有要素整合成一个连贯的软件:
可视化HTML编辑器与简单的拖放库的区别在于,编辑器将整个编辑状态——选择、组件、样式、命令、存储和输出——作为一个系统管理。库会在屏幕上移动一个框;编辑器知道该框是什么,可能包含什么,哪个CSS规则属于它,以及如何序列化结果。
三台公开的GrapesJS组装。只有点击才加载——帧保持不被请求,所以这部分到达时不额外付费。
原版GrapesJS演示版。拖入一个块,选中它,更改样式——然后打开工具栏中的代码视图,看着HTML和CSS随着你的变化。
在iframe中加载第三方演示。点击之前不会请求任何内容。
选择一个区块
用户从你定义的调色板中选择。块是一个有名字、可重复使用的起点——一个英雄、一个定价表、一个表单——而不是任意的空 div。
把它拖进画布里
编辑器会确定块可以合法落在哪里,插入组件并选择它。放置规则由你根据组件类型自行设置。
编辑内容和风格
文本在原地编辑;布局、间距、排版和颜色来自 Style Manager。每一次更改都成为编辑器跟踪的 CSS 规则。
保存项目
Storage Manager 会把编辑器状态发送到你指向的端点。这是继续编辑所需的状态,而不是完成页面。
导出或发布 HTML + CSS
调用 getHtml() 和 getCss(),然后按你的产品需要处理:做安全过滤、套进你自己的布局、保存版本、写缓存、部署上线。
完全取决于你允许的程度。这些内容都是编辑器可以公开的——而且你可以按组件类型锁定,这样营销人员就不会破坏工程师设计的布局。
文本、标题、链接以及你标记为可编辑的内容。你想保留的组件可以直接保持不可编辑。
通过Style Manager的Dimension和Flex控制,可以确定截面、列、容器之间的间距。
字体族、大小、粗细、行高和对齐,以普通 CSS 声明的形式书写出来。
文本、背景、边框以及其他视觉属性。在输出的样式表里,颜色值会被序列化成 rgb()。
通过Asset Manager处理,你可以指向自己的上传端点或存储提供商。
规则以设备为作用域。在断点激活时进行样式处理会发出匹配的媒体查询,而不是覆盖基础规则。
由你定义的结构化、可重复使用的元素——一个区块一旦放置后变成的单位,以及你的应用以后能识别的对象。
特征会变成设置面板中的字段,所以自定义组件只能暴露标题和链接目标,别的什么都不行。
其中一些是配置而非默认配置。GrapesJS 出厂时带有通用、弹性、维度、排版、装饰和额外扇区;资产上传、富文本行为和每个组件权限是你自己布线或安装插件的。
可视化编辑器只有在结果能够融入你的应用时才有用。GrapesJS 区分了两点,这种区别比任何功能列表都重要:它需要的状态以持续编辑,以及用户实际获得的标记。
从画布到线上页面
// What the editor needs to keep editing — components, styles,
// pages, assets and symbols. Store this to resume a session.
const projectState = editor.getProjectData();
// What your users actually receive. Two plain strings.
const html = editor.getHtml(); // <body>…</body>
const css = editor.getCss(); // one line of CSS
// From here it is your application's decision: sanitize it, wrap it
// in your own layout, version it, cache it, put it behind your CDN.
await fetch(`/api/pages/${pageId}/publish`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ html, css }),
});关于预期的说明:输出的样式表是忠实的,不是手工调优过的。简写属性会被展开成一条条独立属性,颜色写成 rgb(),并且除非你关掉它,样式表前面还会加上一小段重置样式。把这份输出当作一个可靠的、需要你再做一道后处理的来源,就像对待任何构建步骤的产物一样。
每个可视化HTML编辑器都需要同样的子系统,才能做出有趣的工作。问题不是你是否需要它们——而是写这些子系统是否值得你团队接下来六个月投入。
HTML 编辑器在编辑任何内容之前需要了解
而且是永久拥有:那个既要像浏览器一样渲染、又要始终可编辑的画布,放置目标的判定逻辑,要能挺过其他所有操作的撤销栈,把内存里的组件树重新变回标记的序列化器——外加产品存续期间针对它们的每一条缺陷报告。
画布、拖放、组件模型、Block Manager、Style Manager、Device Manager、Asset Manager、撤销历史、Storage Manager以及HTML/CSS输出API都包含在核心中。你写的内容是针对你产品特有的部分。
这并不是说GrapesJS就是你的全部产品。存储、认证、权限、发布、安全过滤以及所有产品特定的工作流程都归你负责——请参见下方架构图,了解界限的具体位置。
右侧列并不是承诺某个子系统已经为你的用例完成——它指的是你扩展的GrapesJS部分,而不是你原本会从空白文件开始的部分。
| 编辑器子系统 | 自己构建 | 从GrapesJS开始 |
|---|---|---|
| 画布 | 建造 | 编辑器基础 |
| 拖放 | 建造 | 编辑器基础 |
| 组件模型 | 建造 | DomComponents |
| 方块 | 建造 | Block Manager |
| 样式控制 | 建造 | Style Manager |
| 响应式剪辑 | 建造 | Device Manager |
| 资产 | 建造 | Asset Manager |
| 撤销/重做 | 建造 | 命令与历史记录 |
| 存储 | 建造 | Storage Manager |
| HTML 输出 | 建造 | editor.getHtml() |
| CSS 输出 | 建造 | editor.getCss() |
| 自定义组件 | 建造 | DomComponents.addType |
| 插件架构 | 建造 | 现有插件API |
| 授权与权限 | 建造 | 你的申请 |
| 内容净化 | 建造 | 你的申请 |
| 发布 | 建造 | 你的申请 |
最后三行是诚实的。嵌入编辑并不意味着你对谁可以编辑什么、哪些内容被存储、哪些内容能被公众看到的责任。
编辑器是你产品的一层——不是产品本身。你的应用保留用户、权限、数据以及对哪些内容上线的决定权。
持久性
你的API
数据
你的数据库
交付
你的发布
五位经理承担大部分工作。你将在开始工作一小时内见到他们,因此了解每个经理的职责是值得的。
HTML元素以可编辑组件表示,包含内容、是否可拖拽以及暴露哪些属性,有自己的规则。
调色板。方块是用户拖动的;每个方块都命名它成为的组件。核心会附带一个空调色板,所以显示什么完全由你决定。
Visual CSS 属性控件,默认分为扇区——通用、灵活、维度、排版、装饰和额外。扇区和属性是可配置的。
将项目状态持久化到本地存储、远程终端或你自己编写的存储适配器。自动保存是一个配置标志。
图片和媒体:用户看到的选择器及其后方的上传路径,你可以指向自己的端点或提供者插件。
这时,HTML构建器就不再是通用的了。定义一个组件类型,决定它渲染什么,只展示用户应控制的属性——其余的标记保持工程师写的原样。
// A block is what the user drags out of the panel.
editor.BlockManager.add('hero', {
label: 'Hero',
category: 'Sections',
content: { type: 'hero' },
});
// A component type is what that block becomes on the canvas — and the
// only place you decide what the user may change about it.
editor.DomComponents.addType('hero', {
model: {
defaults: {
tagName: 'section',
attributes: { class: 'hero' },
components: '<h1 class="hero__title">Build faster</h1>',
// Traits become the fields in the settings panel.
traits: [{ type: 'text', name: 'headline', label: 'Headline' }],
droppable: false,
},
},
});在大多数教程中,有四个东西是同名的,而且它们确实不同。把它们分开,就是你能维护的构建器和一堆HTML字符串的区别。
区块
面板里的一个条目:一个标签、一个分类,以及它插入的内容。它纯粹是一个起点——放置完成之后它就不再存在了。
组成部分
DomComponents 注册的类型。它决定标签、默认子节点、该项目是否可放置,以及编辑器之后如何处理它。
特征
设置面板中的字段。特征是本应封闭组件中的一个故意漏洞——标题、链接目标、计划ID。
加价
组件序列化回HTML,包含你定义的类和属性,准备好后端下一步做什么。
有意设计这条链条,非技术用户在你选择的边界内获得真正的自由。跳过它,你就发布了一个能输出 div 的文本编辑器。
这些是几乎每个构建者在第一天就需要的剖面类型,通过它们发出的标记来描述,而不是外观。可以用 Block Manager API 构建它们,或者安装一个块插件,从完整的调色板开始。
一个带有标题、辅助段落和一个按钮样式的链接的部分。
一个带有标志元素的标题和一个窄宽度的导航列表。
一个装有重复卡片的容器,每张卡片都有图标槽、标题和正文。
计划卡包含价格元素、功能列表和行动号召链接。
用引用元素加上引用和可选的头像图片。
一个图像网格,其光源由Asset Manager填充。
一个中心区段,只有一个航向和一个主连接。
一个带有标签输入和动作的表单元素,你可以指向任何你想要的位置。
链接栏、法律文本和辅助导航,并用页脚元素。
值得精确说明的是:这些是块类型的示例,而不是GrapesJS内置的列表。核心是故意从空的Block Manager开始——用户获得哪个调色板取决于你自己,要么写代码块,要么安装本页后面的某个模块插件。
同一个编辑核心,针对六个不同的问题。每个问题都需要HTML级别的控制,原因各不相同。
为用户提供一个可视化的方式来编辑已经存在的HTML页面。由于编辑器会进行往返标记,你是在扩展当前页面,而不是迁移到别人的专有格式。
所见即所得页面构建器让营销人员从团队设计的模块中组装活动页面,同时保留设计系统期望的类别和结构,输出中依然完整。
着陆页构建器将可视化编辑嵌入为产品功能。客户在你的应用内、域名内构建页面,存储在数据库中。
SaaS页面构建器在内容平台中添加一个视觉图层,但不替换它。编辑器生成的HTML,而CMS已经知道如何存储和渲染。
无头CMS编辑器电子邮件HTML本身就是一门学科——表格、内联样式、客户端特性。GrapesJS通过MJML和通讯预设来处理,而不是网页路径。
React 邮件构建器将编辑器部署在现有的仪表盘中,置于你自己的认证和导航之后,不重定向到第三方网站。
可嵌入页面构建器不同团队因为不同的理由来到这里,但要求是一样的:要可视化编辑,又不想因此失去对标记的控制权。
在已有应用中添加视觉编辑功能,无需采用平台或围绕他人运行时重写前端。
将页面创建变成客户付费的功能,编辑器存在于你的域名上,数据则保留在你的数据库中。
给内容团队视觉编辑,但不替换下面的CMS,因为输出出来的其实是系统已经处理的HTML。
用自己的模块和组件构建一个页面编辑系统,然后在客户项目间重复使用,而不是每次项目都重建。
让用户以可视化方式撰写着陆页,同时你的平台保持模板、追踪和发布流程的一致性。
你不必让用户去其他网站编辑页面。将编辑器安装在你自己的应用中,保留现有的认证、导航和后端。
编辑的位置
实际上,这是你应用中的一条路由,渲染一个容器并初始化编辑器。用户永远不会离开你的域,会话是他们已有的,项目通过你编写的端点加载和保存。
将Storage Manager指向你的API,每个页面都会成为数据库中的一行,置于你自己的认证之后。GrapesJS不托管任何东西,GJS.Market也不会——用户内容永远不会送到我们那里。
两样东西要存放,不是一样
const editor = grapesjs.init({
container: '#editor',
// Editor state goes to your API, behind your own authentication.
storageManager: {
type: 'remote',
autosave: true,
options: {
remote: {
urlStore: `/api/pages/${pageId}`,
urlLoad: `/api/pages/${pageId}`,
fetchOptions: { credentials: 'include' },
},
},
},
});保持区分清晰。编辑器状态是编辑者重新打开页面以便进一步编辑所需的状态。发布的输出是访客收到的HTML和CSS。它们有不同的生命周期、不同的访问规则,通常还有不同的表格——插件可以帮忙处理布线,但架构完全由你决定。
编辑
用户在画布上工作。目前还没有公开内容;编辑器只触碰项目状态。
保存草稿
自动保存或显式保存会通过你的存储端点,按照你的权限规则写入状态。
预览
在预览路径上渲染当前的HTML和CSS,让作者看到的是真实页面,而不是画布。
批准
如果你的产品需要审核,这就是你的工作流程——编辑对谁签字没有意见。
发布
取出 getHtml() 和 getCss() 的结果,做安全过滤,套进你自己的布局,为结果保存版本,然后写到你真正对外提供页面的地方。
实时 HTML
发布页面在你的基础设施上是纯HTML和CSS。访客查看不需要编辑运行时间。
这是与托管页面构建器最明显的区别。没有供应商决定你的页面何时上线、服务于哪个域名,或者如果你停止付费会怎样。
Device Manager 在宽度之间切换画布,设备激活时设置的样式会以该宽度为范围的媒体查询,而不会覆盖基础规则。GrapesJS 包含桌面、平板、移动横向和移动竖屏;列表及其宽度是配置,而非固定集。
用户在每个断点可以更改的内容
显示的宽度是 GrapesJS 默认设置。值得直说的是:编辑器定义了 CSS 规则——发布页面最终如何渲染仍然取决于你发布的标记和样式表以及浏览器读取它们。
以下内容都是GJS.Market上的真实列表,目录中实时显示了名称、价格和缩略图。按照本页对问题的思考方式进行分组:先代码和输出,然后是周围的面板。
三种起始配置,仅从实际存在的商品中组装而成。把它们当作需要适应的形状,而不是购买的捆绑包。
对于只需要一个简单可视化编辑器的开发者来说,仅此而已
请参阅所见即所得指南对于多页网站,背后有真正的设计系统
请参见登陆页指南在自家产品内面向客户进行编辑
价格会实时从目录中显示。
这不是四个产品争夺同一任务——而是四个不同的行业。表格的目的是明确交易,而不是宣布赢家。
| 考量 | GrapesJS | 拖放库 | 托管页面构建器 | 从零开始构建 |
|---|---|---|---|---|
| 包含可视化编辑器 | 是的 | 部分——仅手势 | 是的 | 无论你建造什么 |
| 对HTML和CSS的控制 | 高——输出由你自己处理 | 高——你写了加价 | 具体情况因供应商而异 | 总计 |
| 自托管 | 是的 | 是的 | 通常不会 | 是的 |
| 可以嵌入到你的应用里 | 是的 | 是的 | 这取决于供应商 | 是的 |
| 组件模型与特征 | 内置 | 你写 | 供应商模型 | 你写 |
| 样式控制和断点 | 内置 | 你写 | 内置 | 你写 |
| 成为工作编辑的时间 | 日子 | 月份 | 分钟 | 从几个月到几年 |
| 产品定制 | 高 | 高 | 受供应商限制 | 无界 |
| 持续维护 | 你的集成,加上一个上游核心 | 所有编辑 | 供应商 | 所有的一切,永远 |
| 许可与费用 | BSD-3-Clause 核心,$0 用于 | 通常比较宽容 | 订阅 | 工程时间 |
已对照 GrapesJS 核心(BSD-3-Clause,v0.23.6)于 2026-09-03 核实。托管建站工具那几行刻意写得笼统,因为各家厂商的能力差别很大而且经常变化——请去核实你正在考虑的那个具体产品,而不是相信一句类别层面的结论。
这是该领域最昂贵的判断失误。一个团队选择一个可排序列表的库,一周内发布演示版,然后花一年时间发现缺失了什么。
所有东西都需要用来把一个盒子从一个地方移动到另一个地方,除此之外没有其他东西。确实有用——用来重新排序列表。
在所有这些手势中都存在的状态,以及一个能够将所有标记重新映射回浏览器渲染的序列化器。
拖放是一种操作。页面构建器是一个完整的编辑系统。
一个包,一个容器,一个初始调用。本页的所有内容都是从这几行开始的。
npm install grapesjsimport grapesjs from 'grapesjs';
import 'grapesjs/dist/css/grapes.min.css';
// Mount the editor on any container in your own application.
const editor = grapesjs.init({
container: '#editor',
height: '100vh',
// Core ships no blocks: you decide what users are allowed to drag.
blockManager: { blocks: [] },
});编辑器现在运行,但调色板是空的——核心故意不交付任何块。注册第一个块,以及它变成的组件类型:
// A block is what the user drags out of the panel.
editor.BlockManager.add('hero', {
label: 'Hero',
category: 'Sections',
content: { type: 'hero' },
});
// A component type is what that block becomes on the canvas — and the
// only place you decide what the user may change about it.
editor.DomComponents.addType('hero', {
model: {
defaults: {
tagName: 'section',
attributes: { class: 'hero' },
components: '<h1 class="hero__title">Build faster</h1>',
// Traits become the fields in the settings panel.
traits: [{ type: 'text', name: 'headline', label: 'Headline' }],
droppable: false,
},
},
});再往后就是产品层面的工作了:你的用户能拿到哪些区块、允许他们改动什么,以及你的后端拿到输出的标记之后要做什么。
本页涵盖HTML级别的编辑与输出。邻近的指南从其他角度取材于同一核心。
从GrapesJS开始,为用户提供可视化的HTML编辑体验,并保持对应用、数据和发布工作流程的控制。
一个npm包和一个初始调用。你喝完咖啡前就有一个可用的画布。
试试GrapesJS块调色板、代码视图、样式控制、存储适配器和导出工具——真实的列表,真实的价格。
浏览GJS.Market插件组件、块、样式、存储和插件API,直接来自上游项目。
阅读建造指南拖拽。放置。编辑 HTML。掌控输出。