前言

总共进 8 万行代码实现H5可视化构建工具,自去年十月开始陆续做了大半年,现已投入到业务中使用,虽然算是个人项目,但组件和部署模块涉及大量公司业务代码,就不开源了,主要讲讲实现思路,算是该项目的回顾总结,将核心难点、重点做拆分解析,拆分成系列不定期更新

成品图

动图太大,可以点击链接查看

技术栈

  • 前端 Vue-CLI3 全家桶、Electron、Graphql、Typescript、Stylus、Vuetify
  • 后端 Koa2、Graphql、Nuxt、MongoDB

为什么需要 H5 可视化构建工具

互联网行业运营需求频繁,而且需求周期短,往往只有1、2天开发时间,放在项目里既拖慢整体编译效率,同时又没有任何意义,基本上都是当月作废,同时对开发者本身没有任何提升,重复劳动,我们要做的就是通过工程的方式解放生产力,由运营同学自己完成活动页上线,而不再需要开发资源

确定产品原型

  • 提供可视化编辑的控制台生成Vue SFC源码
  • 可以对已生成的页面进行管理(编辑,上下线)
  • 控制台提供自上而下的单列布局适配移动端H5,简化操作逻辑
  • 添加的组件可编辑属性、样式、事件回调
  • 易于扩展的组件注册机制

这是我早期画的原型图,原谅我拙劣的画图能力,看看就好

接下来,我们对第一个会遇到的难点进行解析

如何尽可能模拟移动端真实环境

方案一:通过子组件实现模拟

  • 优点:实现简单,并且作为子组件,状态和行为完全受父组件控制
  • 缺点:由于处于同一个window上下文,子组件的内容会被全局样式污染,难以保证与实机一致,同时 UA和rem等相对尺寸会失效

方案二: 通过iframe创建独立的window上下文来模拟

  • 优点:iframe包含完整的HTML代码,拥有独立的上下文,可以尽可能的模拟移动端环境
  • 缺点:数据不共享,只能通过PostMessage机制进行通信

对于方案一,没有独立的window上下文,缺陷是不可逆的,而方案二除了通信困难,其他近乎完美,数据不共享的问题我们可以通过实现StateSync机制来实现,我们这里选择方案二,那如何实现StateSync呢?

这里只需要三个步骤

  1. 首先我们把页面编辑所需要的所有数据都提升到Vuex做全局存储
  2. 监听store中所有的数据变化

实现监听store的伪代码:

const store = new Vuex.Store({state:{// 页面数据// ...},mutations:{//...},
});// !由于mutation是Vuex中最小的提交粒度,所以只需要监听mutation就可以监听所有的数据变动
store.subscribe((mutation, state) => {// 数据发送// do someting ...
});

重点来了

  1. 当触发mutation时将整个Vuex Module State 通过PostMessage发送给对方(主窗口/iframe)

数据流走向图:

// 主窗口代码// 监听来自iFrame的数据推送
window.addEventListener("message", (event) => {// 将iFrame推送的数据做同步操作store.dispatch(STATE_SYNC, event.data);
});store.subscribe((mutation, state) => {// 这里我们要避免出现死循环,忽略掉来自 THREAD_STATE_SYNC 的提交if (mutation.type.includes(THREAD_STATE_SYNC)) return;// 主窗口数据变动时同步至iframeiframe.contentWindow.postMessage(state);
});
// iframe 代码window.addEventListener("message", (event) => {// 将iFrame推送的数据做同步操作store.dispatch(STATE_SYNC, event.data);
});store.subscribe((mutation, state) => {if (mutation.type.includes(THREAD_STATE_SYNC)) return;// 副线程发送window.parent.postMessage(state);
});

至此,我们完成了主窗口到iframe的数据自动同步,保证了数据的一致性同时,尽可能的模拟了移动端的真实特性,为我们的H5可视化编辑器打好基础,下一期我会开始讲如何实现UI组件库和可视化编辑器解偶,实现无痛迭代UI组件库和最大化复用UI组件

下一期

深入解析 H5 可视化构建工具原理(二) 如何实现外部组件注册机制

最后

第一次正儿八经的写文章,可能想表达的东西没写清楚,有问题大家可以在评论区留言,顺便最近在找工作,有在杭州滨江附近好的就业机会请联系我的微信:wxdreams,十分感激

转载于:https://juejin.im/post/5ce7d201f265da1b6a346f0a

H5 可视化构建工具原理解析(一)相关推荐

  1. 可视化构建工具探索之Vue Cli3.0 阿里飞冰

    Vue Cli3.0可视化构建工具--Vue UI 一.安装环境 安装了最新的Vue CLI.打开Terminal,输入: npm install -g @vue/cli or yarn global ...

  2. Avaddon勒索解密工具原理解析

    文章目录 Avaddon勒索 解密工具 解密工具原理 解密工具优化 关于文件大小的疑惑 Avaddon勒索加密流程补充 解密工具实现 相关资料 Avaddon勒索 该勒索病毒使用C++语言进行编写,采 ...

  3. java 仿易企秀_鲁班H5(开源可视化搭建系统, 可以理解为开源版本易企秀)核心实现原理解析...

    鲁班H5核心原理解析(开源版本的拖拽生成H5平台,功能类似易企秀的开源可视化搭建系统) 相关地址 鲁班H5是什么? 鲁班H5是基于Vue2.0开发的,通过拖拽的形式,生成页面的工具,类似易企秀.百度 ...

  4. UnityEditor蒙皮动画SkinnedMeshRenderer 使用骨骼RootBones的Gizmos可视化工具和原理解析

    Unity的蒙皮动画 在UnityEditor,使用SkinnedMeshRenderer承载蒙皮动画 帧动画和骨骼动画,蒙皮动画等等理论,还是得抽空学习一下的, 但要是在不懂原理的情况下(不懂比似懂 ...

  5. 13.8.可视化虚拟机工具--Jconsole内存监控、13.9.可视化虚拟机工具--Jconsole线程监控、13.10.死锁原理以及可视化虚拟机工具--Jconsole线程

    13.8.可视化虚拟机工具–Jconsole内存监控 13.9.可视化虚拟机工具–Jconsole线程监控 13.10.死锁原理以及可视化虚拟机工具–Jconsole线程 13.8.可视化虚拟机工具– ...

  6. 音乐、视频播放模式切换实现方案及原理解析(基于vue、vuex、h5 audio)

    音乐.视频播放模式切换实现方案及原理解析(基于vue.vuex.h5 audio) 播放模式有三种: 顺序播放 随机播放 单曲循环 定义为一个playMode对象并向外暴露,内含三种播放模式,即为: ...

  7. 痞子衡嵌入式:极易上手的可视化wxPython GUI构建工具(wxFormBuilder)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是wxPython GUI构建工具wxFormBuilder. 一.手工代码布局GUI界面的烦恼 如果你曾经设计过上位机软件GUI界面,初 ...

  8. 前端三大构建工具 Webpack、Vite、Rollup 优劣势及原理分析

    在刚刚结束的 VueConf2021 中,除了 Vue 3.0 以外,另外一个亮点就是下一代构建工具 Vite 了. 在尤雨溪分享的[ Vue 3 生态进展和计划]的演讲中,尤大神还特意提到 Vite ...

  9. 斗鱼 H5 直播原理解析,它是如何省了 80% 的 CDN 流量?

    作者:羽月 链接:https://juejin.cn/post/7121513067728338975 来源:稀土掘金 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 斗鱼直播相 ...

最新文章

  1. uvalive5096(积分题)
  2. 如何在国内下载Eclipse及其插件
  3. 【转】使用Navicat for Oracle新建表空间、用户及权限赋予
  4. Linux用户管理案例(第二版)
  5. M1芯片电脑出现重装系统Bug,教你如何「正确」重装macOS
  6. 20191118每日一句
  7. 关于qt使用sqlist数据库的注意事项
  8. 详解SSTI模板注入
  9. linux invalid argument_Linux命令很熟悉,你知道它们的英文全称和中文解释吗?
  10. seo三部曲之关键词策略
  11. PHP strpos
  12. 从蓄水池问题思考异步FIFO深度设计
  13. 基础拓扑学笔记(3)——连续映像
  14. detectron研读
  15. OpenCalib:自动驾驶多传感器开源标定工具箱
  16. 学计算机买什么电脑性价比高,学生用什么笔记本电脑好 性价比高的学生笔记本电脑...
  17. python无法定位到table_爬虫无法定位到tbody下的tr求助!!!!
  18. 杨八方的商业互吹(并查集)
  19. WebDAV之葫芦儿·派盘+NMM
  20. LabView 下载与安装

热门文章

  1. DFS深度优先搜索算法(适合初学者)
  2. Python爬虫实现无api版本各国汇率实时兑换(美元、英镑等)
  3. js 翻转表格(行列互换)
  4. ibatis中配置parameterClass=java.util.HashMap的用法
  5. Android Menu 之 ContextMenu 详解
  6. 执行unzip命令报错Archive: home.zip End-of-central-directory signature not found. Either this file is
  7. 彻底解决汉诺塔问题——递归算法
  8. 基于依存句法分析的实体关系提取
  9. 办理登机的英语词组手机键盘_如何使用智能手机使登机轻而易举
  10. java面试题(一)java面试题集合