| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> JavaScript知识库 -> React Native实践有感 -> 正文阅读 |
|
[JavaScript知识库]React Native实践有感 |
React Native(简称RN)是Facebook于2015年开源的移动端跨平台开发框架。RN从开源以来已经有6个年头了,有着十分丰富的社区资源和生态,时至今日依然有很多移动端项目都使用RN来开发。本文主要通过以往的项目实践来谈谈在选择RN开发app可能需要注意的一些点,也算是自己的一个踩坑经验总结。 1. 技术选型 - 是否该用RN?跨平台开发框架都是有局限性的,这一点RN也不例外,RN本身还是要使用原生API来实现UI的绘制,JS bridge的创建和与原生平台的通信都需要消耗资源,基于这样的前提,RN开发的应用相对于原生平台来说往往会占用更多的内存和CPU,因此而出现的卡顿、掉帧的概率也会更高,进而对用户体验造成较大的影响。 那么问题来了,RN真的很差、不适合工程实践吗? 这个问题就涉及到技术选型了,是否应该用RN?什么样的情况下适合使用RN作为首选开发技术? 我个人认为需要从以下几个方面考虑:
2. 依赖库的升级维护RN项目中经常会用到很多第三方库,比如路由框架react-navigation、数据存储AsyncStorage、状态管理react-redux等等。在项目维护时我们可能会面临第三方库的升级带来的一系列问题、某些library没人维护了,但是我们出于某些原因还需要继续使用等等,针对这些情况谈谈我的理解。
适时升级的意思就是第三方库有新版本的时候,在保持app稳定性、不引起regression问题的情况下尽可能的升级第三方库。在app的迭代中把第三方库的升级维护考虑进去是很有必要的,以我所在的项目为例: 我们项目中使用的react-navigation版本非常老旧了,还停留在v2版本,而最新的react-navigation实际已经到了v5版本,并且v5版本中对核心功能组件进行了拆分,意味着v5以后需要安装react-navigation的多个依赖包。react-navigation一直都是一个API变动非常大的router库,每一个大版本的迭代都可能导致原来的路由用法发生改变。对比老旧的v2版本来说,升级到新版本是更好的选择,功能和性能更强、路由灵活性更高,但是在我接手项目之前react-navigation一直都没升级过,直接升级到最新版本变动太大了,风险太高,容易引起功能上的bug。如果在之前的迭代中能把这块升级的工作考虑进去,随着每个迭代一起去做,改动会相对较小,就能平稳过渡到新版本。
没人维护的库怎么处理,分几种情况:
RN在0.59及之前的版本中只能手动安装第三方库,0.60及以上版本可以auto link了,项目的配置简单了许多,所以最好升级到0.60版本以上。 0.63版本解决了iOS 13中本地图片无法显示的问题,源于iOS
从我们的项目来看,升级到RN 0.63版本会导致react-navigation老版本中的依赖库react-native-safe-area-view报错。所以连带的也需要升级react-navigation,但我上面提到升级react-navigation风险比较大,需要比较大的effort去做,所以这里我还是保持RN版本小于0.63,通过 总之,RN和第三方依赖库版本太老长时间不升级会带来很多问题,如老API过时、新API变动太大,iOS、Android系统更新带来的兼容性问题都需要解决,升级应该作为一个task经常关注并适时执行。
Realm是一个开源的移动端数据库,性能表现非常不错,API也简单易用。但RealmJS真是太难用了,首先安装就很费劲,经常安装失败,即使安装成功,按照文档配置好了iOS也经常报错Missing Realm Constructor,并且这个错误问题还偶尔在production环境出现,导致app直接白屏无法使用。 而且在iOS 14beta版中RealmJS引发了一个crash,导致所有iOS 14beta版的用户都受到影响,虽然说这个crash在iOS 14的beta2迭代中就不存在了,但为了保险起见,我还是决定升级library。为此我曾尝试升级到v6.6版本,作为一个暂时的解决方案,但是安装依赖失败这一点简直不能忍,于是我决定彻底抛弃RealmJS,改用Realm的native SDK。虽然在Android和iOS两端都需要写native代码来实现存储功能,但真的比RealmJS用起来容易多了,再也不用担心打包失败和missing constructor了,真的谁用谁知道! 3. 跨平台的局限性RN对原生平台依赖太强,取代不了原生。虽然它已经能做很多事了,但是:
4. 关于性能优化性能优化是应用开发中常见的话题,RN应用的优化需要从JS和原生端同时入手。
我们的项目中使用了Firebase crashlytics来统计分析crash log,从Firebase console可以看到,JS端的exception都会通过RN原生代码抛出,Android中通过 Native的crash则分别按照Android和iOS平台的方式去定位,比如Android上传 在实践中我发现很多JS端exception都是代码不规范导致的,轻则导致app白屏重则crash,比如从Object取值的时候Object可能是空的,不存在key value。类似这样的情况一定要谨慎处理,这里建议使用loadash的get函数取值,在取值为undefined的情况,还可以设置默认值。
本例中在路径“key1.key2.key3”下都取不到值,a就会是undefined,这时候如果不赋予一个空字符串作为默认值,那么在if判断时就会抛出异常,因为undefined没有length这个属性。在我们平常写代码过程中有很多类似这样的细节需要注意。
官方文档说完善地使用这个函数可以避免重新渲染那些实际没有变化的子组件所带来的额外开销。但是在实际开发中,我们所面临的情况可能比官方给出的例子要复杂得多,实际的业务逻辑、状态变化远远不是一两个变量能cover的。对于这个函数的使用,在不影响系统功能的前提下,可以尽量去用它控制组件的重复渲染,但不要指望它能帮我们handle复杂的业务场景下的页面render规则。
这里贴上很久之前写的一点优化方案,可能部分已经不太适用了。其中防止navigator重复跳转的问题,处理方式并不是好的选择。这里以我目前项目为例,由于使用的是react-navigation,为了防止用户操作过快多次点击导致多次重复跳转同一页面,我们在页面跳转之前会判断下一个页面的routeName,传递的参数等是否与当前stack navigator中存在的页面相同,如果全部相同第二次之后就不再跳转页面。示例代码如下(由于react-navigation版本不同使用API可能略有差异):
5. 一些开发中的建议 & tips
指定output路径和assets图片资源路径,可以将android bundle文件和图片资源输出到工程目录下,再通过
为了build方便,可以将脚本写到package.json的scripts中,取个别名如 禁用字体缩放效果 手机系统调节字体大小后,app中的文本字体大小也会随之变化,尤其在Android上影响非常明显。本来显示效果满分,调整字体大小后UI瞬间错乱。在RN中我们可以通过在app启动时禁用Text和TextInput组件的font scaling来实现,例如:
强制使用LTR 有些语言如阿拉伯语、希伯来语是从右往左排列的,当Android手机语言切换到阿拉伯语时,app如果不做任何限制,UI会默认从右向左显示。可以通过如下方案强制LTR(left to right)显示。 在AndroidManifest文件中给application设置
对于一些组件仍然支持RTL样式的,需要在styles.xml中添加layoutDirection,使UI样式为LTR
总结RN作为移动端跨平台开发框架来说,优缺点十分明显。优点是上手比较简单,开发者生态比较活跃,社区资源也比较丰富,缺点是性能稳定性与原生平台还是存在一定差距的,尤其是对功能复杂、与原生交互较多的应用可能并不适用RN开发。虽然近年来使用RN开发的热度貌似有所降低,尤其是以Airbnb为首的一些公司放弃了RN,并且Flutter这样跨平台框架的崛起,导致网上出现很多“RN已经凉了”的声音。但是时至今日,RN仍然还在很多项目中得到广泛应用,Facebook仍然还在持续维护,开发者生态依然生机勃勃,可以说RN的生态是移动端跨平台开发框架中最好的也不为过,说凉凉还为时过早。 我个人认为RN依然是有竞争力的,至于要不要用RN在技术选型阶段还是要多考虑考虑,怎么用、用不用得好在开发阶段就需要多研究,在实践过程中不断优化改进。最后,欢迎大家一起探讨,有好的实践可以互相交流。 参考文章 文/Thoughtworks朱浩 |
|
JavaScript知识库 最新文章 |
ES6的相关知识点 |
react 函数式组件 & react其他一些总结 |
Vue基础超详细 |
前端JS也可以连点成线(Vue中运用 AntVG6) |
Vue事件处理的基本使用 |
Vue后台项目的记录 (一) |
前后端分离vue跨域,devServer配置proxy代理 |
TypeScript |
初识vuex |
vue项目安装包指令收集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 5:20:28- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |