代码之家  ›  专栏  ›  技术社区  ›  Perfection

具有大型数据集的组件仅在IE11/Edge上运行缓慢

  •  7
  • Perfection  · 技术社区  · 9 年前

    考虑下面的代码。 <GridBody Rows={rows} /> 想象一下 rows.length 在本例中,每个数组大约有8列,则等于或大于2000。我使用此代码的一个更扩展版本来呈现表格的一部分,该表格一直是我的web应用程序的瓶颈。

    var GridBody = React.createClass({
        render: function () { 
            return <tbody>
                {this.props.Rows.map((row, rowKey) => {
                        return this.renderRow(row, rowKey);
                })}
            </tbody>;
        },
        renderRow: function (row, rowKey) {
            return <tr key={rowKey}>
                {row.map((col, colKey) => {
                    return this.renderColumn(col, colKey);
                })}
            </tr>;
        },
        renderColumn: function (col, colKey) {
            return <td key={colKey} dangerouslySetInnerHTML={{ __html: col } }></td>;
        }
    });
    

    现在谈谈实际问题。看起来计算(即使使用我自己的代码)似乎快得惊人,甚至ReactJS使用virtualDOM的工作也没有问题。

    但在reactJS中有这两个事件。

    componentWillUpdate 直到一切都还正常。 然后就有了 componentDidUpdate 看起来很好,都是镀铬的。

    这个问题

    但还有IE11/Edge,大约 4-6秒 比任何其他浏览器都慢,并且使用F12 Inspector,这似乎是 8秒 比Chrome慢。

    我尝试解决此问题的步骤:

    • 去除不必要的代码。

    • 在计算时间上减少几毫秒。

    • 将网格拆分为松散组件,以便virtualDOM不会尝试 一次更新整个组件。

    • 尝试将所有内容连接为字符串,并允许对 只设置一次innerhtml。这实际上似乎是IE中的一个bug IE11上的大字符串大约需要25-30秒。而在IE11上只需要30毫秒 铬。

    我还没有找到合适的解决办法。我在上面所做的操作似乎使IE中的情况不那么糟糕,但问题仍然存在,“现代”或“最近”的浏览器仍然慢3-4秒。

    更糟糕的是,这似乎几乎冻结了整个浏览器及其渲染。

    tl;博士 如何提高IE和其他浏览器的整体性能?

    如果我的问题不清楚,我道歉,我对这件事感到筋疲力尽。

    编辑:特别是在IE上DOM访问速度较慢,因为set innerHTML被调用超过10.000次。在ReactJS中可以防止这种情况吗?

    3 回复  |  直到 7 年前
        1
  •  8
  •   Marty    6 年前

    尝试提高IE性能的方法:

    • 检查您是否在生产模式下运行(这会删除道具验证等内容),并在适用的情况下进行Webpack/Babel优化

    • 渲染页面服务器端,以便IE没有问题(如果您可以在设置中支持SS渲染)

    • 确保渲染不会被多次调用,这样的工具很有用: https://github.com/garbles/why-did-you-update

    • 您使用的任何原因 dangerouslySetInnerHTML ? 如果你拿出 危险的SetInnerHTML 它能显著加快速度吗? 为什么不只是根据一个对象数组(或传递的多维数组)自动生成行和列,我敢肯定,这样React将减少DOM交互(利用VDOM)。这个 <tr> <td> 的将是虚拟dom节点。

    • 使用类似的东西 https://github.com/bvaughn/react-virtualized 高效呈现大型列表

        2
  •  1
  •   Nate    9 年前

    在黑暗中拍摄:尝试不渲染或不显示,直到一切都完成。

    • 使表格元素显示:在完成之前不显示
    • 在屏幕外渲染
    • 在一个隐藏溢出的小DIV中
    • 甚至输出到一个巨大的HTML字符串,然后在完成后将其插入DOM。
        3
  •  0
  •   hazardous    9 年前

    除了@Marty的高分 dynaTrace 会话以查明有问题的代码。它可以让你更好地了解瓶颈所在。它的结果通常比IE开发工具更有用。

    免责声明-我与dynaTrace团队没有任何联系。