从渲染原理到性能优化.

Slides:



Advertisements
Similar presentations
Are you ready? Go!!. 暴走五周年 - 筹款多 新招 首页 “ 筹款工具 ” 筹款利器: “ 爱扑满 ” 盒子.
Advertisements

第一章 餐饮服务程序 学习目的: 掌握餐饮服务四个基本环节的内容 正确表述和运用各种餐饮形式的服务程序 熟悉并利用所学知识灵活机动地为不同需求的 客人提供服务.
經濟學報告 小組成員 一年忠班周士堯. 林彥儒. 紀丞祐. 葉利德. 討論問題 1. 上學為什麼要穿制服 ?? 2. 為什麼國片不賣作 ?? 3 網路就可以看到的小說為甚麼還有人會去 買實體書 ??
2013年华兴教育 广州中考志愿填报分析.
第九课 第二框 建设社会主义精神文明.
举国上下抗击风雪灾害专刊 温暖行动 灾情告急年关近 万众一心齐抗灾 可歌可泣留千古 温暖行动遍人间 导读提示 阳关雨露出版社
眼影的学习.
让我们撑起一把青春伞.
让 我 们 撑 起 一 把 青 春伞.
第六章健康教育 神木职教中心医学系.
會計資訊系統 專章A.
第三章 調整與編表.
作文选刊 作文之窗
校园信息管理系统 河北科技大学网络中心 2000/4/10.
兒童及少年保護宣導 和興國小校長 吳柚 中華民國 100 年 8 月 31日 2008張淑慧.
快乐假期 2010年第6期 总第54期 贝尔芬 主编 暑期作文专刊 《快乐假期》杂志社 出版.
新进人员成果交流汇报 规划计划处 俞深彦 2014年8月
全国国际商务英语考试(一级) 口试操作流程 全国国际商务英语考试中心 中国国际贸易学会商务专业培训考试办公室 2016年
石家庄迅步网络科技有限公司 联系人:张会耀 电话:
第12讲 Javascript 复习 信息学院 孙辉.
老师:如何撰写教研文章? 主讲:石修银 谨以此赠与孜孜追求的老师 谨以此赠与改变人生的老师.
第九章日治時期的台灣(下).
消 息 制作教师:程焕新 湖北省黄冈高级技工学校.
徵收苗栗市福全段147、1588及文心段10、11地號等4筆土地之
依“标”据“本”,命制考题 发表于《数学教学》2006年第9期 (华东师大核心“CN”刊物)
类 别 发 展 成 就 农业 的 发展 手工业的发展 商业的 繁荣 粮食作物 经济作物 纺织业 制瓷业 造船业 商业都市 对外贸易 货币
12星座 对于星座,你又知道多少呢? 第一刊.
讲 义 大家好!根据局领导的指示,在局会计科和各业务科室的安排下,我给各位简要介绍支付中心的工作职能和集中支付的业务流程。这样使我们之间沟通更融洽,便于我们为预算单位提供更优质的服务。 下面我主要从三方面介绍集中支付业务,一是网上支付系统,二是集中支付业务流程及规定等,
技术试验及其方法 制作者 : 贾琼瑞
中鸣虚拟搜救比赛项目 (一人) 现场主题创作(40%)(一人) 3D虚拟搜救(60%)(一人).
中国人民公安大学经费管理办法(试行) 第一章总则 第四条:“一支笔” “一支笔”--仅指单位主要负责人。负责对本 单位的经费进行审核审批。
浏览器工作原理浅析 TID Ghostzhang.
第三章 使用XMLHttpRequest对象
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
数学通报简介 ——如何写稿及投稿 数学通报 郑亚利 2014年8月.
项目二 讲求工作质量 做到诚实守信 一、职场困惑 情景案例一
强化感恩意识 感恩之心,是人们感激自然、社会、他人对自己所施恩惠并设法报答的内在心理要求。
No Zuo No Die Why Not Try ? ——做更好的前端 技术中心 黄家权/mss.
美丽全方位 优雅仪态篇.
走向自立人生 自己的事情自己干 一、自立人生少年始. 走向自立人生 自己的事情自己干 一、自立人生少年始.
推进《玻璃钢制品工》 国家职业资格证书制度的建设
本期导读: 1版 习 惯 2版 的 十个做人的好习惯 3版 力 4版 量 5版 6版 7版 8版
認識同志伴侶 劉安真 弘光科技大學通識教育中心助理教授.
前不久看到了这样一则报道:某个大学校园里,一个大学生出寝室要给室友留一张字条,告诉他钥匙放在哪里。可是“钥匙”两个字他不会写,就问了其他寝室的同学,问了好几个,谁也不会写,没办法,只好用“KEY”来代替了。 请大家就此事发表一下自己看法。
祖 父 母 節.
用智慧塑造形象 以修炼打造“合金” ——谈学生干部的形象塑造与核心竞争力
四 VBScript编程基础.
利用共同供應契約 辦理大量訂購流程說明.
ASP VBScript 基础知识.
PHP 5 入門基礎 第一個PHP 程式 PHP 資料型態.
对ReactJs的认知.
计算机网络与网页制作 Chapter 11:用CSS作页面布局
用牛顿环测量透镜的曲率半径 华中农业大学应用物理系 物理实验教学中心
Java Server Faces 参考书籍 Java Server Faces 核心编程.
2-2基督教會與中古歐洲 一.基督教的興起與傳播 二.教會⇔中古西歐文化 三.東正教⇔拜占庭 本節學習重點 重點追追追…… (一)教會&教宗
南宁翰林华府 ——地中海风格与现代住宅的融合.
微信商城系统操作说明 色卡会智能门店.
破除養生迷思 現代人重視養生保健,但道聽塗說或斷章取義的流言很多,甚至有許多人深信不移。 我們請榮新診所副院長何一成,以及中醫師吳明珠 就門診中最常被詢問的錯誤養生法,一一解答,並請這2位醫師提供他們自己的養生法。
第三章 世界文明的蛻變與互動 第一節 歐洲社會的蛻變 第二節 世界文明的交匯 第三節 亞洲大帝國的發展 1.
兒童及少年保護、 家庭暴力及性侵害事件、 高風險家庭 宣導與通報
教育部特殊教育通報網 學生異動、接收操作說明.
气相色谱仿真实验 湖南科技学院 化学与生物工程学院.
React.js.
蔺华 ISV开发合作经理 平台及开发技术部 微软(中国)有限公司
大綱 一.受試者之禮券/禮品所得稅規範 二.範例介紹 三.自主管理 四.財務室提醒.
《商業周刊》1000期封面故事 快樂國 不丹 這裡,不追求經濟成長率, 追求「快樂成長力」!.
03/03/2019 豐盛生命的呼召 楊知予長老.
Section 2-2: 4 (6), 7, 12 (14), 13, 18 (16), 21, 25, 28, 30, 36, 46, 48, 50, 54a Section 3-1: 4 (2), 5, 10, 15, 20, 29, 32 Section 4-1: 3, 7, 8,
银川社保网上申报 宁夏人力资源和社会保障 网上服务大厅操作
第四章 買賣業會計.
Presentation transcript:

从渲染原理到性能优化

黄琼(daisyhhuang) 腾讯前端工程师,IMWeb团队成员 企鹅辅导 IMWeb 社区 邮箱:daisyhhuang@tencent.com 微信:you-qiong-yue

一、JSX如何生成element 二、element如何生成真实DOM节点 三、性能优化 四、React 16异步渲染方案

一、JSX如何生成element 二、element如何生成realDOM 三、性能优化 四、React 16异步渲染方案

JSX return( React.createElement( 'div', { className: 'cn' }, Header, null, 'Hello, This is React' ), 'Start to learn right now!' 'Right Reserve' )) return( <div className="cn"> <Header> Hello, This is React </Header> <div>Start to learn right now!</div> Right Reserve. </div> ) Babel createElement的作用是生成element, 参数如下 1、type 2、attributes,如果没有的话,可以 为null 3、children

React.createElement 何时被执行? {   type: 'div',   props: {     className: 'cn',     children: [       {         type: function Header,         props: {           children: 'Hello, This is React'         }       },         type: 'div',           children: 'start to learn right now!'       'Right Reserve'     ]   } } React.createElement( 'div', { className: 'cn' }, Header, null, 'Hello, This is React' ), ‘Start to learn right now!' 'Right Reserve' ) Render 函数被调用的时候执行

Element Children现在看到有三种类型: 1、String, 2、原生DOM节点的element {   type: 'div',   props: {     className: 'cn',     children: [       {         type: function Header,         props: {           children: 'Hello, This is React'         }       },         type: 'div',           children: 'start to learn right now!'       'Right Reserve'     ]   } } Children现在看到有三种类型: 1、String, 2、原生DOM节点的element 3、React components – 自定义组件的element 不单单是Object类型 4、false, null,undefined,number 5、数组 – 使用map方法的时候

二、element如何生成realDOM 一、JSX如何生成element 二、element如何生成realDOM 三、性能优化 四、React 16异步渲染方案 我们知道React是函数式的UI编程方式,element实际就是描述你想要在屏幕上看到什么。所以我们来看看React是怎么帮助我们把它生成浏览器的真实DOM节点。

初始化element ReactDOMComponent ReactDOMComponent ReactCompositeComponentWrapper ReactCompositeComponentWrapper ReactDOMTextComponent ReactDOMTextComponent ReactDOMEmptyComponent ReactDOMEmptyComponent 私有类: React自己使用,不会暴露给用户,常用方 法:mountComponent, updateComponent等 公共类:自定义的组件

ReactDOMComponent 直接操作浏览器DOM元素 mountComponent(container): 会将element转成真实DOM节点, 并且插入到相应的container里,然后返回markup(real DOM)。 mountComponent(container) { const domElement = document.createElement(this._currentElement.type); const textNode = document.createTextNode(this._currentElement.props.children); domElement.appendChild(textNode); container.appendChild(domElement); return domElement; } { type: 'div', props: { className: 'cn', children: 'Hello world', }

ReactCompositeComponentWrapper mountComponent: 实例化自定义组件,最后是通过递归调用到ReactDOMComponent的mountComponent方法 来得到真实DOM。

首次渲染 Example <div>Hello World!</div>

ReactCompositeComponentWrapper 生命周期函数在哪被调用? React.render(<Example />, container) mountComponent: 1、实例化Example,得到instance对象 2、renderedElement = Instance.render(); 3、初始化renderedElement ,得到child 4、child.mountComponent(container) componentWillMount { type: function Example, props: { children: null } <div>Hello World!</div> componentDidMount { type: 'div', props: { children: 'Hello World' } ReactDOMComponent mountComponent: 根据element来生成对应的真实DOM节点 递归调用 生命周期

渲染更新 props 更新 state

shouldComponentUpdate setState 将传入的state放进pendingState的数组里 是 否 dirtyComponent 当前是否处于批量更新 遍历更新 dirtyComponent ReactCompositeComponentWrapper 生命周期函数在哪被调用? shouldComponentUpdate updateComponent 1、计算出nextState 2、render()得到nextRenderElement 3、与prevElement 进行Diff 比较,更新节点 componentWillUpdate componentDidUpdate ReactDOMComponent updateComponent 用于直接操作更新浏览器DOM元素 生命周期

Diff算法 1、两个相同的组件产生类似的DOM结构,不同组件产生不同DOM结构 2、对于同一层级的一组子节点,它们可以通过唯一的id区分

1、不同节点类型 Tips:保持DOM标签类型的稳定 D A D 更新 B B C C B C

2、相同节点类型 自定义组件 <div className="before" title="stuff”/> <div className="after" title="stuff”/> 自定义组件

3、子节点比较 Tips: 1、保持DOM结构的稳定性 2、map的时候,加key A A B C B D C C

一、JSX如何生成element 二、element如何生成realDOM 三、性能优化 四、React 16异步渲染方案

性能优化 -工具介绍 1、why-did-you-update

性能优化 -工具介绍 2、react-addons-perf

性能优化 1、Mount/Unmount Key 稳定性 - 保持标签的稳定 <div> -> <section> - 保持DOM结构的稳定

是否写组件的时候都直接使用PureComponent? 性能优化 是否写组件的时候都直接使用PureComponent? 2、避免重复渲染 shouldComponentUpdate PureComponent(immutable.js) 分离组件,只传入关心的值 3、使用Pure Functional Component recompose

目前react 性能优化的点主要集中在防止重复渲染,DOM稳定性的 方面: 但是大家看一个问题: B D E F G

一、JSX如何生成element 二、element如何生成realDOM 三、性能优化 四、React 16异步渲染方案

React 16 改动 1、比较阶段 – 可被打断 2、commit阶段 – 不可被打断

Stack reconciler Fiber reconciler 图片来源

React 16生命周期的变化 Phase 1 Reconciliation/render Phase 2 commit componentWillMount componentWillReceiveProps componentWillUpdate shouldComponentUpdate getDerivedStateFromProps Phase 1 Reconciliation/render Phase 2 commit componentDidMount componentDidUpdate componentWillUnmount

getDerivedStateFromProps getDerivedFromProps getDerivedStateFromProps 图片来源

Q & A

拓展阅读 1、function component 九个推荐使用functional component的原因 2、getDerivedFromProps 如何异步渲染开启后,我们要做的改变 你可能不需要使用getDerivedState 3、presentational/container components