具有大型数据集的组件仅在 IE11/Edge 上运行缓慢
Components with large datasets runs slow on IE11/Edge only
请考虑下面的代码。 <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团队没有任何联系。
- 锚点元素不't使用svg时,请打开EDGE上的href
- 如何在Edge中下载图像/png数据URI
- Adobe Edge:动画完成时添加onComplete处理程序
- IE11中的第二个调用取消了第一个Fetch API调用
- Tab键不会't继续chrome/IE11中的表单字段
- 具有大型数据集的组件仅在 IE11/Edge 上运行缓慢
- 使用javascript|IE11下载base64数据
- 是否可以使用“;document.all”;在IE11中,而不改变每次使用
- IE11在javascript中定义类时给出SCRIPT1002错误
- 谷歌地图需要很长时间才能在ie11中渲染
- 如何使用javascript操作SVG节点,使其在MS Edge中工作
- 如何在Microsoft Edge中发布AudioContext
- TinyMCE无法在IE11中上传图像
- 防止默认'F1'iE11中的事件
- IE11 Edge JavaScript 已弃用和过时的功能
- 使用.sort()和.data()对IE11和Edge中的HTML元素进行排序
- 如何防止IE11和Microsoft Edge积极限制事件
- 即使我将http-equiv=X-UA-Compatible强制为IE=Edge,数据也无法在ie11中呈现
- Microsoft Edge和IE11的CSRF问题
- Edge和IE11中的CSS转换不起作用