实现背景
手头已经有一个基于Javascript的富文本编辑器,基本架构采用MVC,其中View层负责相应用户行为(例如文本输入等),之后把对应的行为通知Controller, 由Controller把行为封装成命令(command),由命令来操作数据,之后数据层触发各种change事件,通知View层,View层再进行渲染。大体结构如下:
实现方案
基本思想:
1,尽量在少改动现有代码结构的基础上引入协同的逻辑
2,考虑到参与人员大都熟悉javascript开发,而在server端开发经验很少,所以尽量简化协同server的逻辑,使其仅仅从事命令的排序和转发。
基本架构如下:
其中:
1, 协同模块和协同server之间,采用websocket进行通信。
2,之前命令里嵌套层次太深,在命令序列化的时候,效率太低,所以把命令重新改写,保持两层结构,第一层是复合命令,第二层原子命令。符合命令包含若干原子命令,但不能直接对数据进行操作,数据操作的工作都有原子命令完成。
3,为了提高用户输入响应时间(因为先发送命令,等到命令返回后再执行,时延较大),对于用户已经锁定的段落,采用先执行再发送的策略
4,为了减少流量占用,对于序列化后的命令进行压缩