React Virtual DOM、Ember Glimmer和Incremental DOM技术哪家强_virtual dom incremental dom-程序员宅基地

技术标签: RIA  

原文链接React Virtual DOM vs Incremental DOM vs Ember’s Glimmer: Fight 
TooNaiveMan 翻译于2015/12/3


本文将探索3种构建动态DOM的技术,并通过一些基准测试对比3种技术的性能快慢,最后我会给出在项目中哪种技术更加适合以及为什么。
介绍
现在已经有许多DOM操作的框架和类库。在这些类库之中,专注于性能而被关注最多是React.js,Ember.js以及最新的Incremental DOM。React和Ember已经远不是简单的对DOM进行构建/更新,而Incremental DOM 专注在构建DOM树和动态更新。下面将对比测试这三个类库的快慢。

在深入细节之前,非web开发者可能会问什么是 DOM 操作,这里简单介绍一下。网页实际上是由不用元素构成的一个树形结构。元素按照HTML规范定义工作。通过组合这些元素,我们可以构建任意复杂的网站。而DOM树就是一个树形HTML元素的抽象表示,它由W3C规范定义并且被所有主流浏览器实现支持。

除了帮助将模型绑定到视图,这些类库能高效更新DOM,一般情形下的多次DOM操作会被自动合并成单次(或更少)的调用。比如某一次操作需要进行:

  1. 删除元素

  2. 添加元素

  3. 改变添加元素的属性

通过DOM接口进行如上操作会导致高开销的内容重新绘制和布局。通过虚拟模型就可以把上述分次操作合并成一次。

模板

用模板技术生成DOM很流行。开发中通过模板语法告诉编译器生成DOM树(或者HTML文档)。模板技术可以是HTML的扩展或者是全新设计语法。

本文介绍的三种技术并非都用了模板。比如React使用了JSX:一种Javascript的拓展语法,通过预编译的方式支持在Javascript里面插入类HTML的代码。然而Ember使用了一种叫Handlebars的模板语言。
Incremental DOM 并没有偏向特定的模板引擎,然而,Google赞助一个名叫Closure templates 的项目将被支持,Incremental DOM还可以和superviews.jsstarplate甚至JSX一起工作。

React.js 的虚拟DOM

React开发者对DOM操作引擎命名为虚拟DOM,她通过一系列的Javascript调用告诉类库生成一个内存的DOM树并且和数据的变动同步起来。虚拟DOM的核心是智能差量算法(smart deffing algorithm):当数据模型变动更新到内存DOM树上时,算法会生成同等效果,但最小需要更新DOM树的指令。所以在不同的状态下有两份内存DOM树。

声明:本文一些图出自:[excellent post explaining DOM manipulation libraries](http://teropa.info/blog/2015/03/02/change-and-its-detection-in-javascript-frameworks.html)
优点
  • 差量算法高效快速

  • 前端支持多种语法(JSX,hyperscript)

  • 对移动设备足够轻量

  • 发展迅速,关注度高

  • 可以脱离React使用(仅仅使用引擎)

缺点
  • 内存DOM导致高内存消耗

  • 没有区分静态和动态元素*

React最近在实现一个通过检测不变量来减少需要做差量化比较的元素。

Ember.js 的Glimmer

Glimmer是Ember.js最近的模板引擎,她借鉴引入了React的虚拟DOM技术同时保持了接口的一致性。需要指出的是开发者重写了整个引擎,并没有和虚拟DOM共享代码。

Glimmer区分了**静态****动态**的组件,因此减少了需要检测的元素数量。这个区别得益于handlerbar引擎的高表述性。
Glimmer另外区分其他方案的关键实现是对于元素节点的存储和比较,是被存放在一个简单的流对象(就是一个简单的对象队列)而不是完整的类DOM节点。这样如果要计算下次需要更新的节点,只要比较节点的值是否改变,如果没有改变就不需要进行下一步操作。

优点
  • 高效快速的比较算法

  • 引擎区分静态和动态元素

  • 100%对Ember接口兼容(现有Ember用户不用改变代码)

  • 轻量化DOM的内存表达方案

缺点
  • 之能在Ember使用

  • 只有一种前端选择

Incremental DOM

相比而言,Incremental DOM尝试通过简单的方案:与其维护DOM树完整的、或者轻量话的内存拷贝,当数据改变的时候,Incremental DOM直接在真正的DOM元素上做比较。大家可能问为什么,如果就这么简单那为什么其它技术没有采用这种方案。简单的说:所有的方案都是在内存和速度上做一个权衡。而Incremental DOM,通过去除DOM树拷贝来减少内存的占用,实际上确实脏检查导致了性能下降。节省的内存对于手机或者其他内存宝贵的设备来说非常关键。大家可以关注我的另一篇博文:our article on Incremental DOM

优点
  • 减少内存占用

  • 接口简单明了

  • 容易集成到其它的前端框架(当然需要一开始就以它作为后端引擎)

缺点
  • 速度相对较慢(这个是有争议的,看下面的测试结果)

  • 关注度和社区使用较少

性能测试

我们选择这篇博文里的 dbmonster test app来做测试。Dbmonster是针对数据库集群行为的场景模拟出在table里面进行大量的行更新,一来是被开发出来测试Ember的性能的程序。我们使用了最新的React,Ember 1.x 和 2.x(都使用了Glimmer)和Incremental DOM。所有的测试都跑在Linux环境的Chromium 46(Core i5-5200U CPU)。每种测试跑5遍然后取平均值。

在有大块和小块垃圾收集的场景中。Incremental DOM表现出了预期的高效。React紧随第二但是在琐碎垃圾收集场景中大幅落后Incremental DOM。有意思的是Ember 1 到 2 的改进还是比较大的。

Ember在布局和绘画操作中所花时间这个场景中表现突出。Incremental DOM由于牺牲性能获取内存,不出意料的排在最后。React目前来看比较平衡。

这特图标显示出Chrome的丢帧数(不响应导致的停止绘画)。丢帧的结果是帧率低和画面停顿感。在这个场景中,Incremental DOM再次突起,更少用于处理GC的时间片段使得用户绘画的时间更多。React和Ember紧随其后。
一个没有反应在图标中的有趣的现象是,主观上会感觉Incremental DOM的响应更快。通过观察收集的数据,发现Incremental Dom相比对比技术的Javascript操作更少。当然,这和Incremental DOM是一个单纯的DOM操作类库,而React和Ember处理的东西更多:时间,数据传输等等。一个不用React的虚拟DOM的测试会很有意思。
我们看看最后完整总结的结果

这里有测试所用的代码。你需要安装ChromeDriver和所有Node.js的依赖(json2csv,brower-perf),然后运行命令 node run-benchmarks.js 。最后的测试结构卸载data.json(完整)和results.csv(总结)。

题外话:在Auth0使用React.js

在Autho,我们一直在评估最适合我们的技术。我们用React.js开发了 Passwordless Lock library。因为React没有对model技术的依赖使得它成为我们最好的选择,在其他方面,React在速度,内存占用,集成难度和文档、支持取得了一个很好的平衡。

注册使用我们的Passwordless Lock library或者看看代码
结论
虚拟DOM,Glimmer和Incremental DOM都是动态操作DOM树的优秀方案。React.js的快速发展和轻量化是许多项目的不二选择。虽然高内存占用对于内存吃紧的移动设备上运行的大型网站会有问题,但是随着移动设备的硬件发展,这个问题正在逐步淡化。Incremental DOM花小钱办大事的效果让人眼前一亮,我们期望她能集成到Closure和其他库中。React和Ember在各自的实现方法中取得了很好的平衡。
当选择这几个技术的时候,最好关注技术的成熟度和是否容易集成。除非你对DOM的操作巨频繁(意思就是一般情况下,性能问题没那么突出),如果这样,请仔细的研究播客的结果并且针对你的场景生成测试数据。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yczz/article/details/51494762

智能推荐

CH340系列介绍和STM32的BOOT模式选择烧录模式_ch340n-程序员宅基地

文章浏览阅读6.2k次,点赞7次,收藏33次。STM32入门必须要了解的知识。_ch340n

谷歌云盘将共享链接中的文件保存到自己的云盘中_谷歌云盘怎么保存别人分享的文件-程序员宅基地

文章浏览阅读1.5w次,点赞3次,收藏17次。如何将别人共享的谷歌云盘文件复制到自己的云盘?问题介绍工具使用问题介绍谷歌云盘google drive在接收别人共享的文件时,文件的所有者是原作者,被共享者虽然暂时是可以正常访问该文件的全部信息,但是一旦原有作者删除该文件,被共享者就不能够再访问该文件,因此此时需要将该文件复制到自己的云盘中,以防止内容过期。工具Google colab使用1、首先将分享文件的快捷方式添加到 My Drive 中2、进入google colab,绑定谷歌云盘,黑框所示,第三个图标(可能右侧会提示运行一个代码块_谷歌云盘怎么保存别人分享的文件

uniapp 实现app版本更新_uniapp封装js版本号更新-程序员宅基地

文章浏览阅读529次。在显示版本信息页面,增加点击事件,点击时调用检测版本方法。在登录成功以后调用之前写好的检测版本的js;在onLaunch周期里面更改为true;在登录界面获取这个变量,并更改为false。至此登录检测更新就可以了。_uniapp封装js版本号更新

局域网唤醒计算机,电脑远程开机_局域网唤醒电脑 | 茶杯猫-程序员宅基地

文章浏览阅读4.9k次。需要从你家的另一个房间快速打开你的电脑吗?有了局域网唤醒,你就可以了。下面是如何设置它以及为什么要使用它。有没有想过你可以把电脑从睡眠模式中唤醒,而不必费力地走过去,按下电源按钮?Wake-on-LAN允许您使用其网络连接打开计算机,因此您可以通过轻触按钮从家中的任何位置启动计算机。例如,我经常使用Chrome远程桌面访问楼上的工作站。但如果我的工作站在睡觉,我不需要上楼去打开它。LAN唤醒允许我..._局域网唤醒电脑开机

报名PMP考试需要满足哪些条件?-程序员宅基地

文章浏览阅读227次,点赞6次,收藏4次。项目经验这一点,PMP报考人员是需要有项目管理经验,而所说的具有多少小时的项目管理经验,指的是项目相关经验,比如参与项目研发、测试、交付、运维、技术支持、售前等,这个项目经验也是一个国际上的广义概念,万事皆成项目,做的任何工作都可以规划成是项目。

720云手机电动云台全新上市,让手机能自动拍摄亿万像素VR全景-程序员宅基地

文章浏览阅读638次,点赞21次,收藏14次。除了VR全景拍摄模式,720云手机电动云台还具有3D物体摄影、延时摄影的功能,亦可充当普通视频拍摄的稳定器。通过720云手机电动云台,希望为不同行业需要进行VR全景影像采集、VR全景营销宣传、VR展厅、VR全景工程等需求,提供一个简单、高效、可靠的全景拍摄解决方案,让每个人都能够轻松将VR全景这一独特的视觉技术运用到工作与生活之中。720云的手机电动云台,以其极简操作,超强的亿像素拍摄能力、坚固轻便的设计、极致的使用便捷性,为追求高质量全景图像的专业摄影师和爱好者带来了全新的创作体验。

随便推点

自动更新Android应用后, app 进入后台重进会重启_安卓app每次启动会检测更新并自动更新后提升重启-程序员宅基地

文章浏览阅读4.2k次。[转]从Installer直接打开应用程序会出现Android系统bug2014-12-16阅读194 评论1问题现象:用Android系统自带的Installer安装完应用后,会有以下两个不同表现:1,用户直接在installer界面打开应用。然后按home键后台运行,此时如果再点击该应用的launcher图标或者快捷方式进入,会发现该应用又会从该应用第一个页_安卓app每次启动会检测更新并自动更新后提升重启

Vue--》超详细教程——vue-cli脚手架的搭建与使用_vue-cil脚架-程序员宅基地

文章浏览阅读4.4k次,点赞69次,收藏72次。它简化了程序员基于webpack创建工程化的Vue项目的工程。其好处就是简省了程序员花费时间去配置webpack,从而目标只需专注在撰写项目应用上。,基于vue-cli这个系统,我们就可以快速搭建好“(英文名:Singleagepplication)简称SPA,顾名思义指的是,所有的功能与交互都在这唯一的一个页面内完成。_vue-cil脚架

python给游戏增加音效-程序员宅基地

文章浏览阅读256次,点赞2次,收藏2次。模块在播放音效时可能会占用一定的系统资源,特别是在同时播放多个音效时。如果你的游戏需要频繁播放音效,你可能需要考虑优化音效管理,例如使用音效池或限制同时播放的音效数量。在上面的代码中,我们在射击时播放射击音效,在敌人被击中时播放爆炸音效。你可以根据游戏的实际情况在其他事件(如玩家死亡、关卡开始等)中添加音效播放。替换为你的音效文件的实际路径。如果你的音效文件是其他格式,确保它们与。Kimi: 为了增加音效播放功能,你需要首先确保你的音效文件(例如。格式)已经准备好,并且放在你的项目目录中。

深度网络二手市场在线推荐-程序员宅基地

文章浏览阅读78次。这篇文章的一个启发点是使用Siamese网络和注意力模型将不同类别的特征集成,从而解决数据缺失的问题,然而文章中没有具体讲出注意力模型的参数是如何训练的,即模型上层如何得知下层不同子模型的数据是否缺失,是通过逻辑判断?还是直接用0值训练?或者用各模型的数据单独训练注意力参数?原文地址 https://arxiv.org/abs/1809.02130本文地址:https://www.c..._二手交易平台分类深度学习

CS229吴恩达机器学习入门(全部编程习题的matlab答案\包含原始课件\做过标记的课件\上课网站\习题网站\自己总结的笔记)_cs229习题-程序员宅基地

文章浏览阅读1.7k次,点赞5次,收藏38次。吴恩达机器学习入门,十分适合第一次接触机器学习,或者想为深度学习打基础的同学。大家可以现在coursera上注册一个账号,可以设置每周的学习进度,有每章相应的课后习题和八个编程作业,可以提交编程作业来检查做的对不对,全部完成后会得到徽章,有几个题目图片https://www.coursera.org/learn/machine-learning/home/info刷新不出来,可以科学上网后就可以看到了。coursera网站:https://www.coursera.org/learn/machine_cs229习题

javaweb面试题(全)_web编写代码输出如下内容 姓名 小明 学号 001 性别 男 java 100的表格-程序员宅基地

文章浏览阅读1.2w次,点赞10次,收藏65次。目录1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?............82、Java有没有goto?.................................................................................................83、说说&和&&的区别。............._web编写代码输出如下内容 姓名 小明 学号 001 性别 男 java 100的表格

推荐文章

热门文章

相关标签