启动春季战役
点击此文字并输入。
区块
图层
样式
从空白画布或模板开始,将部分拖入原位,自定义样式和内容,并通过您自己的应用程序发布。将一个块拖入下方画布——或先点击一个块,再点击画布——即可查看用户将要做的手势。
区块
拖动一个部分——或者点击一个部分,然后点击画布。
点击此文字并输入。
简短、可扫描、以利益为先。
三级,推荐一级。
样式
强调色
GrapesJS 的原版演示:块色板、画布、样式管理器和图层树。这里看到的所有内容都包含开源核心。
在iframe中加载第三方演示。点击之前不会请求任何内容。
落地页构建器看起来像一个功能,但行为却像十几个功能。在营销人员能够将hero部分拖入原位之前,必须有人先构建画布、组件模型、拖拽系统、样式管理器、响应式编辑、撤销、资产处理和序列化格式——并且保持所有功能正常运行。
先设计编辑器架构,再发布产品。
你实现并维护
这些都是有自己边缘情况的子系统,没有一个是你客户付费的。
按照原有的编辑引擎进行定制。
已经进入开源核心
你自己配置面板,注册自己的部分,然后把工程预算花在产品上。
请看快速入门添加针对营销的具体内容,但不写出来。
安装而非构建
安装、配置、定制、发货——并保留团队代码,保留别人无法为你制作的部分。
浏览插件GrapesJS 为你提供了视觉编辑的基础,让你的团队能够专注于围绕它的产品。
十九个子系统,按最终拥有者标签。重点不是列表很长——而是只有最后四个是专门针对你的业务。
GrapesJS 负责编辑引擎。插件覆盖落地页专属表面。最后一栏的一切都是你的产品与其他平台不同的地方。
落地页构建器是一种可视化编辑器,允许用户创建活动页面,而无需手写每个HTML元素和CSS规则。
它不仅仅是一个功能。落地页构建器是一个编辑器、块、模板、表单、SEO、分析、实验和发布——而每个都是关于谁拥有什么的决定。
实际上,现代落地页构建器应具备以下所有功能:
球队对一个的期待
用户直接操作渲染后的页面。拖放落地页面构建器将布局变成一个手势,而非合并请求。
营销人员是按 Hero、定价表和 FAQ 来思考的。围绕区块构建的落地页编辑器,正好匹配营销活动的实际规划方式。
输出是你控制的标记,可以渲染到任何地方——而不是锁定在托管运行时的专有格式。
GrapesJS 提供可视化编辑层。你的应用程序控制后端、数据、认证和发布工作流程。
同一个视觉编辑引擎承载着截然不同的产品。改变的是围绕它的应用——谁登录、允许他们做什么,以及页面最终会去到哪里。
快速上线产品和活动页面,无需每次标题更改就收到工程工单。
拖拽机制让客户直接在你的SaaS内创建页面,使用自己的账户和品牌。
组装SaaS建构机创建一个可重复使用的编辑系统,并将其应用于多个客户项目。
白标构建器提供一个完全品牌化的页面创建体验,屏幕上没有任何GrapesJS的标识。
白标方法在已有的内容模型基础上,为内容团队提供可视化编辑。
无头CMS编辑让市场团队在你自己的工具中创建页面,无需工程支持。
开源方法先发货并迭代战役页面,但不先建成完整的CMS。
HTML 输出将可视化页面创建直接嵌入到客户已经使用的另一个应用中。
嵌入式构建器你的应用程序
项目数据
GrapesJS
从创作到活跃页面
GrapesJS 拥有编辑界面。你的应用拥有身份、数据和交付。保持这条线路干净,是构建者可替换、可测试且属于你的原因。
这些是 GrapesJS 开箱即用的编辑功能,也是其插件 API 设计时所设计的扩展功能。
可视化构建布局。组件被投放、重新排序并嵌套在画布上。
只需注册一次自己的部分和组件;每个用户拖动同一个库。
在编辑器中切换设备,并根据断点写规则。默认设备集有桌面、平板、移动横向和移动竖屏。
定义组件类型,并赋予它们自己的traits和行为,这样编辑器就能与你的产品设计系统匹配。
通过资产管理器管理图片和其他媒体,并以你已经使用的存储为后盾。
通过分区控制,你可以配置控制字体、间距、颜色和布局。
通过目录中的模板插件,从可重复使用的布局开始活动,而不是空白画布。
getHtml() 和 getCss() 会返回画布渲染的标记,所以发布的输出可以留给你进行优化。
选择模板
打开保存的布局,而不是空白页面。最快的战役是开始时完成70%的。
添加分段
将hero、功能、定价、推荐和FAQ块拖入活动所需的顺序。
自定义内容
在画布上编辑复制品,通过资产管理器交换图片,设置链接。
调整响应式样式
切换设备,并在别人看到之前,按断点修正布局。
添加表单
输入捕获表单,指向你自己的端点。
预览
通过预览路径从项目数据渲染页面——即服务于实时页面的同一渲染器。
发布
编写HTML、CSS和SEO记录,分配slug,并从你自己的基础设施中提供。
创建一次。在不同活动中重复使用。
GrapesJS 核心零块。这不是遗漏——而是扩展点。你注册的块库正是将通用可视化编辑器变成专门设计的落地页构建器的关键,也是你能编写的最高杠杆代码。
标题、副标题和主要行动号召。
两到四个带图标的福利栏。
客户或整合标志作为社会认同。
转换点附近的引言、姓名和头像。
分层计划,推荐一栏。
用特征表对比访客正在权衡的选项。
用访客自己的话说,是处理异议。
线索捕获界面,提交到你自己的 API。
单一栏订阅,供尚未准备好的访客使用。
页面底部反复出现的问题。
导航、法律和信任信号。
安装核心,安装,并注册使其成为落地页构建器的部分。本页的其他内容都是叠加在这些线条上的决策。
安装
npm install grapesjsimport grapesjs from 'grapesjs';
import 'grapesjs/dist/css/grapes.min.css';
const editor = grapesjs.init({
container: '#editor',
height: '100vh',
// The core ships no blocks at all — the section library below is what
// turns a generic visual editor into a *landing page* builder.
blockManager: { appendTo: '#blocks' },
storageManager: false,
});
const SECTIONS = [
{ id: 'hero', label: 'Hero', html: '<section class="hero">…</section>' },
{ id: 'features', label: 'Features', html: '<section class="features">…</section>' },
{ id: 'logos', label: 'Logo cloud', html: '<section class="logos">…</section>' },
{ id: 'pricing', label: 'Pricing', html: '<section class="pricing">…</section>' },
{ id: 'faq', label: 'FAQ', html: '<section class="faq">…</section>' },
{ id: 'cta', label: 'Call to action', html: '<section class="cta">…</section>' },
];
SECTIONS.forEach(({ id, label, html }) => {
editor.Blocks.add(id, { label, category: 'Landing page', content: html });
});每个模块是一个标签、一个类别和一个标记块。给标记一个组件类型,它也会得到 traits、约束和自己的工具栏。
模板是用户打开的已保存项目,而不是空白画布。下面的分类是市场团队要求的布局类型——下面的插件是让用户能够保存、管理和重新打开这些模板的。
团队要求的布局类型
这些是布局类型,不是目录列表:GJS.Market 没有模板产品类型。下面的模板和页面管理器是真正的插件,给你的构建者提供一个存放它们的地方。
没有捕获入口的落地页只是一份宣传册。表单组件是编辑器的职责;提交按钮之后的一切都归你。
提交路径
把每一次提交都路由到你自己的接口。校验、限流、反垃圾、用户同意和 CRM 分发都应该发生在那里——而这些都不该由页面编辑器来决定。
// The form component is editor-side. The submission is yours.
// Never let the published page post straight to a third party you do not
// control — route it through your own endpoint so you keep the lead.
app.post('/api/leads', async (req, res) => {
const parsed = leadSchema.safeParse(req.body); // validate server-side
if (!parsed.success) return res.status(422).json({ error: 'invalid' });
await rateLimit(req.ip); // forms get abused
const lead = await db.leads.create({
data: { ...parsed.data, pageSlug: req.body.pageSlug, utm: pickUtm(req.body) },
});
await crm.upsertContact(lead); // your CRM, your rules
res.json({ ok: true });
});姓名、工作邮箱、消息。B2B活动页面上的默认销售路径。
单一田地,低摩擦,适合感兴趣但尚未准备好的访客。
直接进入产品,活动参数得以延续。
公司规模、职务、预算——销售在第一次通话前需要的字段。
营销人员无法在没有开发者的情况下命名、描述或规范化的活动页面,是未完成的。GrapesJS 编辑文档正文;标题属于你的应用程序——因此 SEO 记录必须从一开始就成为页面模型的一部分。
页面SEO
<title>meta[name=description]link[rel=canonical]meta[property^=og:]og:imagemeta[name=robots]application/ld+json它存储在项目数据旁边,在同一界面编辑,发布时由渲染器输出。
把SEO元数据当作页面记录中的一流字段,而不是上线后附加的。营销人员应该能够在不打开拉取请求的情况下更改标题。
// SEO belongs to your application, not to the canvas.
// Keep the marketing metadata beside the project data, so a marketer can
// edit it in the same screen and your renderer can emit it on publish.
type LandingPage = {
slug: string;
project: unknown; // editor.getProjectData()
seo: {
title: string;
description: string;
canonical?: string;
ogImage?: string;
robots?: 'index,follow' | 'noindex,nofollow';
jsonLd?: Record<string, unknown>;
};
};
// On publish, your renderer — not GrapesJS — writes the <head>.
function renderHead(page: LandingPage) {
return [
`<title>${escapeHtml(page.seo.title)}</title>`,
`<meta name="description" content="${escapeHtml(page.seo.description)}">`,
page.seo.canonical && `<link rel="canonical" href="${page.seo.canonical}">`,
page.seo.robots && `<meta name="robots" content="${page.seo.robots}">`,
].filter(Boolean).join('\n');
}当团队可以迭代活动而不是把页面当作静态资产时,落地页构建器的价值就大大提升了。一旦页面变成数据而非文件,变体就很便宜:它就是指向同一根的另一行项目。
构建
在编辑器里复制页面,改一件事——标题、报价、表格长度。
发布
两种变体都发布到同一个蛞蝓,权重由你的应用决定。
度量
只分配一次访客,持续执行该任务,并与转化事件一起报告。
改进
将获胜者提升为默认状态,并从中开始下一次测试。
赋值、权重和显著性是应用逻辑。GrapesJS 不再涉及两个变体的创建点——这正是它能避免进入服务路径的原因。
GJS.Market 目录中没有 A/B 测试插件,GrapesJS 也没有实验功能。这是应用中需要实现的模式,不是安装的产品——而页面构建器正是它成本低廉的关键。
// A/B testing is an application concern, not an editor feature.
// A landing page builder makes it cheap because a variant is just
// another project row pointing at the same slug.
const variants = await db.pageVariants.findMany({
where: { slug, status: 'running' },
});
// Assign once, persist the choice, and report it to your analytics.
const variant = pickWeighted(variants, hash(visitorId));
res.setHeader('Set-Cookie', `exp_${slug}=${variant.id}; Path=/; Max-Age=2592000`);
res.setHeader('Vary', 'Cookie'); // or the page will be cached for everyone
return renderPublishedPage(variant);你不需要在页面构建器内构建分析平台。你需要发布的页面来发布你现有栈已经理解的事件。
专注于重要的互动——表单提交、CTA点击、长页的滚动深度。
将投稿与页面、变体以及产生该页面的活动联系起来。
基线每隔一个数字的比值为 。
从首次点击到CRM记录时,保留UTM值。
直接发货,使用团队已有的集装箱或标签,而不是发明报表层。
使用您自己的分析基础设施。建设者的职责是确保每个发布页面都带有正确的标签和参数,而营销人员无需记住它们。
编辑器生成两个功能:项目数据,你重新打开,以及你提供 HTML 加 CSS。两者都是你的,格式可读。
编辑引擎。自托管,BSD-3-Clause授权,路径中没有托管服务。
你的页面存储的JSON。可读、可变,并且是你自己的,可以迁移。
getHtml() 和 getCss() 返回的正是画布渲染的精确标记。
认证、版本控制、权限和发布端点。那就是真正属于你产品的部分。
发布页面的服务来源,取决于你自己的性能和缓存标准。
保持对项目数据、HTML/CSS 和发布基础设施的控制。自托管并不保证迁移是免费的——你仍然拥有自己编写的集成——但这意味着你构建的任何东西都不会被别人导出。
同样的十四项能力,读了两次。左边每一行都是一个项目。右边大多数是配置——另外三个不是配置的,也被认真标注。
| 能力 | 从零开始 | GrapesJS |
|---|---|---|
| 画布 | 自行开发 | 已内置 |
| 拖拽 | 自行开发 | 已内置 |
| 组成部分 | 自行开发 | 已内置 |
| 区块 | 自行开发 | 可扩展 |
| 造型 | 自行开发 | 已内置 |
| 响应式剪辑 | 自行开发 | 已内置 |
| 资产 | 自行开发 | 可扩展 |
| 存储 | 自行开发 | 可扩展 |
| 模板 | 自行开发 | 可扩展 |
| 插件架构 | 自行开发 | 已内置 |
| 形式 | 自行开发 | 可扩展 |
| SEO控制 | 自行开发 | 与你的栈集成 |
| A/B 测试 | 自行开发 | 与你的栈集成 |
| 发布 | 自行开发 | 与你的栈集成 |
已通过GrapesJS文档和2026-09-03上的GJS.Market目录进行验证。“可扩展”表示存在API及其现有插件;“集成”表示编辑器故意不这样做,而你的应用程序应该这样做。
编辑器引擎使用GrapesJS。所有与你业务相关的内容都用你自己的应用。
GJS.Market 目录中的真实列表,按落地页构建器所组成的四个能力区域进行分组。价格和可用性在构建时从目录中读取。
这是一个起始模块,用来构建你的落地页部分库。
预制的 Tailwind 区块——Hero、功能、定价——适合已经在用 Tailwind 的团队。
一个可配置的标题部分,每个活动页面开头都会有块。
一个可配置的页脚部分,包含导航、法律和信任信号。
给你的构建者一个保存、列出和重新打开战役模板的地方。
多页面项目,适用于需要多个URL的活动。
三份购物清单,按你正在制作的内容而非目录类别来框架。
对于一个发布自己页面的营销团队来说
拖拽机制对于产品团队来说,作为功能,发布页面构建
对于一个跨账户重复使用同一系统的机构
价格是在组装时从目录中读取的,可能已经更改——产品页面具有权威性。
GrapesJS 提供可视化编辑的基础。GJS.Market 插件允许你添加专门功能,而无需自己构建所有功能。
每一项能力都成为一张工单、一份审查和维护承诺。
四个步骤,每个能力重复,基于你未编写的引擎。
把页面构建器放进产品里,大多数情况下并不是编辑器的问题。编辑器只是一条路径;其余部分是围绕它的多租户机制。
编辑器的位置
谁能打开编辑器,打开时看到谁的页面。
页面所属的单元。通常是你开账单的那个单元。
编辑、发布和删除是三种不同的权利。发布权才是值得守护的权利。
页面数、席位数或发布量——编辑器完全不需要知道其中任何一项。
你的Chrome、你的字体、你的图标。编辑器UI是配置,不是固定界面。
你的基础设施提供支持的 slug、自定义域名、版本和回滚。
编辑器是你产品中的一个界面。租户、权限和计费是让它成为一个可以销售的功能的关键。
代理机构的问题不是构建一页的构建器。也不是为第十一位客户重建同样的东西。
或者是客户的。编辑器、Chrome、图标和排版都是你根据租户设置的。
一个部分库,维护过一次,部署到每个账户。
将独立项目集中在一个安装下,使用每个客户端的资源和模板。
用上一个客户有效的布局启动新客户。
让客户编辑文案,但不允许他们重构页面或未经审核发布。
部署到客户的域名和托管平台,而机构不会成为托管公司。
创建一个编辑系统,并在多个客户项目中重复使用。这些模块和模板成为代理机构的资产;客户只看到自己的品牌。
GrapesJS 核心以 BSD-3-Clause 许可证发布,官方 React 封装以 MIT 发布。两者均允许商业使用。实际影响:
编辑器运行在你的应用程序内部。你和用户之间没有托管的编辑器服务。
面板、命令和组件类型都可以替换,而不仅仅是主题化。
项目数据存储在你的数据库中,格式可阅读并迁移。
构建用户需要的编辑器界面,而不是供应商发布的那个。
你的CRM、资产存储、部署目标——都通过API插件有线连接。
有文档化的插件架构和现有的目录可供参考。
你构建的任何东西都依赖于托管编辑器是否继续按照当前条件存在。
页面构建器有两种截然不同的性能预算,混淆它们是该架构中最常见的错误。
动态导入,这样它就不会落在共享捆绑包里。
一个编辑器实例在创作路径上安装在客户端。
编辑器拥有自己的DOM。每次按键重新渲染包装器都会与它抗衡。
用分页和懒人加载资产管理器,而不是列出所有上传。
当需要插件的面板打开时加载插件,而不是在编辑器初始化时加载。
两个入口点,两个预算。发布页面根本不应该导入编辑器。
输出端有图片、字体和关键的CSS,像其他制作页面一样调校。
// The editor is an authoring environment. Keep it out of the bundle
// that a visitor downloads to read a published landing page.
// /admin/editor — loaded only for authenticated authors.
const PageBuilder = dynamic(() => import('@/components/page-builder'), {
ssr: false, // GrapesJS measures the DOM on init
loading: () => <EditorSkeleton />,
});
// Heavy, optional plugins load when the panel that needs them opens.
async function openAssetManager(editor) {
const { default: cloudinary } = await import('grapesjs-cloudinary');
cloudinary(editor, { cloudName: process.env.NEXT_PUBLIC_CLOUDINARY });
editor.runCommand('open-assets');
}编辑器是一个创作环境。已发布的落地页不一定需要完整的编辑器运行时间——而一个向每位访客发放编辑器捆绑包的活动页面,已经丢弃了构建编辑器的意义。
可视化构建器会接受浏览器的结构化输入,并将其转化为你提供的标记。以下每一项都源自这一句话。
加载、保存和发布端点都是特权的。就这样对待它们吧。
被允许编辑页面并不等同于被允许发布页面。
检查服务器端的类型、大小和内容,并从你愿意隔离的来源提供用户上传。
如果页面作者不完全信任,出文时和进页都要进行消毒。
Project JSON 到达你的 API 是不可信的输入。解析它,而不是简单地存储它。
发布改变公众所看到的内容。限制速率,记录数据,并使其可恢复。
编辑器发送的任何内容都可能被伪造。重新确定服务器的所有权和限制。
这只是一份起始清单,不是保证。自己部署威胁模型——尤其是当编辑页面的人不是域名所有者时。
三个阶段,每个阶段都可以发布。错误在于试图在没人发布第一阶段页面之前就进入第三阶段。
一个人可以搭建并发布一个页面。
团队可以依靠它,而你不在场。
建筑商变成了可以出售的东西。
第一个阶段之后的每个阶段都是产品决策,而不是编辑器层面的决定——这正是编辑器不该是你还在构建的东西的原因。
从GrapesJS的视觉编辑引擎开始,针对你的产品进行定制,并通过GJS.Market插件添加所需的功能。
安装核心,注册你的第一个部分库,然后用项目数据渲染页面。
开始添加块、模板、表单、SEO审计和发布目标,无需自己编写。
浏览插件告诉我们构建器需要做什么,我们会为编辑器、插件栈和集成进行范围规划。
打造你的落地页面构建器构建产品所需的编辑器——而不是从头重建编辑器引擎。