去年把公司几个react native 相关的项目升级了下,已经过去一段时间了,这里系统整理下之前的整个过程。

背景

之前到公司的时候发现公司用的还是0.40的版本,据了解,当时项目做的比较早,导航用的是自带的路由库,状态管理用的是 mobx。到公司之前虽然有react native的相关经验,不过当时官方已经推荐用 react-navigation 替代原来的导航库。以前的项目比较小,也没用到状态管理,react-native-code-push也没有用过,只是了解过一些。

刚开始接手项目的时候还是比较痛苦的,业务逻辑相比之前的复杂不少,有些代码并不完全知道是什么意思,动也不敢动。不过经过一段时间后,基本上也算是熟悉了react native周边生态. 连着做了好几期需求后算是大致明白了,幸好当时不是createClass的旧写法,不然改造起来更麻烦了。

因为用的版本比较早,而安卓高版本又做了一些限制,这导致有时候调试起来比较麻烦,我自带的旧手机因为系统版本比较低(Android 6.0),成了唯一的测试机(版本高一点的没法摇一摇进行调试)。

这卡得不要不要的手机,让我既爱又恨。爱是因为可以调试,不用像iOS一样IP地址变了还得打包,恨是因为,调试非常话费时间, 你有时候都可以看到页面在过渡的效果,如果你看过《疯狂动物城》的话,你应该还记得那个树懒。 react native 自带的列表性能又不好,而项目里面又不少用到列表的地方,复杂的业务需求让导航库难以使用,个人调试也非常麻烦。

技术调研

因为涉及到的项目比较多,而且版本跨度又比较大,所以调研必须要更加认真、全面。

我把互联网上近一年来关于react native的博客文章全部看了一遍(谷歌+百度+GitHub +技术QQ群的方式),并针对性的搜集了关于升级踩坑的博文,又把做rn以来收集到的相关技术博客都翻开看了下。 尽量做到无死角全方面覆盖网上目前所有相关的内容。

然后汇总了一篇 react-native升级调研文档,主要包括API变更,几个重大更新的日志、此次升级有关的重要点、涉及到的几个库、可能需要考虑的一些问题、参考资料链接(40多个)

版本升级

版本升级是首先需要考虑的问题,如果这个不定的话,其他的工作不方面开展,而版本升级又需要考虑多个方面:

  • androidiOS用户各个系统占比是多少?如果安卓和苹果低版本用户太多的话,对rn版本的升级也会有阻力。
  • react native本身版本变化如何?其本身的重构计划进度如何?
  • 第三方库对react native版本有特殊要求?
  • androidiOS方面的构建工具、IDE等是否有特殊要求?原生xcode/Android SDK 版本、安卓和iOS对应的版本号API号等,这些都是需要考虑的

经过实际调查以及和原生开发人员沟通,最终确定了要更新的版本。因为react native最新版本太新,很多第三方库还没有来得及更新,

第三方库:

因为每个项目不同,用到的第三方库也不一样,但是在原生里面的package.json是最全的,在挨个分析第三方库的时候我发现有些库可能最初用到了,因为业务变化,后来又没有用到,便将那些没有用到的库全部删除,这样可以缩小查找范围,减少工作量。写文档《react-native 各项目配置情况》

接下来是把当前所涉及需要更改的项目使用到的包的最新版本,做一个情况说明表,包括名称、版本、地址(方便其他人及后续查看)、重大更新等内容。大部分都还好,只有个别库停止维护, 有些由原来的API改为分离出来的第三方库,还好用法基本上没有发生大的改变。

项目熟悉

因为主要是经常改动的那个项目自己平常接触得比较多,代码基本上都熟悉了,其他的几个项目找测试要相关的账号,找产品负责人了解产品需求,大致跑了一遍之后,也基本上熟悉了代码逻辑。

早期代码因为各种原因,有些重复的地方,还有些可以改进的地方,这个在我得知react native需要升级的时候便开始着手优化代码了。删除无关的代码,添加注释,抽取公共样式组件等,就当顺带全面熟悉这个项目的代码。 这样的好处是后期升级的话不需要更改那么多代码,也顺手简化了代码。

demo初试

为了保险起见,在确定react native版本后,先写了一个包含所有第三方库的最小demo,每安装一个库,就写项目中用到同样功能的代码,保证基础功能实际可行,并在每一个功能完善之后提交代码到仓库。

这样一来,如果新安装的那个库因为更改代码错误导致无法运行APP的话,还可以及时回到上一步。这种情况尤其容易发生在更改android文件夹代码的时候,毕竟日常大部分时间都在改JavaScript代码,好多刚接触react native时候踩过的熟悉的坑都忘记得差不多了。

在功能基本上可行之后,在安卓和苹果手机各自大致运行了下,没有什么大的问题,便开始着手正式更改代码。

代码编写

在升级之前,建立新的分支,升级期间新加的需求也暂时不同步更新(新旧功能同时做),待升级结束,一并更新。

写专用的代码替换文档,方便其他开发参考,减少工作量。在文档中写了新旧代码对比,如导航的跳转传参、引入方式的变化等,可以直接删除源代码,复制粘贴新代码。

这里既包括几个通用的替换,还包括几个可能的坑,比如React Native中的图片组件加载静态资源,图片名称含有@2x或@3x报错 。

信息同步

此次升级和原生端密切相关,信息的同步非常重要。

在将0.40到0.59直接的版本更新日志全部看了一遍后,整理成文档,将重点部分标注,让原生那边大致看下有无跟他们关系比较大的地方。有些地方并不是非常懂,需要对方去做个大致的判断。

升级期间及时更新文档,提供所有可能用到的文档。并将整个调研中所有相关文档更新到公司知识管理平台。

测试

列出几个项目中更改到的地方,方便测试重点测试相关的功能。重要功能无误后,测试各种机型,然后就是修bug。期间有遇到一些问题,不过还好,遇到问题多了,大致能看出来是什么情况。

总结

一开始还是比较担心的,毕竟涉及项目比较多,而且版本跨度这么大,在网上看到的基本上都是小幅度的版本升级。

这次因为整个升级时间比较充足,前期调研准备也比较充分,倒没有出现比较严重的耽误进度的事情。就是项目业务逻辑比较多,在更改之后有个别小地方被遗漏了,后期才发现这些隐蔽的bug

总体来说,基本上更改的代码量不是特别多,集中在 react-navigation 路由汇总、跳转传参,以及Flatlist等地方,在和iOS、android等联调方面也花费了不少时间。

因为疫情的缘故,不得不在家办公,但是APP照常更新,这让本来没打算更新升级过的代码不得不随着更新,期间有些临时发现的bug因为环境不同调试起来比较麻烦。

之前在网上查找了不少文档,多谢网友的分享,这里也总结下自己遇到的情况,希望对大家有所帮助。

记一次 React Native 大版本升级过程——从0.40到0.59的更多相关文章

  1. React Native库版本升级与降级

    迄今为止React Native获得了超过48K的star,最新版本0.44,已经趋于稳定.(官网地址:https://github.com/facebook/react-native).随着Reac ...

  2. react native 项目版本升级

    首先说明一下rn项目的一种相当顺滑升级方法: 1.全局安装react-native-git-upgrade npm i -g react-native-git-upgrade 2. 在项目目录下执行命 ...

  3. [RN] React Native 使用 react-native-camera 过程中报错 Found react-native-camera 'mlkit' but wasn't required.`

    详细报错如下: Could not resolve all task dependencies for configuration ':app:debugRuntimeClasspath'. Coul ...

  4. 《React Native 精解与实战》书籍连载「React Native 源码学习方法及其他资源」

    此系列文章将整合我的 React 视频教程与 React Native 书籍中的精华部分,给大家介绍 React Native 源码学习方法及其他资源. 最后的章节给大家介绍 React Native ...

  5. React Native拆包及热更新方案 · Solartisan

    作者:solart 版权声明:本文图文为博主原创,转载请注明出处. 随着 React Native 的不断发展完善,越来越多的公司选择使用 React Native 替代 iOS/Android 进行 ...

  6. React Native环境配置之Windows版本搭建

    接近年底了,回想这一年都做了啥,学习了啥,然后突然发现,这一年买了不少书,看是看了,就没有完整看完的.悲催. 然后,最近项目也不是很紧了,所以抽空学习了H5.自学啃书还是很无趣的,虽然Head Fir ...

  7. beeshell —— 开源的 React Native 组件库

    介绍 beeshell 是一个 React Native 应用的基础组件库,基于 0.53.3 版本,提供一整套开箱即用的高质量组件,包含 JavaScript(以下简称 JS)组件和复合组件(包含 ...

  8. React Native专题-江清清

    本React Native讲解专题:主要讲解了React Native开发,由基础环境搭建配置入门,基础,进阶相关讲解. 刚创建的React Native交流8群:533435865  欢迎各位大牛, ...

  9. React Native 常用插件案例

    (二).基础入门: 1.React Native For Android环境配置以及第一个实例 2.React Native开发IDE安装及配置 3.React Native应用设备运行(Runnin ...

随机推荐

  1. Hard filters (by GATK)

    Filter Symbol T. Definition QualByDepth QD 2.0 The variant confidence (from the QUAL field) divided ...

  2. Java ArrayList工作原理及实现

    http://yikun.github.io/2015/04/04/Java-ArrayList%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE% ...

  3. 通过express框架为前端提供api(数据),妈妈再也不用担心后端不给我数据了~

    个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 首先,确保自己安装了express框架. 没有安装的同学可以参照下面这篇博 ...

  4. JavaScript实现插入排序

    一.插入排序简介: 想象我们斗地主,摸排阶段,手里的牌都按照从小到大排序.如果每摸一张牌,我们就把他插入合适的位置,使得它比后面位置的牌小,比前面位置的牌大或者相等. 类似这样的一种排序方法就是插入排 ...

  5. ACM及各类程序竞赛专业术语

    AC (Accepted) 程序通过 WA (Wrong Answer) 错误的答案 PE (Presentation Error) 输出格式错误 RE (Runtime Error) 程序执行错误 ...

  6. 数学--数论--随机算法--Pollard Rho 大数分解算法 (带输出版本)

    RhoPollard Rho是一个著名的大数质因数分解算法,它的实现基于一个神奇的算法:MillerRabinMillerRabin素数测试. 操作流程 首先,我们先用MillerRabinMille ...

  7. 概率dp部分题目

    记录一些比较水不值得单独写一篇blog的概率dp题目 bzoj3036 绿豆蛙的归宿 Description 随着新版百度空间的下线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 给出一个有向 ...

  8. 使用python实现模拟掷骰子数据分析

    Data:2020/4/8 主题:模拟实现掷骰子数据分析 编译环境:pycharm 库:pygal 说明: code 1:创建一个掷骰子类对象,类方法获得掷骰子随机数1-6,默认6个面,模拟20次将结 ...

  9. 用js写出一个漂亮的单选框选中效果

    一般的input框比较简单,我们可以用JavaScript配合css背景图片定位让我们模拟写出一个点击选中效果 首先需要有个图片素材,当页面加载的时候是背景图片定位到左图,当我们点击图片的时候,背景图 ...

  10. Spring 学习 之 再探publish-event机制

    之前的文章链接:https://blog.csdn.net/qq_41907991/article/details/88544777 我们要知道的是,Spring的publish-event使用的是监 ...