regularjs/regular

修改$unwatch的实现

Closed this issue · 1 comments

regularjs有块的概念,比如

image

红线部分就是块,其实每个被节点或语句包裹的都是块,是个树形结构。块可以看成是小型的Regularjs组件,拥有inject和destroy 接口,它是Regularjs中回收的最小单位,但是无法被开发者直接控制。在每个块创建时,Regularjs会标记它相关的watcher(包括用户指令创建的),因为所有块的watcher都保存在组件的_watchers数组中。在每个块被回收时,Regularjs会将标记的所有watcher从组件的_watchers数组中移除,使用的是双重循环+splice,这引入了极大的性能损耗。

新的设计是 ,当调用$unwatch接口时, 将不会即使移除,而是标记为"removed". 统一在digest遍历watchers时,进行去除。

这个简单修改,使得regularjs在极端情况下进行块回收时,有了超过5倍的性能提升,比如大列表变为空数组时,其实这种场景其实并不少见

补充更深度优化: 在digest 在连续 removed标识的 watchers 合并为一次 splice 操作