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

Components with large datasets runs slow on IE11/Edge only

本文关键字:IE11 Edge 缓慢 运行 大型 数据集 组件      更新时间:2023-09-26

请考虑下面的代码。 <GridBody Rows={rows} />并假设rows.length将等于任何值 2000 或更多,在此示例中每个数组大约有 8 列。我使用此代码的扩展版本来呈现表的一部分,该部分一直阻碍我的 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似乎比Chrome慢P到8秒

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

  • 去除不必要的代码。

  • 将计算时间缩短几毫秒。

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

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

我还没有找到合适的解决方案。我上面所做的操作似乎使IE中的事情变得不那么糟糕,但问题仍然存在,即"现代"或"最新"浏览器仍然慢了3-4秒。

更糟糕的是,这似乎几乎冻结了整个浏览器,并且正在渲染。

TL;dr 如何提高IE和其他浏览器(如果可能的话(的整体性能?

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

编辑:特别是 DOM 访问在 IE 上很慢,因为设置 innerHTML 被调用超过 10.000 次。这在 ReactJS 中可以防止吗?

尝试提高IE性能的方法:

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

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

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

  • 您使用dangerouslySetInnerHTML的任何原因?如果你拿出dangerouslySetInnerHTML它会大大加快速度吗?为什么不根据对象数组(或传递的多维数组(自动生成行和列,我很确定 React 会以这种方式减少 DOM 交互(利用 VDOM(。<tr><td>将是虚拟节点。

  • 使用类似 https://github.com/bvaughn/react-virtualized 的内容来有效地呈现大型列表

在黑暗中拍摄:尽量不要渲染或不显示,直到一切都完全完成。

  • 使表元素显示:无,直到完成
  • 在屏幕外渲染
  • 在一个带有隐藏溢出的微小 DIV 中
  • 甚至输出到一个巨大的 HTML 字符串,然后在完成后将其插入 DOM 中。

除了@Marty的优点之外,还可以运行dynaTrace会话以查明有问题的代码。它应该可以让您更好地了解瓶颈在哪里。它的结果通常比IE开发人员工具更有用。

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