对于SaaS构建器来说
编辑器 + 页面 + 存储 + 模板
SaaS 架构指南让用户可视化地构建页面,而开发团队则控制编辑器、组件、设计系统、数据、权限和发布流程。你自己构建产品。GrapesJS 是其中的编辑引擎。
图层
主页 — 草稿
设置
这就是GrapesJS本身,在你浏览器启动的页面上——不是截图,也不是视频。拖入一个块,选择一个元素,重新设计它。画布上的所有内容都是普通的HTML和CSS,这正是你的用户会生成的。
你不是在安装页面构建器。你是在给你已经拥有的产品添加无代码编辑功能——包括你的用户、权限、数据和发布。可视化编辑器是其中一层,也是你不必写的那一层。
链条,端对端
引擎上下的每一层都是你的产品。这就是你的差异化所在——也是你工程时间应该投入的地方。
在写代码之前,最有用的一点是:哪个子系统属于你的应用,哪个子系统随编辑器附带,哪个可以现成购买。任何需要服务器的都放在左边。
GrapesJS 下没有列出任何需要服务器的内容。编辑器运行在浏览器中;它不知道谁登录了。
视觉编辑器看起来像是拖拽演示,直到你发布它。这些子系统最终成为必需,大致按照用户手势通过的顺序排列——每个子系统都必须持续工作,而其他系统则不断变化。
这些都不是你的产品。围绕现有编辑器引擎构建产品,与构建编辑器引擎本身是完全不同的项目——前者发布功能,后者则承诺团队永远维护编辑器。
GrapesJS 是一个开源的可视化编辑器框架,你可以自行托管并嵌入。它为你提供了编辑层——画布、组件、样式、面板、命令——作为你配置、扩展或替换的文档模块。下面的每个模块都链接到自己的文档,这样你可以在提交前检查每个声明。
版本 0.23.6,授权为 BSD-3-Clause;官方的 React 封装 @grapesjs/react 是 MIT。两者都允许商业使用。GrapesJS 不提供的内容同样重要:无后端、无用户、无权限、无发布流水线——详见上文责任边界。
专业的无代码构建者从不会向每个用户展示整个编辑器。这就是玩具和产品功能的区别。你的团队决定——每个角色、每个模板、每个组件——某个人能访问多少编辑器内容。
十个永远属于你的决定
const editor = grapesjs.init({
container: '#editor',
// 1. The user only ever sees blocks you registered.
blockManager: { blocks: approvedBlocks(user.role) },
// 2. The Style Manager only offers properties you allow.
styleManager: { sectors: allowedSectors(user.role) },
// 3. Devices are your breakpoints, not arbitrary widths.
deviceManager: { devices: BRAND_BREAKPOINTS },
});
// 4. Lock the chrome: a marketer never edits the header or the footer.
editor.on('component:add', (component) => {
if (LOCKED_TYPES.includes(component.get('type'))) {
component.set({
editable: false,
draggable: false,
removable: false,
copyable: false,
});
}
});
// 5. Hide panels this role has no business seeing.
if (!user.can('edit_code')) {
editor.Panels.removeButton('options', 'export-template');
}
// Every line above is a RENDERING decision. The server still checks
// user.can('publish') before it accepts the payload.以上所有操作都是渲染决策。隐藏面板不等于许可——有决心的用户仍可从控制台调用编辑器的API。后端必须重新检查相同规则,才能接受保存或发布。详见下方角色部分。
你不需要三个编辑者来服务三种类型的用户。一个由登录用户角色配置的GrapesJS实例,会产生三种真正不同的产品。下面的每一列列出它为前一列添加了什么。
对于那些从未打开过设计工具,也不该打开的人。
它添加了战役拥有者需要发布的所有内容,无需开发者。
增加了内部设计师或代理运营者期望的控制功能。
配置是数据,不是代码。这意味着你的Starter计划和企业计划之间的差别可能只是表中的一行。
让可视化编辑器安全最快的方法就是不给它任何不安全的选项。把你的令牌输入Style Manager,把组件输入Block Manager,“非品牌”就不再是评测问题——它变得无法触及。
颜色
类型与比例
间距
编辑器中可用
无法使用
用户创造真实内容,却无法打破品牌一致性——你的设计团队也停止逐页审核。如果你已经发布组件库,这些组件就成了模块。
空白画布不是自由,而是空白凝视。非技术用户能否成功完成你的构建器,最大的因素是他们首先看到的是一个已经像你产品外观的精心精选版块集合。
标题、副标题、一个行动号召。
两到四列特征网格。
套餐卡连接到你自己的套餐数据。
引用、署名、可选标志。
问答配对。
一条消息,一个按钮。
表单字段会发布到你的终端。
通常锁着,但始终存在。
块回答“我能添加什么”。模板回答“我从哪里开始”。发布一个小而有主见的集合——用户真正创建的页面类型,而不是画廊。
值得发送的模板类型
模板是带有标志的普通保存项目。存储它们是你的应用程序的工作,也就是说版本管理也一样。
最好的无代码体验不会强迫用户从零开始设计所有东西。
进入你的数据库,在你的端点上,在你的模式下。GrapesJS的Storage Manager是一个HTTP客户端,带有加载URL和存储URL——它不是托管服务,GJS.Market也不保存客户的页面。
保存时实际发生了什么
grapesjs.init({
container: '#editor',
storageManager: {
type: 'remote',
autosave: true,
autosaveIntervalMs: 10_000, // debounce: one write, not one per keystroke
stepsBeforeSave: 20,
options: {
remote: {
urlLoad: `/api/pages/${pageId}`,
urlStore: `/api/pages/${pageId}`,
headers: { Authorization: `Bearer ${token}` },
},
},
},
});
// The editor sends you project JSON. What that JSON is allowed to
// become — a draft, a revision, a published page — is your API's call.GrapesJS 提供编辑层。你的应用程序控制项目的存储和发布方式——这也是为什么草稿、修订和回滚是你设计的原因。自动保存应该用于去退票;按键保存则是对你自己 API 的拒绝服务攻击。
两种产物,两种用途
编辑器需要组件树、样式和资源来完全原来打开页面。经过版本化、可调式,从未对访客开放。这就是修订。
'editor.getHtml()' 和'editor.getCss()' 生成的是一个静态页面,你要净化、存储并提供。访客绝不应该加载编辑器运行时。
编辑和发布是不同的操作,风险也不同,生产无代码产品将它们区分开来。下面的两个封闭阶段才是授权检查的所在——而不是在编辑器里,而是在你的API里。
一个没有实时URL的项目行。
项目JSON自动保存,每次会谈修改一次。
输出输出为签名的临时URL。
审稿人看到的是预览,而不是编辑。
州会更改你的API授权和记录。
写到你的生产现场的净化输出。
此处已确认授权
权限、批准和发布逻辑属于应用程序及其后端。GrapesJS 没有草稿、批准或实时 URL 的概念——这些状态都存在于你的数据库中,回滚只是发布一个早期版本。
大多数构建器产品由四个角色组成。每个编辑器都非常不同,因为每个编辑器加载的配置都不同——但它们都在同一个地方执行:你的后端。
配置编辑器、模板和角色
编辑版面与样式
预览并批准;无法编辑
编辑文本和图片;无法更改布局
一次许可决定如何传递
应用级认证和授权由你的后端负责。编辑器是这条链条中的最后一站,而不是第一站:它会处理服务器已经做出的决策后果,而当存档到来时,服务器必须再次做出同样的决定。
同一个架构——你的产品、用户、编辑引擎、你的API——承载了七个截然不同的产品。每张卡片都链接到涵盖该产品的指南。
这个表格故意狭窄:它只比较编辑引擎。责任边界上标记为“你的应用”的所有内容无论如何都是你的作品——这正是重点。
| 能力 | 从零开始构建 | GrapesJS |
|---|---|---|
| 视觉画布 | 建造 | 可得 |
| 组件 | 建造 | 可得 |
| 拖拽 | 建造 | 可得 |
| 区块 | 建造 | 可扩展性 |
| 样式 | 建造 | 可得 |
| 图层 | 建造 | 可得 |
| 命令 | 建造 | 可得 |
| 存储集成 | 建造 | 可配置 |
| 自定义组件 | 建造 | 支持 |
| 插件架构 | 建造 | 支持 |
| 产品特定用户体验 | 建造 | 可定制 |
功能与GrapesJS 0.23.6文档核对;目录列表和价格均验证了2026-09-03。
如果你真正的产品是围绕编辑器的应用,那就别自己做编辑器引擎。
这些是GJS.Market目录中的真实列表,按你正在做的工作分组,而不是按目录本身的分类法。价格来自实时目录,所以你看到的就是产品今天的价格。
你需要的两个东西是故意缺失的,因为目录里没有:角色和权限插件,以及审批工作流程插件。这两者本来就属于你的应用——请参见上方的角色和发布部分,或者带到我们的实施团队那里。
三种组合能快速让用户面前看到一个可用的建筑工具。每个都是起点,不是材料清单——用适合你后端的行替换任意一行。
价格在构建时从实时目录中读取。免费插件是开源且自托管的,就像核心插件一样。
白标并不是隐藏标志。它让编辑器阅读时,是作为你应用的一个功能,而不是第三方工具嵌入其中。
你的颜色、字体和图标在整个编辑器中都是镀铬的。
围绕用户的实际任务重建工具栏。
你的设计系统组件,按照团队的命名方式命名。
如果你的用户说“module”,编辑器就不应该说“component”。
移除操作是最被低估的自定义方式。
默认状态、空状态和与产品其他部分匹配的入职程序。
移除GrapesJS品牌标识非常简单,并且符合BSD-3-Clause许可协议的许可。让编辑器感觉你的产品像是一个设计项目——面板、术语、默认值以及用户看不到的所有内容。
GrapesJS 渲染成一个普通的 DOM 元素,所以整合主要取决于哪个生命周期钩子调用“grapesjs.init()”以及何时清理。具体细节要选你的框架。
挂载时初始化,卸载时销毁的效果。如果你想用编辑器自有的UI作为React组件,官方的@grapesjs/react包装器(MIT)是可以选择的。
参见React集成一个组合调用 init 来自 'onMounted',从 'onBeforeUnmount' 调用 destroy。没有官方的 Vue 封装器——你直接调用同一个 API。
参见Vue集成一个使用 'ngAfterViewInit' 和 'ngOnDestroy' 的组件,编辑器被排除在 Angular 的变更检测之外。没有官方的 Angular 封装器。
参见Angular集成仅限客户端:编辑器在模块作用域点击“窗口”,所以通过关闭 SSR 的动态导入加载。
参见Next.js集成你的框架驱动应用。GrapesJS 驱动视觉编辑层。
“编辑器有效”和“我们可以把客户放进去”之间的差距大致是这个列表。每个小组都链接回争论该条款的部分。
用户能触及什么,不能访问什么。
寄存器块是按角色进行的,而不是全局一次。
用户可以信任的坚持,付出一天的工作。
去掉音了 autosave,不是每次按键写入一次。
编辑器生成的所有内容都来自用户。
离开时在服务器上净化。
领养和支持队列的区别。
模板每次都比空白画布强。
编辑和发布的风险不同。
Rollback正在发布更早的修订版本。
编辑器现在是你产品运行时间的一部分。
日志编辑器错误,附带项目ID。
无代码构建器,本质上是一种允许用户在你的产品中添加任意内容的功能。把它产生的一切都当作不可信的输入,因为它确实如此。
Run通过服务器上的经过审核的净化剂生产HTML和CSS,然后才被存储或供应。
检查服务器端的类型、尺寸和尺寸,并从独立来源提供用户媒体。
无论编辑显示了什么,所有保存、批准和发布都会重新授权服务器上。
隐藏面板是UI状态。编辑器的API仍可从浏览器控制台访问。
Project JSON 也是用户输入。在反馈给渲染器之前,先验证它的形状。
如果你允许自定义代码组件,请明确决定它运行在哪里以及谁可以添加。
限制利率,按项目范围,记录每通电话。
GrapesJS 是一个编辑库,不是安全边界。它不保证所生成标记的安全性,也不能保证:标记来自你的用户。净化、验证和授权是你的应用程序的责任。
编辑器是一个庞大的客户端应用,存在于你的产品内部。大多数成功来自于不加载它——而且不重复加载。
用户打开编辑器时启动,而不是路由加载时。
动态导入插件是当前岗位能用的。
每个注册插件都花费捆绑包大小和启动时间,耗费非常久。
数百个区块会减缓区块面板,使使用者瘫痪。
上传时调整大小并重新编码——用户将8MB的照片放入hero。
每隔几秒写一次,而不是每次按键写一次。
内联的 base64 图像将项目行变成兆字节。存储参考,不是数据。
已发布页面绝不能携带编辑器。访客加载HTML和CSS;只有作者加载引擎。
页面构建器中的人工智能最有用且风险最小,是当它被视为同一编辑者的唯一用户——一个只能产出同职人类本可以产出的编辑者。
用你注册的块构建一个截面,而不是用自由标记。
填充现有布局的文本节点,保持结构不动。
提出一个已批准的组件的排列,以实现明确的目标。
根据长度、语气或地点进行重写。
起草一个新的组件定义供开发者审阅——永远不要自动注册。
根据可衡量的标准提出修改建议,并让人工审核。
人工智能应与人类用户在相同的组件和设计系统约束下工作。如果生成器能发出你的块区块面板永远无法提供的任意HTML,那你就重新打开了所有你关闭的漏洞。
上述功能描述的是你可以在编辑器自身的APIs上构建的模式,而不是自带的GJS.Market功能。目录确实有一个AI书架——缩略图生成,GPT支持的辅助工具——并且链接在上方。
实现
大多数团队不会被“grapesjs.init()”困住。他们卡在本页标注属于他们的部分——权限、发布、存储,以及让编辑感觉像是他们产品。这就是我们团队的工作。
让用户在不放弃对产品控制的前提下,自由地进行视觉构建。
告诉我们你正在构建什么,并为你的产品编辑器制定一个明确的规划。
开始用GrapesJS构建模块、存储适配器、编辑器界面和组件——带有当前价格的真实产品。
探索GJS.Market插件集成、自定义组件、权限和发布工作流,与你的团队一起构建。
咨询专家你的产品。你的用户。你的规则。你的编辑。