React.js如何使用虚拟DOM加速渲染
How React.js speeds up rendering with a virtual DOM
引用(https://news.ycombinator.com/item?id=9155564)文章
简单的回答是DOM并不慢。添加&删除DOM节点是一些指针交换,只不过是在上设置一个属性JS对象。
DOM瓶颈只是那些导致重绘的东西吗?如果是这样的话,那么React的虚拟DOM中的一个渲染不应该与重新绘制整个组件(当然是在一个浏览器API调用中)的性能相同吗?我认为浏览器执行的算法只是尝试将diff从一种状态重新绘制到另一种状态(可能像git?)。意味着浏览器自己维护一个虚拟DOM。那么,拥有虚拟DOM有什么意义呢?
此外,添加一个display
样式属性设置为none
的元素是否应该不会严重影响性能?我会自己描述这一点,但我不知道该从哪里开始,因为我最近才开始javascript编程。
这个问题对SO来说可能有点宽泛,但作为一般答案,同一篇文章中的其他一些引用也非常相关:
但是,布局很慢
[…]
更糟糕的是,布局是通过访问某些属性来同步触发的
[…]
正因为如此,许多Angular和JQuery代码都慢得离谱
[…]
React无助于加快布局。。。
react的虚拟DOM所做的是计算DOM的一个状态和下一个状态之间的差异,以一种非常智能的方式最小化DOM更新。
因此:
- DOM本身并不慢
- 但是布局很慢
- 并且几乎所有DOM更新都需要布局更新
- 所以DOM更新越少越快
react引擎正是这样做的(与其他几个具有虚拟DOM的工具/库相同)。
关于什么是虚拟DOM及其优势的更多信息,例如,在这里。
Q: "DOM瓶颈只是那些导致重绘的东西吗?"
A:重绘取决于GPU。与DOM更新的速度无关。DOM更新几乎是即时的。一切都取决于影响文档流的更改。如果某个DOM或DHTML更改影响了文档流。受影响的元素离文档元素的根越近,对文档回流的影响就越大。
您不需要为了引起文档回流而更改DOM内容。对给定参数进行简单的样式属性更改可能会促使流中的元素更改位置,从而迫使文档回流。
因此,不,固定大小元素上的DOM更改不会导致文档回流,而显示的更新实际上是即时的。将仅应用于局部受影响的区域,大部分时间在小于300 x 200像素正方形的帧中;一个区域的大小,可以在非常慢的GPU上以超过120fps的速度重新绘制。但这比在电影院里看《复仇者联盟》要流畅5倍。
(流对齐内容中任何空间上不等价的变化都会导致回流。因此,我们必须注意影响浮动元素大小和位置的变化,以及另一个内联元素的长流中内联元素的变化等。)
'
Q: "添加一个显示样式属性设置为none的元素是否会严重影响性能?"
A:这是正确的。将style.display:"none"的元素添加到DOM中不会对文档的现有呈现产生任何更改,因此不会触发文档回流,自然也不会产生任何影响;即:将与向JavaScript对象添加新属性一样快。
谨致问候。
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 如何在DOM元素上按类型构建此函数
- 如何使用jQuery在动画中期加速动画
- Windows形成web浏览器控件和Javascript更改的DOM
- Datatables:通过DOM数据源中的名称引用列
- 在DOM中查找一个模式并替换它's的内容使用jquery
- DOM事件通过JSON转换为java
- 将DOM节点值与字符串Javascript进行比较
- delete在Object上效率低下,但在DOM Element's的数据属性,与null out相比
- 流星中DOM的繁殖
- DOM元素和angular元素之间的主要区别是什么
- 当带有渲染器的DOM元素不在屏幕顶部时,移动了场景的坐标
- 如何将Knockout.JS与服务器已经在DOM中呈现的数据同步
- PHP-如何重定向到同一页面并更改DOM's
- 如何使用ViewCompiler手动编译DOM的一部分
- React.js如何使用虚拟DOM加速渲染
- 加速 Ajax 成功的 DOM 操作
- 我怎样才能加速生成巨大 DOM 的 React render() 方法