ReactNative 启动优化实践

RN 启动简介

Dive into React Native performance
阐述了基于RN实现的页面各部分加载时间占比图

image

页面加载流程图(引用)

image
image

从业务视角可以归纳为四个部分

  1. Bundle包准备:客户端Bundle包下载、解析等过程
  2. 初始化引擎:引擎准备,RN执行环境
  3. 加载Bundle:引擎加载JS代码
  4. 渲染Bundle:执行JS中runApplication()方法,开始渲染

RN 启动优化实践

包生产

  • 分包
    • 分业务分包:页面维度单独成包,避免大文件包
    • 分层分包:页面和组件拆分,便于复用,同时也减少了整体体积
  • 拆包
    • 一种方案,将一个包整体的index.js,拆分成一个入口+多个子模块,从而实现页面模块维度懒加载功能,减少页面首次加载时间,webpack和react loadable都有提供了切割能力
    • 另一种方案,RAM bundles和内联引用
      • RAM bundles:Indexed RAM Bundle和File RAM Bundle两种实现,将每个模块拆分为独立文件
      • 内联引用(inline requires):内联引用(require 代替 import)可以延迟模块或文件的加载,直到实际需要该文件。
  • 包大小优化

包下载

  • Bundle包缓存策略优化,减少下载时间
    • 核心或者重要页面直接预装
    • 本地增量更新策略
  • Bundle包下载策略优化,根据页面深度区分下载时机,实现延缓下载,减少首次并发下载任务量

包加载

包渲染

  • 数据层
    • 本地化数据优化,数据缓存、前一个页面数据带入后一个数据
    • 数据请求异步加载,且尽可能提前请求,譬如执行js加载到内存
  • 模块层
    • 模块=页面一个个模块,对于复杂或者长的页面,简单理解可以是预先加载可见模块,然后在加载非可见模块。
  • 组件层
    • 减少重复渲染,例如pureComponent、Immutablejs、 列表 & Key、慎用setState
    • 其它React布局和渲染的一些常规优化

列表

官方推出的FlatList及SectionList的一些问题

  • 元素懒加载:元素只有出现在屏幕中,才会被初始化出来。
  • 无复用池机制:且初始化后不销毁:在元素离开可视范围后,会被同尺寸的空白元素替换,但是不会被销毁。另外FlatList中item的viewTree并没有真实复用,随着滚动渲染出来的viewTree越来越多,内存开销过大容易出现OOM
  • 异步渲染:在空白元素滚动到可视区域后,会进行UI渲染,先创建了一个等高空白容器,然后整个cell的viewTree异步渲染完成后再添加到空白容器内。所以快速滑动的时候,由于异步任务堆积,导致无法快速展现出现白屏。

官方对列表的一些配置推荐和实现建议 Optimizing Flatlist Configuration

  • Props
    • maxToRenderPerBatch,最大预加载数,即屏幕外渲染的Item数目
    • updateCellsBatchingPeriod,批量更新Cell周期,即批处理更新时间频率
    • initialNumToRender,初始化最大渲染数
  • List Items
    • 尽可能使用基础组件、轻量化组件,Item尽可能低层级、少逻辑
    • 使用shouldComponentUpdate来优化diff判断,从而减少重复渲染
    • 图片控件缓存优化,例如推荐react-native-fast-image优秀的图片控件
    • 通过getItemLayout告知高度,减少layout时间
    • 使用 列表 & Key,加速更新Diff计算
    • 避免匿名函数,每一个函数是一个新的对象

列表实践过程中的思考

OOM(增加复用能力)

实现Cell复用:一种思路是Native列表 + RN Cell,借助Native列表实现Cell复用能力,需要做以下几个事情

  • Native列表渲染Cell,在没有RN Cell的时候需要占位,有Cell的时候需要展示
  • Native列表Cell复用情况下,需要复用正确RN Cell,Cell之间关联关系处理
  • Native渲染线程全部在主线程同步执行,但是RN渲染是经过JS -> Shadow -> Native 三条线程异步操作,所以需要主动进行通信机制管理
白屏(减少通信或者提高通信速度)

Native与RN通信频繁是带来白屏的主要原因,那么可以结合一些特定的业务场景进行一些优化

  • 新一代的RN重构框架Fabric会重点优化线程通信效率,敬请期待
  • RN侧自己感知View变更,作出更新操作,而不全依靠Native通知,从而减少通信。例如顶部、底部上下移动带来新的View渲染,点击回到顶部,直接服用首页View等RN侧处理操作
  • 快速滑动限速,一般来说快速滑动是一个非常规操作,我们可以将速度限制到合理范围,减少过多的异步任务并发出发

参考:
React Native之启动流程
Tree-Shaking性能优化实践 - 原理篇
ReactNative 性能

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343