为什么React在很多项目中显着变慢?

时间:2017-09-26 10:56:25

标签: javascript performance reactjs

为什么React在处理大型列表(比如说100,000个)虚拟节点(例如渲染空的组件)时没那么慢,而且没有DOM更新?是否有任何技巧可以缩短这些瓶颈?

以下是两个不同的演示,允许在屏幕上添加许多项目,并在每个刻度上进行非常简单的更新(基于PIXI bunnymark)。要明确的是,虽然提示很受欢迎,但这不是关于React使用的问题(这会使我的代码解密很重要),这是关于React能够协调100,000个虚拟节点的问题:

demo - source

反应

demo - source

现在 - 我知道React版本会变慢。但是什么导致差异如此激烈?换句话说 - 当没有DOM更新时,为什么React这么慢?(在平原上需要大约100,000个兔子才能达到React版本的8,000个,而普通版本仍然响应更快)

以下是关于反应实施的一些相关要点:

  1. 它使用PIXI的事实可能无关紧要,我猜测 - 因为在两个演示中都使用了它。直接WebGL或Canvas更新可能也会出现相同的问题,即使最终结果更快(双方都有)。

  2. 这个版本的架构可能有点难以阅读 - 所以用英语说它可能会有所帮助。从根本上说,所有路径都呈现null,更新只是传递给componentWillReceiveProps()中的PIXI。当然,拥有子节点的节点会渲染()子节点,但这不会向DOM添加任何内容。

  3. 有人建议完全使用自定义渲染器 - 但我不确定为什么考虑到上述因素会产生影响。换句话说 - 如果元素都是虚拟的,那么渲染器真的会有所作为吗?更重要的是 - 是否有硬数据来支持这一说法,即瓶颈是可交换的渲染器?

  4. 考虑到PIXI有自己的场景图和差异算法,人们可能想知道为什么在这个世界中将React添加到混合中是值得的。这是一个有效的问题,但不在此范围内。

  5. 另一方面,有人可能想知道为什么PIXI而不是WebGL / Canvas。简短的回答是PIXI使许多事情变得简单,就像传播变换的嵌套层次结构一样。

  6. 总体而言 - 我的目标是拥有一个React树(或其他一些声明框架),允许编写类似的内容:

    <Container position={pos}>
      <Container rotation={rot}>
        <Sprite texture={tex}/>
      </Container>
    </Container>
    

    将该地图直接映射到PIXI。

    如果它具有高效性,那将是非常棒的。

0 个答案:

没有答案