記一次 RN 升級(0.49.5->0.56.0)

一、前言

首先我們可以在官方文檔里查到RN升級的文檔Upgrading to new React Native versions
文中介紹了兩種辦法:

1.通過react-native-git-upgrade

因?yàn)檫@個(gè)方法是一鍵式升級,所以它會(huì)改變項(xiàng)目中的iOSAndroid文件,由于我們的項(xiàng)目是混合型的,這樣嚴(yán)重破壞了客戶端的代碼,會(huì)讓解決沖突變得十分困難,不推薦。

2.通過修改package.jsonreact-native的版本號來升級

這個(gè)方案只牽涉到前端,破壞性小,還可以通過rn-diff來查看到升級的一些文件改變,通常react-native的升級和react的升級是綁定的,我們就可以通過rn-diff找到相應(yīng)的版本號,接下來我們就用這種辦法來進(jìn)行升級。

二、踏坑

1.修改package.json

"react": "16.4.1",
"react-native": "0.56.0",
npm i

2.運(yùn)行iOS的pod:update

發(fā)現(xiàn)pod.file中為了兼容scrollView的一段代碼已無用,故刪除。

3.執(zhí)行react-native run-ios

錯(cuò)誤信息:

Failing run on IOS and Android because a syntax error in `local-cli`

解決:
需要升級 node,版本大于8.3

sudo npm cache clean -f && sudo npm install -g n install "n" && sudo n stable

4.啟動(dòng)后的紅屏

錯(cuò)誤信息1:

Unable to resolve module AccessibilityInfo from XXX

解決:
清除緩存

npm run reset  
相當(dāng)于 
watchman watch-del-all && rm -rf node_modules && npm install && npm start --reset-cache

這里還需要提到一點(diǎn),在修復(fù)過程中,經(jīng)常發(fā)現(xiàn)改動(dòng)了代碼但沒生效,這時(shí)候需要重啟服務(wù)試試

npm start --reset-cache

錯(cuò)誤信息2:

Using the export keyword between a decorator and a class is not allowed

解決:

將
@dec1
@dec2({
  option1: "foo" 
})
export class C {
} 
改為
export
@dec1
@dec2({
  option1: "foo" 
})
class C {
} 

錯(cuò)誤信息3:

Cannot read property 'bindings' of null at Scope.moveBindingTo

錯(cuò)誤信息4:

Property right of AssignmentExpression expected node to be of a type ["Expression"] but instead got null

解決:
3和4都是由于在0.56版本,RN需要使用babel7+

package.json
 "dependencies": {
    "react": "16.4.1",
    "react-native": "0.56.0",
    "@babel/core": "7.0.0-beta.47",
    "@babel/plugin-proposal-decorators": "7.0.0-beta.47",
    "@babel/plugin-transform-classes": "7.0.0-beta.47",
    "@babel/register": "7.0.0-beta.47",
  }
  "devDependencies": {
    "babel-jest": "23.4.0",
    "babel-preset-react-native": "^5",
    "jest": "23.4.1",
    "react-test-renderer": "16.4.1"
  }
.babelrc
{
    "presets": ["react-native"],
    "plugins": [
        ["@babel/plugin-proposal-decorators", { "legacy": true }]
    ]
}

5.第三方庫錯(cuò)誤

react-native-scrollable-tab-view

錯(cuò)誤信息:

A trailing comma is not permitted after the rest element

解決:
由于此庫已無人維護(hù),所以把源碼放到本地維護(hù),去除錯(cuò)誤提示代碼中的幾處逗號即可

react-native-modal

錯(cuò)誤信息:

bundling failed: Error: We don't know what to do with this node type. We were previously a Statement but we can't fit in here?

解決:
升級庫

"react-native-modal": "^6.5.0"

react-native-svg-uri

錯(cuò)誤信息:

element type is invalid expected a string (for built-in components) or a class/function check 

解決:
升級庫

"react-native-svg": "^6.5.2",
"react-native-svg-uri": "^1.2.3"

react-native-root-siblings

錯(cuò)誤信息:

Exporting local "_default", which is not declared.

解決:
由于此庫近半年無人維護(hù),所以把源碼放到本地維護(hù)

export default class {
改為
export default class xxx { 

6.RN內(nèi)部組件的調(diào)整

Text/TextInput

錯(cuò)誤信息:

Text.prototype.render undefined

解決:

Text.prototype.render
改為
Text.render

create-react-class

錯(cuò)誤信息:

Module create-react-class does not exist in the Haste module map

解決:
由于把第三方庫引入本地,代碼老舊,新版已不支持create-react-class的方式,所以逐個(gè)改造為es6的語法

7.Android上的修改

解決完上面的問題,在iOS上就可以正常的跑起來了,但在Androidbuild都過不了。
想到客戶端同學(xué)之前提到的一個(gè)坑:

 //解決同一個(gè)庫依賴不同的版本 例如react-native 有0.49.5 有的是+ 統(tǒng)一成0.49.5
    subprojects {
        project.configurations.all {
            resolutionStrategy.eachDependency { details ->
                if (details.requested.group == 'com.facebook.react'
                    && details.requested.name.contains('react-native')) {
                    details.useVersion "0.49.5"
                }
                if (details.requested.group == 'com.airbnb.android'
                        && details.requested.name.contains('lottie')) {
                    details.useVersion "2.5.0"
                }
            }
        }
    }

他們需要把依賴的庫統(tǒng)一版本,于是把上述的0.49.5改為0.56.0

 //解決同一個(gè)庫依賴不同的版本 例如react-native 有0.56.0 有的是+ 統(tǒng)一成0.56.0
    subprojects {
        project.configurations.all {
            resolutionStrategy.eachDependency { details ->
                if (details.requested.group == 'com.facebook.react'
                    && details.requested.name.contains('react-native')) {
                    details.useVersion "0.56.0"
                }
                if (details.requested.group == 'com.airbnb.android'
                        && details.requested.name.contains('lottie')) {
                    details.useVersion "2.5.0"
                }
            }
        }
    }

重新build,成功了,但啟動(dòng)后馬上Crash,打開AndroidStudio發(fā)現(xiàn)有錯(cuò)誤信息:


解決:將這些項(xiàng)目android文件下的 ***.iml 文件刪掉,重新編譯
錯(cuò)誤信息沒有了,但啟動(dòng)依舊Crash,這時(shí)候和客戶端同學(xué)溝通可能是so庫的問題,于是替換了so庫(這里有一個(gè)小技巧,要獲得一個(gè)新版本的so庫,可以通過創(chuàng)建一個(gè)新版本的Demo,然后從中獲取),依舊出錯(cuò),但錯(cuò)誤信息變了:

java.lang.NoClassDefFoundError: Failed resolution of: Lcom/facebook/common/soloader/SoLoaderShim;

通過Google大致猜測是gif庫出了問題

 //fresco
    compile "com.facebook.fresco:animated-gif:$rootProject.ext.frescoVersion"
    compile "com.facebook.fresco:fresco:$rootProject.ext.frescoVersion"

官網(wǎng)的升級日志中查到

Update Fresco to v1.9.0, okhttp3 to v3.10.0

于是把版本改為1.9.0,重新編譯運(yùn)行,一切正常。

8.Android Jenkins 打包失敗

錯(cuò)誤信息:


解決:
這個(gè)問題相當(dāng)奇葩,幾乎找不到思路,試過刪除目錄,再拉代碼、拉庫都無效,最后是在react-native bundle命令加中增加一個(gè)--reset-cache參數(shù),清除打包的緩存文件,終于可以了。

9.Android Code-Push錯(cuò)誤

錯(cuò)誤信息(issue):

facebook::react::Recoverable: Could not open file ReactNativeDevBundle.js: No such file or directory

解決:
暫時(shí)還未解決,code-push的代碼中可以看到一段注釋說明解決代碼的片段,但實(shí)際仍未解決,不過好在只出現(xiàn)在本地開發(fā)模式,這個(gè)還需繼續(xù)跟進(jìn)。

三、總結(jié)

1.看升級日志

升級前,建議看一遍官方的升級日志,這樣可以對碰到的問題有預(yù)期和解決方向。

2.勤升級

有精力的話,建議更勤快的升級,這樣每次升級帶來的問題不會(huì)那么多,而且通過特定版本的升級日志通常就能定位問題。像這次跨多版本的升級,中間涉及的錯(cuò)誤修復(fù)可能需要你仔細(xì)閱讀多個(gè)版本的升級日志,困難度增大不少。

3.謹(jǐn)慎選擇第三方庫

對于第三方庫,除了高star,還要注意它的更新頻率。
如果在更新時(shí)碰到第三方庫出錯(cuò)并很長時(shí)間都無人維護(hù)了,可通過下面幾種辦法解決:

  • Fork一份,修改代碼,自己發(fā)npm或者引用fork地址;
  • 本地新建一個(gè)組件,利用繼承的方式,修改源碼,引用本地的新組件;
  • 把GitHub上的代碼直接放在本地維護(hù)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,640評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,682評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,011評論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,183評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,435評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,665評論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,838評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,379評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,627評論 2 380

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,765評論 25 708
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,814評論 2 59
  • 今天,沒有聽微課,沒有艾灸。很頹廢。給木澤做了一個(gè)蛋糕。 給他做蛋糕的時(shí)候,決定還是買一個(gè)吧。自己的難日,何必為難...
    馨兒媽閱讀 267評論 0 0
  • https://docs.python.org/3/library/functions.html 內(nèi)置的基本函數(shù)語...
    laughingsolo閱讀 455評論 0 0
  • 第14天 · 21天告別拖延 #玩卡不卡·每日一抽# 每一位都可以通過這張卡片覺察自己: 1、直覺他叫什么名字?...
    張夢格閱讀 227評論 0 0