1. 程式人生 > >記一次 React Native 大版本升級過程——從0.40到0.59

記一次 React Native 大版本升級過程——從0.40到0.59

去年把公司幾個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

去年把公司幾個react native 相關的專案升級了下,已經過去一段時間了,這裡系統整理下之前的整個過程。 背景 之前到公司的時候發現公司用的還是0.40的版本,據瞭解,當時專案做的比較早,導航用的是自帶的路由庫,狀態管理用的是 mobx。到公司之前雖然有react native的相關經驗,不過當時官方

「Do.012」mac版AS3.1升級的坑

首發公眾號:Android程式設計師日記作者:賢榆的榆如果你覺得有幫助歡迎關注、讚賞、轉發閱讀時間:2277字 6分鐘 注:AS:AndroidStudio 先簡述一下時間線 9月9日(週日) 上午拿到新的mac 下午裝好系統 晚上從舊的mac上遷移資料到新ma

React中非同步獲取事件物件的爬坑經歷

SyntheticEvent objects are pooled 在使用React過程中,直接非同步獲取事件物件上的屬性,實際上我們拿到的值永遠是null,下面的程式碼就存在問題 const handleClick = e => { setTimeout(() => {

react-naitve TextInput 的一些坑

業務場景描述:     話不多說,直接上程式碼 關於 TextInput 輸入框在什麼時候清空文字內容 /** react 組建的引用 */ import React, {Component} from "react"; import { StyleShee

TPS低,CPU高--storm壓測問題排查過程

進入 狀態 其他 value 由於 均衡 線程狀態 左右 grep 命令 一、業務背景+系統架構 本次場景為kafka+storm+redis+hbase,通過kafka的數據,進入storm的spout組件接收,轉由storm的Bolt節點進行業務邏輯處

線上gc調優的過程

aspect hash 接下來 JD lac abs rac 數據庫 %x 近期公司運營同學經常表示線上我們一個後臺管理系統運行特別慢,而且經常出現504超時的情況。對於這種情況我們本能的認為可能是代碼有性能問題,可能有死循環或者是數據庫調用次數過多導致接口運

Xmrig挖礦木馬排查過程

linux 系統 異常 定位 計劃任務 root systemctl ica 文件名 發現 問題現象 Linux 服務器收到報警信息,主機 CPU 跑滿。 自動創建運行 Docker 容器 xmrig, 導致其他運行中容器被迫停止。 問題原因 通過 to

自動化測試崗位面試的過程及問題

自我介紹一下 8la8la8la… 說說你的自動化框架是怎麼實現的 python+selenium+excel檔案用資料驅動 我的意思是說,具體怎麼實現的 哦,先寫一個base檔案做基礎負責呼叫實際方法,還有資料的讀寫;然後往上有專門封裝UI操作的method檔案,

APP脫殼重打包過程

小夥伴分享了一個開車軟體,但是有播放次數限制。對此小夥伴放言要制裁它,無奈APP加固了。 咳咳,本著學(wei)習(le)研(fu)究(li)的態度,嘗試著脫殼並重打包。 為證清白,伸出雙手,上操作。 右鍵直接解壓APK,檢視特徵是360加固: 使用apktool工具反編譯APK作為

MHA主從不同步恢復過程

背景: 根據生產環境故障模擬,由於生產環境主機mysql資料目錄滿,造成業務側連線mysql異常。維護人員在排查時,誤將MHA中主master的二進位制日誌全部清除,造成兩個從庫向主庫同步拉取日誌失敗,報找不到日誌錯誤。為解決該問題,同時又考慮到生產庫不能停庫,所以準備在主master庫上對相關

python3 驗證碼識別 出錯過程

需要安裝  pillow、pytesseract、tesseract-ocr 前面2個可以直接pip安裝,tesseract-ocr需要去下載安裝包(直接網上搜,很多) 安裝完執行下py程式碼 import pytesseract from PIL import Image i

Linux下安裝pyspider的過程

首先執行pip install pyspider此時系統提示Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-Lau0Qp/pycurl/ You are using p

Dubbo導致的記憶體洩漏過程分析及解決

       近日測試團隊反饋版本機測試環境請求經常卡頓,十分緩慢,甚至有超時的情況,但是請求返回、業務邏輯均是正常的,因此進行了一番排查。         首先檢視應用日誌,及控制檯監控,應用均表現無異常,由於版本

有驚無險的Linux資料恢復過程

問題階段 起因: 昨天晚上思路不是很清晰(上了一天班回來有點蒙),還是強忍著疲憊想搞事情,結果悲劇了… … 本來想拿SD卡做一張linux燒錄卡,燒錄指令碼是很久以前寫的,有git記錄,一直不成功,就回退了幾次提交,然後執行的時候沒有給指令碼傳參(/dev

OOM堆疊資訊洩漏分析過程

1、使用者反映生產訂單下不來,馬上開啟伺服器檢視gc日誌(前提是已經先排除了業務邏輯問題) tomcat配置: JAVA_OPTS=”$JAVA_OPTS -server -Xms4096m -Xmx4096m -Xss1024k -XX:PermSize=

HIS系統的expdp/impdp過程中的BUG

某醫院的HIS系統做OGG,過程中impdp遇到很多問題,oracle的BUG太坑爹了!!! 環境: 生產庫,AIX 10.2.0.4 RAC 容災庫:linux,10.2.0.5 單機,本地磁碟 儲存是H3C的IP sun儲存,平時儲存磁碟IO很高,80%左右,資料量

聯通路由器劫持的分析過程

在此順便給大家普及下計算機中“劫持”這詞,劫持可以分為分很多種,有大家常常聽見的那些廣泛的也有較為狹窄較為針對性的,比如大家常說的映象劫持它其實也可以叫做程序劫持,如果它是通過DLL注入映象或者注入記憶體的話也可以叫做DLL劫持。還有一種常見的“網路劫持”,它其實也有著更加廣泛的名詞,比如修改HOSTS檔案植

揪心的MySQL資料恢復過程

先說下背景,公司其中一個專案所有服務都部署在客戶的機房內,機房較小,沒有UPS。其中一個MySQL例項(單機,無主從,windows server 2008,MySQL5.6.19)存放大量的日誌資料,每天幾十G的資料,定期清除(儲存大概四個月的資料),由於硬碟

踩坑:使用Navicat連線Mysql8.0.11

  MySQL8.0正式版8.0.11已釋出,官方表示MySQL8要比MySQL5.7塊兩倍,同事還帶來了大量的改進和更快的效能!   從MySQL5.7升級到MySQL8.0僅支援通過使用in-place方式進行升級,並且不支援從MySQL8.0降級到MySQ

經典Net程式的逆向過程

1.前言 上次發完,有網友問了一個問題:如果不繞過編譯,而是直接編譯怎麼辦? 記一次Net軟體逆向的過程:https://www.cnblogs.com/dotnetcrazy/p/10142315.html 今天就來說說:本次提供樣本:連結: https://pan.baidu.com/s/1ekYVK