当前位置: 首页 > news >正文

Netflix为什么选择使用React来提升用户体验

为了提升用户体验,在线影片租赁提供商Netflix正使用由Facebook开源的React库对其桌面和移动平台进行重大修改。近日,他们在官方博客上发表了一篇文章,阐述了选择React的三个关键因素。

\\

首先是启动速度方面的考虑。为了使用户可以无缝地在浏览内容之间进行切换,他们希望降低初始加载时间。这个时间不仅包括下载和处理初始化标记、脚本和样式表的时间,还包括获取数据的时间。因此,他们希望能够找到一种混合解决方案。该方案允许他们在初次加载时通过服务器端渲染提供一屏显示的静态标记,从而降低上面提到的初始加载操作时间。同时,他们还可以通过客户端脚本启用UI动态元素。

\\

其次是运行时性能方面的原因。为了在Web和iOS平台上创建视觉效果特别丰富的用户体验,高效的UI渲染是关键。即使是在硬件资源限制较小的台式电脑上,一些开销大的操作还是会影响UI的响应能力,尤其是DOM操作所导致的重排和重画会降低用户体验。

\\

最后是模块化方面的需求。为了能够快速地构建出新的功能和设计,他们要求前端必须支持各种A/B测试。比如,有一个测试需要比较9种不同的UI设计。这意味着他们需要在测试期间维护10个视图的代码。那么在测试结束后,将体验最佳的视图产品化以及将其它9个视图的代码清除掉应该很容易就能实现。

\\

React不仅能够满足上述要求,而且还相对比较容易掌握。于是,他们就利用React的下列特性来缩短应用程序的初始加载时间,提高运行时性能,并实现可伸缩性:

\\
  • “同形的(Isomorphic)”JavaScript——使用React可以构建出既能在服务器端运行又能在客户端环境中运行的JavaScript UI代码。借助React,他们可以实现前文所述的混合解决方案。因为React可以在没有“活动DOM(live DOM)”的情况下实现UI渲染,比如,使用React.renderToString或者React.renderToStaticMarkup。\\
  • 虚拟DOM——为了减少DOM操作开销,React将更新应用到虚拟DOM,然后通过diff算法确定DOM操作的最小更新集。这比操作真实的DOM要快很多。而且,使用React就不需要进行传统的数据绑定了。\\
  • React组件和Mixin——React提供了功能强大的组件和Mixin API。他们大量使用了这些API,创建可重用的视图,共享常见功能。当对不同设计进行A/B测试时,他们将视图实现为由父组件渲染的、单独的React子组件。类似地,行为逻辑的差异可以抽象到React Mixin中。\

文章最后写道:

\\
\

React已经超出了我们的需求,为我们创新Netflix体验奠定了坚实的基础。

\
\\

感兴趣的读者还可以看一下Facebook是如何使用React构建原生iOS应用的。


感谢郭蕾对本文的审校。

\

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

相关文章:

  • 微软职位内部推荐-Service Engineer for Office365
  • 电容知识汇总
  • 【SICP练习】24 练习1.30
  • Maven最佳实践:划分模块
  • jquery easy ui
  • ehcache在Jetty容器中的JMX监控设置
  • 小米抢购页面脚本研究
  • SharePoint 2013 状态机工作流之扩展自定义状态
  • 微软职位内部推荐-SENIOR SOFTWARE ENGINEER
  • 如何获得ImageView中src引用的资源ID
  • Ubuntu下ssh登陆出现host can not be established解决
  • netstat如何查看某端口是否被占用?
  • 【转载】关于音乐的流派,分类问题
  • mfs-管理员
  • Android中的Interpolator
  • android 一些 utils
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • Asm.js的简单介绍
  • C# 免费离线人脸识别 2.0 Demo
  • CentOS 7 防火墙操作
  • EOS是什么
  • JavaScript设计模式与开发实践系列之策略模式
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • linux学习笔记
  • node-glob通配符
  • python 学习笔记 - Queue Pipes,进程间通讯
  • React as a UI Runtime(五、列表)
  • SpiderData 2019年2月16日 DApp数据排行榜
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 官方解决所有 npm 全局安装权限问题
  • 简单数学运算程序(不定期更新)
  • 写给高年级小学生看的《Bash 指南》
  • 学习JavaScript数据结构与算法 — 树
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (7)STL算法之交换赋值
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (三)uboot源码分析
  • (轉貼) UML中文FAQ (OO) (UML)
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .gitignore文件设置了忽略但不生效
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .NetCore实践篇:分布式监控Zipkin持久化之殇
  • .NET是什么
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @RestControllerAdvice异常统一处理类失效原因
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • []sim300 GPRS数据收发程序
  • [20140403]查询是否产生日志
  • [android] 请求码和结果码的作用
  • [Android]使用Retrofit进行网络请求