React Native JS Module 加载性能优化

简介: 关于React Native 性能 React Native 在手淘中已开始逐步推广, 在拍立淘首页的使用场景中,我们发现React Native并没有想 象中的那么快,实测效果在离线状态下性能甚至比不过H5 WindVane,React Native的UI会出现延迟渲 染存在视觉差,经过具体

关于React Native 性能

React Native 在手淘中已开始逐步推广, 在拍立淘首页的使用场景中,我们发现React Native并没有想

象中的那么快,实测效果在离线状态下性能甚至比不过H5 WindVane,React Native的UI会出现延迟渲

染存在视觉差,经过具体的代码性能测试,整个过程平均在300 ms (IPhone 5S机型下,整个JS文件

400K), 然后其核心系统调用代码加载解析整个JS (JSEvaluateScript)耗时在220 ms左右,在目前

手淘的使用场景中,每个业务独立发布的JS大小都在400K左右,其中大部分属于系统接口JS,业务JS

的逻辑代码只占很小一部分,每个业务都创建RCTBridge 独立加载整个400K JS文件,重复的加载过程

和过大的离线JS文件(系统JS冗余)对性能和存储空间造成极大的开销,因此,优化拆分整个JS,动

态加载业务JS,管理JS缓存,避免重复加载,成为了优化React Native性能的核心。

React Native 优化设计

在实践过程中,将系统部分JS抽离出来打入APP本地资源中,初始化过程中先加载本地系统资源JS模

块,为了避免系统JS资源的释放和缓存的重复使用,RCTBridge 采用共享单例的设计模式实现,所有业

务方共享使用全局RCTBridge,共享使用优先加载系统JS缓存,动态管理加载每个业务方Module

URL到缓存并重复使用,根据每个业务JS的使用情况,动态管理缓存队列,清理缓存中长期未使用的业

务JS Module。

React Native 优化实现细节

技术上采用类扩展去除对源码的任何影响,RCTBridge (bizModule)通过单例模式实现系统JS的预先加

载和共享,代码示例如下:

`+ (instancetype)sharedBridge {

static dispatch_once_t pred;
static RCTBridge *instance;
dispatch_once(&pred, ^{
    NSURL *bundleURL = [[NSBundle mainBundle] URLForResource:@"system_ios" 
AI 代码解读

withExtension:@"js"];

    instance = [[RCTBridge alloc] initWithBundleURL:bundleURL moduleProvider:nil launchOptions:nil];
    instance.viewBindings = [[NSMutableDictionary alloc] init];
});
return instance;
AI 代码解读

} `

同时增加对外接口加载业务JS Module,建立从Module URL到Module Name 的缓存MAP关系,未加载

此Module则加载此Module URL,加载过则直接回调rootView bundleFinishedLoading加载显示

rootView,采用此种回调是为了避免影响原有逻辑NSNotificationCenter的通知,通过

RCTJavaScriptLoader 加载JS,调用javaScriptExecutor executeApplicationScript, 修改

RCTSourceCode,去除 jsDisplayLink和javaScriptExecutor executeJSCall:@"BatchedBridge"

method:@"flushedQueue" 的重复调用,接口函数如下:

`- (void)loadModuleURL:(NSURL )bundleURL moduleName:(NSString )moduleName rootView:
(RCTRootView *)rootView`

同时扩展RCTRootView (bizModule) 增加入口函数(去除对原有代码结构的影响):

`- (instancetype)initWithModuleURL:(NSURL )moduleURL moduleName:(NSString )moduleName launchOptions:(NSDictionary *)launchOptions {

RCTBridge *bridge = [RCTBridge sharedBridge];
[bridge loadModuleURL:moduleURL moduleName:moduleName rootView:self];
return [self initWithBridge:bridge moduleName:moduleName];
AI 代码解读

}`

React Native 后续优化方向:

目前基于此优化之后,在拍立淘首页运营的React JS性能评测从之前的300ms,优化到目前50ms以

内(IPhone 5S机型下已感觉不到视觉差),预计下个版本上线后会加入准确的性能埋点统计,优化后

续考虑加入Module JS 缓存机制,长久未使用的Module JS 会自动清理,经常使用的Module JS 会常驻

内存中,避免业务Module JS的重复加载所带来的开销,Module JS的管理也会逐步增加对外查询接

口,更新接口,注册预先加载接口等功能 ,一些新的想法和优化思路大家可以一起交流探讨。

龙冥
+关注
目录
打赏
0
0
0
4
158
分享
相关文章
React 中集成 Chart.js 图表库
本文介绍了如何在 React 项目中集成 Chart.js 创建动态图表,涵盖基础概念、安装步骤、代码示例及常见问题解决方法,帮助开发者轻松实现数据可视化。
120 11
JavaScript框架React vs. Vue:一场性能与易用性的较量
JavaScript框架React vs. Vue:一场性能与易用性的较量
111 0
构建高效的数据可视化仪表板:D3.js与React的融合之道
【10月更文挑战第25天】在数据驱动的时代,将复杂的数据集转换为直观、互动式的可视化表示已成为一项至关重要的技能。本文深入探讨了如何结合D3.js的强大可视化功能和React框架的响应式特性来构建高效、动态的数据可视化仪表板。文章首先介绍了D3.js和React的基础知识,然后通过一个实际的项目案例,详细阐述了如何将两者结合使用,并提供了实用的代码示例。无论你是数据科学家、前端开发者还是可视化爱好者,这篇文章都将为你提供宝贵的洞见和实用技能。
141 5
React 静态网站生成工具 Next.js 入门指南
【10月更文挑战第20天】Next.js 是一个基于 React 的服务器端渲染框架,由 Vercel 开发。本文从基础概念出发,逐步探讨 Next.js 的常见问题、易错点及解决方法,并通过具体代码示例进行说明,帮助开发者快速构建高性能的 Web 应用。
240 10
React、Vue.js 和 Angular主流前端框架和选择指南
在当今的前端开发领域,选择合适的框架对于项目的成功至关重要。本文将介绍几个主流的前端框架——React、Vue.js 和 Angular,探讨它们各自的特点、开发场景、优缺点,并提供选择框架的建议。
130 6
React、Vue.js 和 Angular前端三大框架对比与选择
前端框架是用于构建用户界面的工具和库,它提供组件化结构、数据绑定、路由管理和状态管理等功能,帮助开发者高效地创建和维护 web 应用的前端部分。常见的前端框架如 React、Vue.js 和 Angular,能够提高开发效率并促进团队协作。
302 4
Express.js与前端框架的集成:React、Vue和Angular的示例与技巧
本文介绍了如何将简洁灵活的Node.js后端框架Express.js与三大流行前端框架——React、Vue及Angular进行集成,以提升开发效率与代码可维护性。文中提供了详细的示例代码和实用技巧,展示了如何利用Express.js处理路由和静态文件服务,同时在React、Vue和Angular中构建用户界面,帮助开发者快速掌握前后端分离的开发方法,实现高效、灵活的Web应用构建。
180 3
JSF 面向组件开发究竟藏着何种奥秘?带你探寻可复用 UI 组件设计的神秘之路
【8月更文挑战第31天】在现代软件开发中,高效与可维护性至关重要。JavaServer Faces(JSF)框架通过其面向组件的开发模式,提供了构建复杂用户界面的强大工具,特别适用于设计可复用的 UI 组件。通过合理设计组件的功能与外观,可以显著提高开发效率并降低维护成本。本文以一个具体的 `MessageComponent` 示例展示了如何创建可复用的 JSF 组件,并介绍了如何在 JSF 页面中使用这些组件。结合其他技术如 PrimeFaces 和 Bootstrap,可以进一步丰富组件库,提升用户体验。
87 0

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等