历史

在引擎中会使用MutationObserver的 observe 方法监听 DOM 树的变更,并不是每次变更后都会立马触发 observe 方法,而是在没有后续编辑行为时触发,这个间隔非常短,短到能让我们认为是时时变更的。这个间隔时间取决于MutationObserver的实现,我们无法控制。

每次的变更,我们会将MutationObserver提供给我们的 DOM 节点数据(类似增删改的操作)包括属性的变更,转换为Ops相当于是一个描述操作的集合,其次我们还有记录变更前的光标位置。这些数据我们都把它当作一种快照按堆栈形式存在内存中。在执行撤销、重做命令时,我们会从这个堆栈中按索引查找并还原。同时这些Ops还会传输到我们的协同服务端上,以此来通知各个客户端 DOM 树的变更