总共进 8 万行代码实现H5可视化构建工具,自去年十月开始陆续作了大半年,现已投入到业务中使用,虽然算是我的项目,但组件和部署模块涉及大量公司业务代码,就不开源了,主要讲讲实现思路,算是该项目的回顾总结,将核心难点、重点作拆分解析,拆分红系列不按期更新前端
互联网行业运营需求频繁,并且需求周期短,每每只有一、2天开发时间,放在项目里既拖慢总体编译效率,同时又没有任何意义,基本上都是当月做废,同时对开发者自己没有任何提高,重复劳动,咱们要作的就是经过工程的方式解放生产力,由运营同窗本身完成活动页上线,而再也不须要开发资源微信
这是我早期画的原型图,原谅我拙劣的画图能力,看看就好编辑器
接下来,咱们对第一个会遇到的难点进行解析工具
方案一:经过子组件实现模拟布局
方案二: 经过iframe建立独立的window上下文来模拟post
对于方案一,没有独立的window上下文,缺陷是不可逆的,而方案二除了通讯困难,其余近乎完美,数据不共享的问题咱们能够经过实现StateSync机制来实现,咱们这里选择方案二,那如何实现StateSync呢?ui
这里只须要三个步骤spa
实现监听store的伪代码:线程
const store = new Vuex.Store({
state:{
// 页面数据
// ...
},
mutations:{
//...
},
});
// !因为mutation是Vuex中最小的提交粒度,因此只须要监听mutation就能够监听全部的数据变更
store.subscribe((mutation, state) => {
// 数据发送
// do someting ...
});
复制代码
重点来了
数据流走向图:
// 主窗口代码
// 监听来自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;
// 主窗口数据变更时同步至iframe
iframe.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,十分感激