## 升級(jí)版本:0.59.9 => 0.61.5
react-native有兩種升級(jí)方式,第一種就是使用官方的升級(jí)工具自動(dòng)升級(jí),分別執(zhí)行 `npm install -g react-native-git-upgrade` 和 `react-native-git-upgrade` 進(jìn)行自動(dòng)升級(jí)撒桨,然后解決沖突就可以了玩祟,然而過(guò)來(lái)人都不推薦我使用這種升級(jí)方法孽椰,
最終我采取了手動(dòng)進(jìn)行升級(jí)的方法鹃愤,雖然第三方庫(kù)要一個(gè)一個(gè)升級(jí),但好過(guò)控制臺(tái)拋出一個(gè)又一個(gè)安卓或ios的原生問(wèn)題體驗(yàn)要友好的多如绸,尤其是對(duì)于我這種沒(méi)有接觸過(guò)安卓和ios開(kāi)發(fā)的菜鳥(niǎo)來(lái)說(shuō)嘱朽。
#### 升級(jí)步驟:
1. 新建一個(gè)reactnative0.61.5項(xiàng)目,并運(yùn)行在ios和Android上怔接;
2. 把舊項(xiàng)目的 `package.json` 中的第三方庫(kù)一個(gè)一個(gè)的安裝在新項(xiàng)目中搪泳,安裝一個(gè)運(yùn)行一個(gè),成功一個(gè)就使用git保存一個(gè)扼脐;
**注: 一定要安卓及ios兩個(gè)平臺(tái)都運(yùn)行一下岸军,不然后面出錯(cuò)可能就要回退git以排查錯(cuò)誤是何時(shí)產(chǎn)生的,血與淚教訓(xùn)**
3. 所有第三方庫(kù)都安裝并成功運(yùn)行后瓦侮,就可以把js代碼復(fù)制到新項(xiàng)目文件夾中了艰赞,
然后運(yùn)行看控制臺(tái)輸出的錯(cuò)誤更改就行了,一般都是庫(kù)API變更的錯(cuò)誤脏榆,按照提示或者查找API變更就可以了猖毫;
#### today Extension的遷移
如果項(xiàng)目的小組件是純ios項(xiàng)目台谍,那么新建一個(gè)同名 `today Extension` 項(xiàng)目,然后將原 `today` 項(xiàng)目文件夾內(nèi)的文件粘貼到新建的項(xiàng)目文件夾下是最簡(jiǎn)單的方法须喂,沒(méi)有之一,如果運(yùn)行產(chǎn)生了錯(cuò)誤趁蕊,多半是一些文件的引入問(wèn)題坞生,在 `today Extension` 項(xiàng)目的 `Build Phases` => `Complie Sources` 或者 `Build Phases` => `Link Binary With Libraries`添加相應(yīng)的文件或者庫(kù)即可 。
到此rn的升級(jí)就結(jié)束了掷伙,以下是我安裝第三方庫(kù)時(shí)遇到的部分問(wèn)題記錄:
## 部分三方庫(kù)問(wèn)題記錄
#### react-native-fast-image
安裝 `react-native-fast-image` 后是己,執(zhí)行 `cd ios && pod install && cd ..` 時(shí),Installing libwebp (1.0.3)出現(xiàn)了錯(cuò)誤任柜,說(shuō)安裝libwebp時(shí)失斪浞稀:
```javascript
[!] Error installing libwebp
[!] /usr/bin/git clone https://chromium.googlesource.com/webm/libwebp /var/folders/b0/10b_68z1047902d7pkxmbkcc0000gn/T/d20200204-17461-u7zr2x --template= --single-branch --depth 1 --branch v1.0.3
Cloning into '/var/folders/b0/10b_68z1047902d7pkxmbkcc0000gn/T/d20200204-17461-u7zr2x'...
fatal: unable to access 'https://chromium.googlesource.com/webm/libwebp/': Failed to connect to chromium.googlesource.com port 443: Operation timed out
```
查詢了很多資料沛厨,有兩種解決方法,第一種配置終端的代理摔认,然而對(duì)我沒(méi)有用逆皮,這里就不記錄了,我使用了第二種方法:使用鏡像参袱。
mac系統(tǒng)打開(kāi) `/Users/你的電腦用戶名/.cocoapods/repos/master/Specs/1/9/2/libwebp/1.0.3/libwebp.podspec.json` 电谣,將
```json
"git": "https://chromium.googlesource.com/webm/libwebp"
更改為
"git": "https://github.com/webmproject/libwebp"
```
然后重新 `pod install` 就好了。
#### react-native-splash-screen
配置好 `react-native-splash-screenios` 之后抹蚀,并在 `ios/項(xiàng)目名/Images.xcassets` 下的兩個(gè)文件夾分別配置好桌面圖標(biāo)和啟動(dòng)屏之后剿牺,啟動(dòng)屏并沒(méi)有生效,如果xcode的版本是11环壤,那么打開(kāi)Xcode晒来,點(diǎn)擊 `LaunchScreen.xib` 文件,把右側(cè)的 `Use Launch Screen` 取消選中郑现,然后在 `General` => `App Icons and Launch Images` 選項(xiàng)中潜索,將 `Launch Screen File` 清空,最后在 `Build Settings` => `Copy Bundle Resources` 添加啟動(dòng)屏文件的路徑懂酱;
#### react-native-spring-scrollview
`react-native-spring-scrollview2.0.23` 在reactnative0.6+以上版本會(huì)出現(xiàn)錯(cuò)誤竹习。把 `node_modules/react-native-spring-scrollview/SpringScrollView.js` 中 `TextInputState` 的導(dǎo)入路徑換成
```js
import * as TextInputState from "react-native/Libraries/Components/TextInput/TextInputState";
```
就可以了。
#### react-native-largelist-v3
在rn0.61.5中列牺,如果不指定 `renderHeader` 固定在頭部整陌,安卓真機(jī)和ios模擬器不會(huì)顯示`renderHeader` ,但會(huì)空出空白區(qū)域瞎领,修改 `node_modules/react-native-largelist-v3/LargeList.js` 中函數(shù) `_renderHeader` 的
```js
style={StyleSheet.flatten([header.props.style, { transform, zIndex }])}
//? 修改為:
style={StyleSheet.flatten([header.props.style, { transform: transform.length ? transform: undefined, zIndex }])}
```
就可以了泌辫。
#### 忘了具體那個(gè)庫(kù)了
運(yùn)行在安卓時(shí),控制臺(tái)拋出了 `D8: Cannot fit requested classes in a single dex file (# methods: 66423 > 65536)` 的錯(cuò)誤九默,是說(shuō)方法數(shù)量超出一個(gè)dex文件數(shù)量限制震放,只要在目錄下的app/build.gradle文件中添加 `multiDexEnabled true` 即可。
```
defaultConfig {
? ? ? ? ... ...
? ? ? ? multiDexEnabled true
? ? }
```