立即领取|华润集团、宁德核电、东风岚图等 20+ 标杆企业数字化人才培养实践案例 了解详情
写点什么

深刻理解 React(一)

  • 2019-08-21
  • 本文字数:2994 字

    阅读完需:约 10 分钟

深刻理解 React(一)

首先,我们来看看 React 在世界范围的热度趋势,下图是关键词“房价”和 “React” 在 Google Trends 上的搜索量对比,蓝色的是 React,红色的是房价,很明显,人类对 React 的关注程度已经远远超过了对房价的关注。


从这些数据中,大家能看出什么?


可以很明显的看出,我在一本正经的扯淡。




从 2014 年到现在,React、jQuery 和 Angular 的热度趋势对比,可以很明显的看到(上图),React 在全球的热度趋势增长非常快。



上图是 React 在国内的百度搜索指数,是拿 React 和 Nodejs 做了个对比,可以看出 React 的关注度也已经逼近 nodejs。


虽然在关注总量上 React 还远不及 jQuery 和 Angular 等等,但它的增长幅度超乎你想象,你知道这意味着什么吗?这意味着关注 React,你就比大多数人走在了业界的前沿!


那么 React 到底是什么鬼?



引用官网的简介,“一个用来构建用户界面的 javascript 库”。


React 起源于 Facebook 的内部项目,因为 FB 对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站。做出来以后,发现这套东西很好用,就在 2013 年 5 月开源了。


由于 React 的设计思想极其独特,属于革命性创新,性能出众,代码逻辑却非常简单。所以,越来越多的人开始关注和使用,认为它可能是将来 Web 开发的主流工具。


和 Backbone、Angular 等 MV* 框架不一样,它只处理 View 逻辑 ,它只处理 View 逻辑,它只处理 View 逻辑。所以如果你喜欢它,你可以很容易的将它接入到现有工程中,然后用 React 重写 HTML 部分即可,不用修改逻辑。


我们看看大牛们怎么说——



大牛们对新技术的跟进速度总是非常快的,不过话说 React 出来也已经 2 年了,其实并不算什么新技术了。



React 这么火,那么它到底有什么牛逼的地方?



上图是 2015 年年初的数据



这是 Facebook 的好友动态页面,也是 Facebook 访问量最大的页面没有之一,通过 Chrome React 插件可以看到这个页面确实是用 React 实现的。



这些是使用了 React 的一小部分站点,太多了放不下。



前面给大家来了一波前戏,相信大家已经有点迫不及待了,那么,进入正题:


首先,先跟大家描述下 React 最特别的部分,听完这部分大家基本就能够在脑海里建立起一个 React 的大致印象。


然后是 React 的核心内容,听完这部分大家待会回去就可以开始写代码然后今天晚上发布上线了。


最后是 React 能够给我们实际带来的价值,我们不作无意义的重构。


首先,我们来看 JSX——




我们先说说模板。


HTML 模板有很多种编写方式,这是一种。



还有这种。



还有多年前流行的 script 标签模板。


这种运行时编译的模板调试起来比较困难,尤其是出现错误时,很难定位,如果要定位,需要做很多额外的工作,麻烦。



近两年构建工具的流行,很多团队已经在使用 grunt 等构建工具来预编译模板,从而简化模板开发,提高运行效率,减少维护成本。



JSX 使用的也是预编译模板,和前面看到的没什么差别,细心的同学会发现好像只是没有字符串引号了而已。


React 提供了一个预编译工具,叫 react-tools,可以通过 npm 命令安装,一般是在开发时期运行,运行后它会启动一个监听程序,实时监听 JSX 源码的修改,然后自动编译为 JS 代码。


大家留意下,里面的 UL LI 被编译成了 React.createElement(),它这么做,目的就是为了实现 虚拟 DOM。


JSX 还支持运行时编译,但是为了推荐大家用预编译,所以我不打算告诉你们运行时编译怎么做。


OK,祝贺大家已经精通了 JSX。


(BTW:导出图片以后没有价值 1 块 5 的特效了,凑合着看吧)



接下来我们来了解 React 最大的亮点 —— 虚拟 DOM。



传统 web app 和 DOM 直接交互,由 App 来控制 DOM 的构建和渲染、元素属性的读写、事件的注册和销毁等等。


当新产品刚上线的时候,这种做法看起来也挺好。但随着产品功能越来越丰富、代码量越来越多、开发团队人员越来越多——



一年后



你的代码可能会变成这样。


当然,合理的代码规划能够避免这类问题,但团队里难免会有擅长屠宰式编程的同学,分分钟把你代码改成这样。


这时,React 的虚拟 DOM 和单项数据流就能很好的解决这个问题。



虚拟 DOM 则是在 DOM 的基础上建立了一个抽象层,我们对数据和状态所做的任何改动,都会被自动且高效的同步到虚拟 DOM,最后再批量同步到 DOM 中。



虚拟 DOM 会使得 App 只关心数据和组件的执行结果,中间产生的 DOM 操作不需要 App 干预,而且通过虚拟 DOM 来生成 DOM,会有一项非常可观收益——性能。



所有人都知道 DOM 慢,渲染一个空的 DIV,浏览器需要为这个 DIV 生成几百个属性,而虚拟 DOM 只有 6 个。demo


所以说减少不必要的重排重绘以及 DOM 读写能够对页面渲染性能有大幅提升。


那么我们来看看虚拟 DOM 是怎么做的。React 会在内存中维护一个虚拟 DOM 树,当我们对这个树进行读或写的时候,实际上是对虚拟 DOM 进行的。当数据变化时,然后 React 会自动更新虚拟 DOM,然后拿新的虚拟 DOM 和旧的虚拟 DOM 进行对比,找到有变更的部分,得出一个 Patch,然后将这个 Patch 放到一个队列里,最终批量更新这些 Patch 到 DOM 中。


这样的机制可以保证即便是根节点数据的变化,最终表现在 DOM 上的修改也只是受这个数据影响的部分,这样可以保证非常高效的渲染。


但也是有一定的缺陷的——首次渲染大量 DOM 时因为多了一层虚拟 DOM 的计算,会比 innerHTML 插入方式慢。



几个 UI 组件的渲染性能对比 demo



一个最基本的 React 组件由数据和 JSX 两个主要部分构成,我们先来看看数据。



这是一个简单单完整的 React 组件【类】,细节大家先不用太在意细节,了解机制就可以。


props 主要作用是提供数据来源,可以简单的理解为 props 就是构造函数的参数。


state 唯一的作用是控制组件的表现,用来存放会随着交互变化状态,比如开关状态等。


JSX 做的事情就是根据 state 和 props 中的值,结合一些视图层面的逻辑,输出对应的 DOM 结构。



前面我们知道了一个简单的组件的构成,但单个的组件肯定不能满足实际需求,我们需要做的是将这些独立的组件进行组装,同时找出共性的部分进行复用。



我们拿大家熟悉 KM 首页来进行示例,大的模块有中心主体区域,左侧有 K 吧列表、应用列表等,可以看出,里面的


都是最细粒度的组件,是可以复用的。


首先,我们来看下 Article 的代码——



这个就是我们分解出来的 Article 组件,它需要 2 个属性,article 对象和 showImage。article 对象包含图片、地址、标题、描述信息,showImage 是一个布尔类型,用来判断是否需要显示成一个图片。


这个组件本身的实现可以很简单也可以很复杂,但使用者可不关心你的内部实现,使用者关心的是组件需要什么参数就可以了。


外国人的组件化思想比我们国内的普及程度高很多,不只局限于软件开发,包括实体行业的咖啡机、加油站、 儿童摇摇车都有这种设计思想在里面。



希望大家在设计模块的时候,也尽可能将组件逻辑对外透明,来减少维护成本。



我们继续看 KM 的热点区域,大家留意一下标虚线的部分,这里复用了 Article 组件。这时的 Article 组件看起来就是一个普通的标签而已,简单吧。



这个是热问组件,也复用了 Article 组件。


这就是 React 如丝般顺滑的组件复合。


作者介绍:


左明,企鹅电竞前端团队 leader,腾讯高级工程师。从事 web 开发超过 8 年,主导过微云 web 版、腾讯云助手、手 Q 游戏公会、企鹅电竞 App 等项目,有丰富的前端架构经验。


本文转载自公众号小时光茶舍(ID:gh_7322a0f167b5)。


原文链接:


https://mp.weixin.qq.com/s/HirCyizcNh7IrJWawUQlNg


2019-08-21 15:423232

评论

发布
暂无评论
发现更多内容

华为18级大牛整理总结:微服务设计和分布式服务框架原理实践文档

爱好编程进阶

Java 面试 后端开发

哪路神仙写的421页MySQL高级笔记,涵盖MySQL所有技术!太香了

爱好编程进阶

Java 面试 后端开发

刚拿的字节跳动offer“打水漂”

爱好编程进阶

Java 面试 后端开发

大爆料!Github上100%好评的Java多线程池面试题

爱好编程进阶

Java 面试 后端开发

诚邀报名丨首期OpenHarmony开发者成长计划分享日

OpenHarmony开发者

OpenHarmony

18张图,详解SpringBoot解析yml全流程

码农参上

springboot 配置文件 4月月更

LAXCUS分布式操作系统冗余容错之节点篇

LAXCUS分布式操作系统

分布式系统 冗余 集群容灾

为拿几家大厂Offer,“闭关修炼

爱好编程进阶

Java 面试 后端开发

别找了,这是迄今为止把微服务讲的最清楚的一篇!没有之一

爱好编程进阶

Java 面试 后端开发

大数据基础处理框架

爱好编程进阶

Java 面试 后端开发

如何在面试中机智的展现架构能力?

非凸科技

rust 编程语言 量化 构架师 互联网大厂

移动平台WorkPlus集成化办公,打造企业全场景业务生态

WorkPlus

你知道Java是如何解决可见性和有序性问题的吗?

爱好编程进阶

Java 面试 后端开发

图文并茂 教你在IDEA中如何一键生成代码,提高开发效率!

爱好编程进阶

Java 面试 后端开发

并发工具之Semaphore与Exchanger

爱好编程进阶

Java 面试 后端开发

netty系列之:netty中常用的字符串编码解码器

程序那些事

Java Netty 程序那些事 4月月更

你必须懂也可以懂的微服务系列三:服务调用

爱好编程进阶

Java 面试 后端开发

单例模式你不得不知道的底层原理

爱好编程进阶

Java 面试 后端开发

大量示例彻底搞懂Linux查找,which,whereis

爱好编程进阶

Java 面试 后端开发

工作总结!日志打印的15个建议

爱好编程进阶

Java 面试 后端开发

Oceanbase 和 TiDB 粗浅对比之 - 执行计划

TiDB 社区干货传送门

为什么switch里的case没有break不行

爱好编程进阶

Java 面试 后端开发

CDF全球调查:软件交付性能停滞不前

SoFlu软件机器人

字节奋战7年,回头一看只剩下这份1857页的算法笔记了

爱好编程进阶

Java 面试 后端开发

未来的手机操作系统在智能化上会有哪些突破

InfoQ IT百科

终于有人讲明白了!原来这才是全球低时延一张网技术

华为云开发者联盟

音视频 华为云 实时音视频 低时延

不同研发协作模式在云效中的应用

阿里云云效

云计算 阿里云 云原生 研发 研发协作

观测云登陆阿里云计算巢,共建ISV新生态

观测云

可观测性 可观测

洞见科技首批通过央行国家金融科技测评中心「联邦学习」产品评测,实现「MPC+FL」金融应用双认证

洞见科技

联邦学习 隐私计算 多方安全计算

如何优化前端页面的LCP?

BUG侦探

前端 性能 网页指标

历经4轮2小时,终于斩下美团offer!

爱好编程进阶

Java 面试 后端开发

深刻理解 React(一)_语言 & 开发_左明_InfoQ精选文章