其他
房产RN页面启动速度优化
导语
自58引入React-Native技术栈后,RN在房产业务线被广泛使用,业务覆盖租房、二手房、商业地产各线需求共30余个。随着房产对app体验要求的不断提高,RN页面体验优化亟待处理。
RN页面因其特有的处理逻辑,相对其他原生页面在页面启动耗时方面差距尤为明显,所以启动速度优化是RN页面体验优化的第一步。
加载流程分析
问题排查
2019-12-1218:32:03.094 onCreateView---------------------------载体页生命周期2019-12-1218:32:03.106 after inflater-----------------------------载体页 inflater2019-12-1218:32:03.107 initData----------------------------------初始化数据2019-12-1218:32:03.107 initRN-----------------------------------初始化RN2019-12-1218:32:03.109 createWubaRNImmediately--------------创建WBRN核心类2019-12-1218:32:03.109 buildReactInstanceManager--------------创建RN核心类2019-12-1218:32:03.111 buildReactInstanceManager finish--------完成创建RN核心类2019-12-1218:32:03.114 onViewCreated--------------------------载体页生命周期2019-12-1218:32:03.114 loadRelease-----------------------------release模式加载2019-12-1218:32:03.115 doHotUpdate----------------------------开始热更新2019-12-1218:32:03.129 createReactContextInBackground--------预创建ReactContext2019-12-1218:32:03.211 ReactContext initialized------------------预创建完成2019-12-1218:32:03.246 showContentAndLoadBundle------------加载业务bundle2019-12-1218:32:03.250 after loadBuzBundle---------------------业务bundle加载完成2019-12-1218:32:03.250 startReactApplication[1]-------------------调用js启动入口2019-12-1218:32:03.094 onCreateView---------------------------载体页生命周期
2019-12-12 18:32:03.094onCreateView---------------------------------0ms2019-12-12 18:32:03.106 afterinflater-----------------------------------12ms2019-12-12 18:32:03.107initData---------------------------------------1ms2019-12-12 18:32:03.107initRN-----------------------------------------0ms2019-12-12 18:32:03.109createWubaRNImmediately--------------------2ms2019-12-12 18:32:03.109 buildReactInstanceManager-------------------0ms2019-12-12 18:32:03.111buildReactInstanceManager finish-------------2ms2019-12-12 18:32:03.114onViewCreated-------------------------------3ms2019-12-12 18:32:03.114 loadRelease----------------------------------0ms2019-12-12 18:32:03.115doHotUpdate---------------------------------1ms2019-12-12 18:32:03.246showContentAndLoadBundle------------------131ms2019-12-12 18:32:03.250 afterloadBuzBundle-------------------------4ms2019-12-12 18:32:03.250startReactApplication[2]-----------------------0ms
2019-12-12 18:32:03.129createReactContextInBackground------------0ms
2019-12-12 18:32:03.211 ReactContextinitialized----------------------82ms
2019-12-1218:32:03.094 onCreateView2019-12-1218:32:03.106 after inflater
2019-12-1218:32:03.129 createReactContextInBackground2019-12-1218:32:03.211 ReactContext initialized
2019-12-12 18:32:03.115 doHotUpdate2019-12-12 18:32:03.246showContentAndLoadBundle
((AppRegistry)catalystInstance.getJSModule(AppRegistry.class)).runApplication()。
AppRegistry.runApplication。
reactRootView.startReactApplication
((AppRegistry)catalystInstance.getJSModule(AppRegistry.class)).runApplication()
constReactNative=require(‘ReactNative’);
constrenderApplication =require(‘renderApplication’);
__r(‘node_modules/react-native/Libraries/Renderer/shims/ReactNative.js’);__r(‘node_modules/reactnative/Libraries/ReactNative/renderApplication.js’);
data/data/com.wuba/files/opt_rn/test.core.bundle
CatalystInstance.setGlobalVariable
形如:
所以当一个list接口返回数据长度较大,且list的每一行对应视图较高,页面展示item个数有限时,限制list长度是一个很好的优化方式——先渲染一部分后再渲染一部分。
虽然会触发两次渲染,但是很大程度上的控制了这部分耗时,两次渲染会经虚拟dom做对比转为局部更新,所以用户无感。
优化效果分析
总结