页面可视化搭建工具, 是互联网公司中常见的运营工具, 实现了运营人员快速生成和发布页面, 提高页面上线效率; 且无需开发人员介入, 节省开发人力.javascript
页面可视化搭建工具搭建出的页面示例: html
但从零开始设计和开发出这种工具并不简单. 笔者维护的页面可视化搭建框架 pipeline, 提供了页面可视化搭建的核心功能, 免去从零实现页面可视化搭建工具的困难.前端
本文主要包含如下内容:vue
前端业务中, 常常须要开发产品介绍页/营销页/活动页/图片展现页等页面. 这类需求有如下几个特色:java
对于高频和重复的活动页面开发, 业界通常将页面作成配置化, 配置工做从开发人员交接给产品/运营等需求方; 开发和设计人员只需提供配置化页面支持. 更优的活动页面生成流程依靠页面可视化搭建系统来实现. 现.react
流程2
.同时, 随着页面可视化搭建系统中的页面模板不断丰富, 新的页面需求对开发人员的依赖逐渐减低, 可由运营/产品直接完成.webpack
更优的活动页面开发流程依靠页面可视化搭建系统实现, 重点是要有页面可视化搭建工具提供技术支持. 页面可视化搭建工具经过填写配置数据表单, 拖拉页面组件等可视化的页面编辑方式, 实现页面的生成或修改.git
但从零开始设计和开发出页面可视化搭建工具并不简单, 有几个须要了解和关注的技术点.github
从技术角度, 设计和开发一个页面可视化搭建工具时, 须要考虑如下几个技术要点:web
页面的基本单元是 HTML 元素, 可是 HTML 元素没法包含业务逻辑, 且由 HTML 元素直接组合出页面, 过于繁杂和低效.
页面较好的组织方式是组件化, 如上图所示. 组件是对 HTML 元素、元素布局和样式、业务逻辑的封装. 经过组件封装业务逻辑, 并经过组件属性(Props)向外暴露组件的配置字段. 采用页面组件化, 复杂的页面可视化搭建能够转化为2个较简单的操做:
页面组件化需依靠前端框架来实现. 页面可视化搭建工具的架构方式对页面前端框架有限制: 需选择页面可视化搭建工具支持的前端框架. 如: 页面可视化搭建工具只支持基于 vue 的页面, 那页面组件化的前端框架只能选择 vue.
可是前端技术团队选用的前端框架, 通常已用于支持现有业务, 并沉淀了必定数量的技术组件和业务组件. 若是须要针对页面可视化搭建工具进行前端框架的切换, 成本将会很大.
因此理想的页面可视化搭建工具, 应该和页面的前端框架解偶, 以下图所示. 技术团队在某前端框架中沉淀的技术组件和业务组件, 可在页面可视化搭建工具的页面中复用.
技术难点1:页面可视化搭建工具与页面前端框架解偶.
固然, 前端业务已选用了某前端框架, 开发专门支持该前端框架的页面可视化搭建工具, 也是高效实现目标的选择.
页面模板包含完整的业务逻辑, 有助于快速生成业务页面. 不一样的页面模板适用于不一样的业务功能, 从模板库中选择合适的页面模板并派生出默认业务页面, 再对默认页面进行可视化编辑, 从而生成目标业务页面.
云凤蝶的页面模板列表:
模板带有页面的默认数据; 对于组件化的页面, 模板是从组件库中选取部分组件, 并带有各个组件的默认配置数据.
如上图所示, 页面组件库中有组件A, 组件B, 组件C, 组件D, ..., 组件X等. 页面模板一由组件库中的组件A, 组件B和组件C组成, 实现了一个完整的业务功能; 页面模板二由组件库中的组件A, 组件B和组件X组成, 完成另外一个完整的业务功能.
页面由页面组件组合而成, 页面的编辑实际上是对页面组件进行从新组合, 并编辑各页面组件的内容. 页面编辑包含2个部分: 编辑页面组件和编辑页面内容.
使用组件化的方式来组织页面, 页面能够认为是一棵组件树, 以下图所示, 树中的节点为页面组件, 页面组件能够包含子组件.
在代码编写上, 经过组件标签的组合来声明一棵组件树, 并在打包时生成页面资源, 在运行时加载页面资源渲染出页面.
react 和 vue 的组件树声明示例:
编辑页面组件的一个可行方式是: 动态地给页面源码添加组件, 而后从新打包生成页面. 如经过可视化的方式替换 Left组件
为 NewLeft组件
后, 对源码的组件树声明作替换, 将 Left
标签替换为 NewLeft
标签.
一些前端框架支持动态组件, 能够根据组件树声明动态渲染出组件, 而无需在构建前就定义好页面的组件树结构. 对动态组件页面实现可视化组件编辑时, 能够只编辑组件树声明文件, 而后将组件树声明传入提早打包好的页面中进行渲染. 采用动态组件能够避免从新打包的耗时, 快速生成新页面.
Vue 根据组件树声明动态地渲染组件示例以下图, vue 动态组件使用 compontent
关键字来声明, 并经过 is
属性来决定实例化的具体组件. 对于 react, 组件是一个 js 对象, 直接在 jsx 中按照组件名称返回对应组件就能够了.
组件化页面的页面内容编辑, 是对页面中各个组件的组件属性(Props)进行配置.
一个组件包含组件属性(Props), 组件状态(State), 组件HTML模板(Template), 组件业务逻辑(Javascript), 组件样式布局(Style)等几个部分.
组件的配置数据经过组件暴露的 Props 注入到组件中, 在组件内部 Props 做为常量分发给 State, Template, Javascript, Style 等其余组件内容, 由组件内容渲染出视图.
组件是业务内容的呈现载体, 不一样的业务内容, 封装在不一样的业务组件中. 因此页面模板中的组件是差别化的, 差别点体如今组件的 Props, State, Template, Javascript, Style 等组件内容上. 在编辑不一样组件内容时, 组件配置数据的数据结构是也是差别化的.
以下图示的页面包含3个组件: 头部组件, 间隔区组件和天气组件. 头部组件的配置数据为头部标题和头部图片等; 间隔去组件的配置数据为间隔提示文本等; 天气组件的配置数据为城市名称. 不一样的组件须要不一样的配置数据.
须要为各组件差别化的配置数据定义数据结构和字段类型, 理想的配置数据格式为 JSON, 由于其格式灵活, 支持数据嵌套, 且前端友好.
页面可视化搭建工具的主要使用人员是运营/产品, 若是让运营/产品人员直接编辑文本格式的组件配置数据, 操做不友好而且容易出错. 需提供可视化的编辑方式 -- 使用 Form 表单来填入配置数据. Form 表单是页面中数据交互的基本形式, 非开发人员使用也没有技术门槛. 使用配置表单来填入配置数据有2个好处:
如上图所示, 因为组件配置数据的差别化, 组件配置表单也是差别化的, 需为组件库中的每一个组件提供相应的配置表单. 若是为每一个组件都编写一个表单页面, 工做量较大; 对于复杂的配置项, 表单页面的编写工做量可能会大于页面组件的开发工做量. 须要重点考虑提供配置表单的方式.
技术难点2: 如何用最简单的方式生成配置数据编辑表单.
组件树定义了组件间父子兄弟的层级关系, 父子组件经过数据流和事件进行关联: 数据从父组件的 State 传递到子组件的 Props; 子组件的变动触发 Event 通知父组件.
页面可视化搭建工具编辑组件树时, 会修改组件数据流. 而不一样组件的 Props 和 State 是异构的, 在编辑组件树时, 须要处理不一样组件产生层级关系后对数据流的影响. 以下图, 父组件的 State 只包含子组件A
的 Props, 将子组件B
挂载为父组件的子组件, 父组件没有子组件B
的 Props, 会致使没法渲染子组件B
.
同理, 不一样的组件有不一样的样式布局, 编辑组件树时, 须要处理不一样组件产生层级关系后带来的布局影响.
以下图, 一个父组件为行内组件, 给其添加一个块级组件做为子组件, 渲染后可能会致使行内组件被块级组件撑开.
因此设计页面可视化搭建工具的组件树编辑功能时, 须要重点关注组件树的层级关系, 解决组件间数据依赖和组件间布局适配问题. 页面可视化搭建工具须要制订组件嵌套的规则和约束, 经过组件嵌套规则来确保可视化编辑后的组件树正常渲染.
技术难点3: 如何组织页面组件的层级关系.
使用组件嵌套的搭建工具示例:
能够想象, 组件的嵌套会加大页面可视化搭建工具的架构设计和开发难度.
咱们注意到, 营销活动的主要平台是移动端, 移动端页面的经常使用的布局策略是: 宽度铺满, 高度滚动. 若是前端框架组件都设置为铺满宽度, 页面展现时组件只需在浏览器垂直方向上顺序排列, 则组件组合时不须要嵌套 -- 全部组件互为兄弟节点.
这种铺满页面宽度的组件, 很是适合搭建移动端页面的场景: 在承载页面逻辑的同时, 使得页面的编辑更加简单, 使用者只需处理组件的顺序, 无需处理组件的嵌套.
在移动端, 使用非嵌套组件层级规则的页面可视化搭建工具备: 阿里云凤蝶、pipeline 等.
阿里云凤蝶图示:
可视化搭建PC端中后台系统页面的工具, 一样能够采用不嵌套组件层级规则, 如阿里的飞冰:
页面实时预览是页面可视化搭建工具的必要部分, 使用人员能够在经过页面预览来查看和验证可视化编辑的效果.
页面预览示例:
用户的可视化编辑包括修改组件树和修改组件配置数据. 以下图, 用户修改页面后, 须要从新渲染页面组件, 获得新的预览页面.
实现页面预览有两种方式: 页面挂载和后台渲染.
页面挂载指在编辑器前端页面的某个元素节点(div)上渲染出用户编辑的效果. 页面挂载流程图以下:
使用页面挂载的预览方式, 编辑器前端页面须要提供组件库组件渲染环境(组件库前端框架); 为实现前端渲染, 编辑器前端源码需引入组件库组件源码, 后续组件库更新, 编辑器须要同步更新. 页面挂载方式有如下特色:
后台渲染指在后台进行用户编辑结果页面的渲染和生成, 编辑器前端页面经过 iframe 加载和展现结果页面. 后台渲染流程图以下:
使用后台渲染的预览方式, 编辑器前端页面并不须要渲染组件库的组件; 甚至不须要组件源码, 只需知道各个组件的描述信息. 后台渲染有如下特色:
难点4: 如何实现组件库的快速后台渲染, 从而实现编辑器和组件库前端框架的分离.
页面构建是组件化前端源码生成页面资源的必要环节: 在开发时须要进行开发构建来进行页面调试; 在可视化编辑后可能须要从新构建来生成预览页面; 在发布前须要进行生产构建.
在可视化搭建页面时须要“实时”预览, 要求页面页面构建效率高, 实现快速的构建和打包. 更进一步, 后台渲染其实和服务端渲染很像, 可否借鉴服务端渲染的技术思路.
页面可视化搭建工具在业务中的落地, 须要根据不一样的业务场景进行业务组件和页面模板的自定义开发. 这对页面可视化搭建工具提出3个要求:
页面可视化搭建工具要支持业务现有的前端框架.
避免后续组件和模板自定义开发时的工做量和割裂感. 咱们是但愿复用现有前端框架组件, 而不是用另外一个前端框架重写一遍.
组件和模板的编写方式需遵循较简单的编写约定, 避免开发人员难上手和写起来不舒服.
自定义模板和组件和在开发模式下进行调试和测试.
页面可视化搭建工具必然会对页面模板和页面组件的编码方式进行限定. 这要求就页面可视化工具在页面模板和页面组件上的约束较少, 减小对前端框架代码组织方式的入侵点.
页面可视化搭建工具, 须要对页面作一些约定和约束, 在可视化搭建时遵循工具约定和约束来编辑页面. 从页面可视化搭建工具的技术要点中, 能够概括出活动页面可视化搭建工具的理想形态.
页面可视化搭建工具备不一样的框架设计和实现方式, 不一样的功能有不一样的适用场景, 详细分类能够参考笔者之前的文章: 页面可视化搭建工具前生今世.
运营页面搭建工具, 实现基于模板的页面生成; 将页面的逻辑功能封装在组件内, 声明页面配置数据并提供配置表单, 经过对配置表单的数据填充, 进行少许页面编辑就能够完成业务页面搭建.
在编辑自由度的选择上, 选用不嵌套的组件.各组件铺满页面宽度, 在页面高度方向顺序排列.解决组件嵌套带来的数据流问题. 不嵌套的组件以下图各个红框框起来的部分所示.
配置表单的做用是生成和约束 JSON 配置数据, 业界已有对 JSON 进行描述和自动生成表单的方案 -- JSON Schema. 按照 JSON Schema 规范对 JSON 数据进行描述, 能够动态渲染出配置表单; 且 JSON Schema 能够对编辑后的数据作格式校验, 避免编辑错误. 这比编写一个表单页面更加简单和高效.
JSON Schema 的语法并非很精简, 云凤蝶的 Schema 语法 等方案更简洁, 可是云凤蝶的语法没有开源的表单生成库支持, 在开源实践上仍是 JSON Schema 最佳.
Pipeline 是一个开源的页面可视化搭建框架, 主要由笔者在维护. Pipeline 意为流水线, 指望 pipeline 像工厂流水线同样能够高效地组装活动页面.
所谓框架, 是它实现了页面可视化搭建的基本功能, 解决了页面可视化搭建的基本难点, 可让开发者快速拥有页面搭建的能力, 并支持私有部署和二次开发.
项目信息:
如动图所示, pipeline 的可视化编辑能力有:
如动图所示, pipeline 的组件编辑能力有:
Pipeline 实现了编辑器和页面前端框架的分离, 能够支持不一样的前端框架. 所谓支持的前端框架, 就是对某个前端框架按照 pipeline 的约束规则进行组件编辑方式和工程构建方式的改造, 使得前端框架页面能够在 pipeline 中可视化搭建.
目前已经支持 Vue, React, 和 Omi, 理论上能够支持任意前端框架.
阿里云凤蝶 是目前市场上可见中最棒的页面可视化搭建服务, pipeline 的不少方面和云凤蝶类似, 作个简单对比:
云凤蝶 | pipeline |
商业化解决方案, 直接可用 | 开源系统, 基础的页面搭建框架, 须要自行部署 |
生成的页面, 上传的图片等只能托管在阿里, 也限定域名 | 资源落地和周边功能须要自行搭建, 可是能够100%掌控全部资源 |
配置表单功能比较完善 | 配置表单比较基础, 须要提高 |
使用自定义的组件配置约束规则 | 使用通用的 JSON Schema 规范 |
模板前端框架采用 Nunjucks | 前端框架采用没有约束, 已经支持 vue 和 react 等, 业务迁移成本低 |
隐藏了模板的构建处理过程, 提供制定的 IDE | 采用 webpack 构建, 模板开发与正常前端项目开发一致 |
不支持自定义页面级别的配置项 | 支持自定义页面级别的配置项 |
总的来讲: 云凤蝶是完整的商业化页面可视化搭建系统, 适合偏业务运营的公司; pipeline 是开源的页面可视化搭建框架, 适合须要自建页面可视化搭建系统且有技术人员支持的公司.
本文讨论了活动页面开发的痛点, 总结出页可视化搭建工具的7个技术要点和4个技术难点, 并整理出理想的运营页面可视化搭建工具, 最后介绍页面可视化搭建框架 pipeline.
行文仓促, 对页面可视化搭建话题或开源项目 pipeline 感兴趣, 欢迎讨论.