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

一宁舰、前言

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

1.通過(guò)react-native-git-upgrade

因?yàn)檫@個(gè)方法是一鍵式升級(jí),所以它會(huì)改變項(xiàng)目中的iOS错维、Android文件姑尺,由于我們的項(xiàng)目是混合型的崖飘,這樣嚴(yán)重破壞了客戶(hù)端的代碼溯街,會(huì)讓解決沖突變得十分困難色迂,不推薦香缺。

2.通過(guò)修改package.jsonreact-native的版本號(hào)來(lái)升級(jí)

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

二兽埃、踏坑

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的一段代碼已無(wú)用,故刪除适袜。

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

錯(cuò)誤信息:

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

解決:
需要升級(jí) 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ù)過(guò)程中,經(jīng)常發(fā)現(xiàn)改動(dòng)了代碼但沒(méi)生效苦酱,這時(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.第三方庫(kù)錯(cuò)誤

react-native-scrollable-tab-view

錯(cuò)誤信息:

A trailing comma is not permitted after the rest element

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

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?

解決:
升級(jí)庫(kù)

"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 

解決:
升級(jí)庫(kù)

"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.

解決:
由于此庫(kù)近半年無(wú)人維護(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

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

7.Android上的修改

解決完上面的問(wèn)題,在iOS上就可以正常的跑起來(lái)了尾序,但在Androidbuild都過(guò)不了钓丰。
想到客戶(hù)端同學(xué)之前提到的一個(gè)坑:

 //解決同一個(gè)庫(kù)依賴(lài)不同的版本 例如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"
                }
            }
        }
    }

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

 //解決同一個(gè)庫(kù)依賴(lài)不同的版本 例如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,打開(kāi)AndroidStudio發(fā)現(xiàn)有錯(cuò)誤信息:


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

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

通過(guò)Google大致猜測(cè)是gif庫(kù)出了問(wèn)題

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

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

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

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

8.Android Jenkins 打包失敗

錯(cuò)誤信息:


解決:
這個(gè)問(wèn)題相當(dāng)奇葩,幾乎找不到思路励负,試過(guò)刪除目錄藕溅,再拉代碼、拉庫(kù)都無(wú)效继榆,最后是在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的代碼中可以看到一段注釋說(shuō)明解決代碼的片段考阱,但實(shí)際仍未解決,不過(guò)好在只出現(xiàn)在本地開(kāi)發(fā)模式鞠苟,這個(gè)還需繼續(xù)跟進(jìn)乞榨。

三、總結(jié)

1.看升級(jí)日志

升級(jí)前当娱,建議看一遍官方的升級(jí)日志吃既,這樣可以對(duì)碰到的問(wèn)題有預(yù)期和解決方向。

2.勤升級(jí)

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

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

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

  • Fork一份科吭,修改代碼昏滴,自己發(fā)npm或者引用fork地址;
  • 本地新建一個(gè)組件对人,利用繼承的方式谣殊,修改源碼,引用本地的新組件牺弄;
  • 把GitHub上的代碼直接放在本地維護(hù)姻几。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市势告,隨后出現(xiàn)的幾起案子蛇捌,更是在濱河造成了極大的恐慌,老刑警劉巖咱台,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件络拌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡回溺,警方通過(guò)查閱死者的電腦和手機(jī)春贸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)混萝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人祥诽,你說(shuō)我怎么就攤上這事譬圣。” “怎么了雄坪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵厘熟,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我维哈,道長(zhǎng)绳姨,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任阔挠,我火速辦了婚禮飘庄,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘购撼。我一直安慰自己跪削,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布迂求。 她就那樣靜靜地躺著碾盐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪揩局。 梳的紋絲不亂的頭發(fā)上毫玖,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音凌盯,去河邊找鬼付枫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛驰怎,可吹牛的內(nèi)容都是我干的阐滩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼县忌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼叶眉!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起芹枷,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衅疙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鸳慈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體饱溢,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年走芋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绩郎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片潘鲫。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖肋杖,靈堂內(nèi)的尸體忽然破棺而出溉仑,到底是詐尸還是另有隱情,我是刑警寧澤状植,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布浊竟,位于F島的核電站,受9級(jí)特大地震影響津畸,放射性物質(zhì)發(fā)生泄漏振定。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一肉拓、第九天 我趴在偏房一處隱蔽的房頂上張望后频。 院中可真熱鬧,春花似錦暖途、人聲如沸卑惜。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)露久。三九已至,卻和暖如春芋浮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壳快。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工纸巷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人眶痰。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓瘤旨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親竖伯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子存哲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,504評(píng)論 25 707
  • 用兩張圖告訴你,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料七婴? 從這篇文章中你...
    hw1212閱讀 12,693評(píng)論 2 59
  • 今天祟偷,沒(méi)有聽(tīng)微課,沒(méi)有艾灸打厘。很頹廢修肠。給木澤做了一個(gè)蛋糕。 給他做蛋糕的時(shí)候户盯,決定還是買(mǎi)一個(gè)吧嵌施。自己的難日饲化,何必為難...
    馨兒媽閱讀 259評(píng)論 0 0
  • https://docs.python.org/3/library/functions.html 內(nèi)置的基本函數(shù)語(yǔ)...
    laughingsolo閱讀 450評(píng)論 0 0
  • 第14天 · 21天告別拖延 #玩卡不卡·每日一抽# 每一位都可以通過(guò)這張卡片覺(jué)察自己: 1、直覺(jué)他叫什么名字吗伤?...
    張夢(mèng)格閱讀 211評(píng)論 0 0