相关文章
IoT Studio可视化搭建平台编辑历史功能的思考与探索
2024-12-16 15:21

简介: 在前端可视化搭建领域中“重做”和“撤销”这两个功能已经是标配中的标配,毕竟只要有用户行为的地方就可能会有出错,这两个功能无疑就是为用户提供了“后悔药”。目前有各种各样的可视化搭建平台,本文介绍IoT Studio可视化搭建平台在编辑历史功能上的设计与思考。

IoT Studio可视化搭建平台编辑历史功能的思考与探索

来源 | 阿里技术公众号

在前端可视化搭建领域中“重做”和“撤销”这两个功能已经是标配中的标配,毕竟只要有用户行为的地方就可能会有出错,这两个功能无疑就是为用户提供了“后悔药”。目前有各种各样的可视化搭建平台,本文介绍IoT Studio可视化搭建平台在编辑历史功能上的设计与思考。

1 页面DSL的维护

在IoT Studio可视化搭建平台中,我们通过页面的抽象语法树来维护页面状态,页面信息和组件信息都记录在对应节点上:

2 重做与撤销

快照法

在每次编辑页面时,将页面的信息进行深拷贝存入历史记录中。在进行重做和撤销时从历史记录中取出对应的快照,用快照代替当前页面状态,即可完成一次历史记录的操作。

在这种方法下,通常使用一个指针来指向当前的页面状态。如下图:

  1. 实现比较简单,页面信息全量进行深拷贝即可。
  2. 历史记录之间的切换灵活。
  3. 当页面信息很大时,十分占用存储空间。

指令法

IoT Studio使用的是这种方法。

我们为每一次操作定义两个方法:execute与undo,以及将“操作”抽象为Operation。

在execute中执行这次操作的正向操作,在undo中实现逆向操作。

每进行一次编辑操作,其实就是创建一次Operation并执行其execute方法,随后如果需要撤销就执行其undo方法。

指令法的特点:

  1. 相对快照法,在页面配置复杂时,能节省不少存储空间。
  2. 不同的Operation其execute和undo逻辑很可能会不一样,有一定的逻辑开发成本。
  3. 跨多个历史记录的重做或撤销,需要执行他们之前所有的execute或undo。例如,上图中如果从O3到O1需要执行2次undo。这一点没有快照法便利。

3 实现细节

在上文里提到了IoT Studio使用的是指令法。

Transation

在实际业务开发中,很多场景会涉及到一次性编辑多个组件,即涉及多个Operation实例。于是在Operation基础上有了Transaction——事务的概念,Transaction下维护了一份Operation实例List,每当有execute或者undo执行时,会遍历Operation List中的Operation实例执行其execute或undo方法。

双向链表

IoT Studio中的操作历史是基于双向链表实现的,每个链表节点维护一个Transaction实例。链表节点末端的execute结果既是最新的操作历史。

链表之前通过forwardCurrent和backforwardCurrent方法进行节点状态的切换。

 

每当有新的编辑操作时,会通过addAfterCurrent插入新的节点。

4 总结

Operation是实现重做和撤销的最小指令实例,通过Operation不同子类实现不同的execute和undo方法,从而实现重做和撤销的具体逻辑。

Transaction中维护了Operation实例数组,我们在进行业务逻辑开发中对组件进行属性设置时是以Transaction实例为单位进行业务逻辑开发。

维护了一个双向链表来对Transaction实例进行管理,从而实现可视化搭建的操作历史功能。

在实现思路中我们提到了“快照法”和“指令法”,对比两者的优缺点,不难发现主要矛盾是在体积与维护成本上。那么有没有一种办法能兼顾二者的优点呢?下面两个工具可以提供一些思路:

immutable.js + 快照法

在JS中对象是引用赋值,在保存对象时往往会使用深拷贝规避这个问题,但是这样会造成CPU和内存的浪费,这也是快照法的缺点所在。

immutable使用持久化数据结构,在使用旧数据创建新数据的时候,会保证旧数据同时可用且不变,同时为了避免深度复制复制所有节点的带来的性能损耗,immutable使用了结构共享,即如果对象树种的一个节点发生变化,只修改这个节点和受他影响的父节点,其他节点则共享。

在实现操作历史功能时,使用immutable存储数据,能解决数据复用的问题。immutable.js + 快照法可以组合使用。据我所知公司的@ali/visualengine使用的就是这个方案。

Git

每次我们运行 git add 和 git commit 命令时,Git 所做的工作实质就是将被改写的文件保存为数据对象, 更新暂存区,记录树对象。
Git 是如何做到这点的?Git 打包对象时,会查找命名及大小相近的文件,并只保存文件不同版本之间的差异内容。 你可以查看包文件,观察它是如何节省空间的。
同样有趣的地方在于,第二个版本完整保存了文件内容,而原始的版本反而是以差异方式保存的——这是因为大部分情况下需要快速访问文件的最新版本。最妙之处是你可以随时重新打包。Git 时常会自动对仓库进行重新打包以节省空间。当然你也可以随时手动执行 git gc 命令来这么做。

原文链接

本文为阿里云原创内容,未经允许不得转载。 

    以上就是本篇文章【IoT Studio可视化搭建平台编辑历史功能的思考与探索】的全部内容了,欢迎阅览 ! 文章地址:http://dgaty.xhstdz.com/news/11626.html 
     栏目首页      相关文章      动态      同类文章      热门文章      网站地图      返回首页 物流园资讯移动站 http://dgaty.xhstdz.com/mobile/ , 查看更多   
最新文章
如何轻松应对Nginx配置文件大小限制提高网站性能与稳定性
为什么需要关注Nginx配置文件大小限制 在使用Nginx作为网站服务器的过程中,配置文件的大小限制是一个常见的问题。当配置文件过大时,会导致服务器性能下降,影响网站的稳定性和访问速度。因此,及时优化和调整配置文件大小非常重要。 如何
打造健康生活新选择:养生馆推广文案写作技巧揭秘
引言:健康生活的追求 在现代社会中,健康已经成为人们最看重的财富之一。快节奏的生活和不断加重的工作压力,使得越来越多的人开始关注自己的身心健康。养生馆作为一种创新的健康生活方式应运而生,它不仅为人们提供了放松身心的场所,还
探索兰州魅力:一份全面的兰州旅游攻略揭开牛肉面与黄河的秘密
探索兰州:邂逅西北的魅力之城 兰州,作为甘肃省的省会,坐落于黄河上游,是一座历史悠久而又充满活力的城市。这里不仅拥有丰富的文化遗产,还有壮观的自然景观。兰州以其独特的地理位置、深厚的文化底蕴和美味的地方美食吸引着越来越多的
如何设置服务器配置提高系统性能?
提高系统性能的重要性 在当今数字化时代,服务器的性能直接影响到企业的竞争力和运营效率。一个高效的服务器配置不仅可以提升系统的稳定性和响应速度,还能提高员工的工作效率和客户体验。 选择适合的硬件和软件配置 首先,要根据企业的实
如何成功启动社区团购:从运营模式到实战技巧的全方位解析
引言:社区团购的崛起 在当今的互联网时代,社区团购以其高效、便捷的特点迅速崛起,成为许多消费者购物的新选择。社区团购不仅能满足居民对日常生活用品的需求,还能通过规模化采购为消费者带来实惠。如何成功启动社区团购,成为了许多创
海底捞学生证折扣使用时间详解:让你的就餐更划算
海底捞学生证折扣使用时间详解 海底捞作为国内知名的火锅连锁品牌,一直以高质量的服务和美味的火锅享誉全国。而对于学生党来说,海底捞更是一个不可多得的福利之地。学生持有效学生证可以享受折扣优惠,让你的就餐更划算。 折扣使用时间
企业网站优化的方法详解
企业网站优化的方法详解 在当今数字化时代,企业网站是企业展示形象、吸引客户、提升品牌的重要窗口。但是,如何使企业网站在竞争激烈的网络世界中脱颖而出,吸引更多潜在客户,成为每家企业都需要思考和解决的问题。 网站内容优化 网站内
探索旅游景区的多样性:常见景观设施类型与特色分析
引言 随着人们生活水平的不断提高,旅游已成为现代生活中不可或缺的一部分。在这个充满活力的行业中,旅游景区以其多样化的景观设施和独特的文化特色,吸引了越来越多的游客。本文将深入探讨旅游景区的多样性,分析常见的景观设施类型以及
企业网站建设优化设计:提升品牌形象与用户体验的必经之路
企业网站建设优化设计的重要性 随着互联网的迅猛发展,企业网站已经成为企业展示自身形象、吸引客户、促进销售的重要工具。而一个优秀的企业网站不仅仅是在页面上简单地展示产品和服务,更需要具备优化设计,提升品牌形象和用户体验,从而
社区团购平台运营模式探析:提升效率与用户体验的双重战略
社区团购的兴起 随着互联网的快速发展,社区团购平台逐渐走进人们的生活,为消费者带来了更加便捷和实惠的购物体验。社区团购是指通过线上平台,将消费者团结在一起,集中采购商品,从而获得更低的价格优惠。这种模式不仅可以提升效率,还
相关文章