Elm性能优化场景下Keyed Node是否需要搭配Lazy使用
关于Elm中keyed nodes与lazy关系的解答
你的理解并不准确,keyed nodes 与 lazy 是相互独立的两个优化手段,keyed nodes 的核心价值并不依赖 lazy 存在。
keyed nodes设计的核心目的,是解决列表元素顺序变化、增删场景下的DOM错误更新和不必要性能损耗。在不使用keyed nodes的场景下,虚拟DOM会按列表索引位置逐一比对:如果只是两个列表项交换顺序,虚拟DOM会直接修改两个位置对应DOM节点的所有内容,而非直接交换DOM节点本身,这不仅会带来更高的DOM操作成本,还会导致列表项内部的状态(比如输入框的输入内容、折叠展开状态等)出现错乱。哪怕你没有搭配lazy使用,只要用了keyed nodes,虚拟DOM就可以通过key直接匹配到对应的原有DOM节点,避免按索引比对带来的错误更新和多余DOM修改,这部分收益是keyed nodes本身自带的,和lazy完全无关。lazy的作用是做子树diff的短路优化:当传入lazy包裹的视图函数的参数没有发生变化时,会直接跳过整个子树的diff计算,属于额外的优化项。如果不搭配lazy,虚拟DOM确实需要对每个匹配到key的列表项做子树diff,但这个diff是纯内存层面的计算,成本远低于没有keyed nodes时的DOM修改操作。只有当你的列表项视图结构非常复杂,子树diff的成本已经不可忽略时,搭配lazy才能进一步放大优化效果。
官方指南的示例只是将两个优化手段结合使用,以达到最优的渲染性能,并不代表keyed nodes必须依赖lazy才有实用价值。
内容的提问来源于stack exchange,提问作者Nick Lee
相关产品推荐
相关产品推荐

