ReactNative アップグレード対応 v0.52 -> v0.56

みんな大好き恒例のアップグレードをしたので、その時にハマった事のメモ

今回は v0.52.2 から v0.56.0 にアップグレードした

前回のアップグレードよりは楽だったけど、本体のバグらしき罠にだいぶはめられた

ちなみに前回と同じく $ react-native-git-upgrade は使わずに

$ react-native init myApp で新たに作成したフォルダに自力で差分をみてマージをしてる

なんだかんだこの方法が一番キレイに出来る

差分の確認

念の為、今回のアップデートの差分を目視確認しておく

自分の環境に合わせて差分が見れるので、それを適用すればOK

Comparing rn-0.52.2...rn-0.56.0 · ncuillery/rn-diff · GitHub

AndroidcompileSdkVersion などが上がった対応

おそらくこれが今回の一番大きな変更

  • compileSdkVersion 23 -> 26
  • buildToolsVersion 23.0.1 -> 26.0.3
  • targetSdkVersion 22 -> 26

これにより、依存してるサードパーティが大体 23 のため、警告が出たりビルドが落ちたりする

正しい対策じゃないかもしれないけど

android/build.gradle に以下のコードを追加して対応した

subprojects {
    afterEvaluate {project ->
        if (project.hasProperty("android")) {
            android {
                compileSdkVersion 26
                buildToolsVersion '26.0.3'
            }
        }
    }
}

警告出されたけどビルドは通るようになった

※ 正しい方法があったら教えて下さい!

リリースビルドのアプリを起動すると直後にクラッシュする

こんなエラーが出てた

undefined is not an object (evaluating 'r.default')

結果的にいうと、原因は react-navigaiton だった

PRは却下されてるけど、とりあえずこの修正を適用すると動くようになる

Fix issue undefined is not an object evaluating r.default by ebaynaud · Pull Request #4699 · react-navigation/react-navigation · GitHub

import が正しく出来ないバグっぽいので、根本的な理由は多分 babel7 に移行したことで何か問題が起きてるのかな??

flowのエラー

型が強化されたみたいで、エラーがたくさん出た

気合で直す

CocoaPodsの修正

BatchedBridge がなくなって、代わりに CxxBridge を追加した

   pod 'React', :subspecs => [
      // ...
+    'CxxBridge',
-    'BatchedBridge'
   ], :path => '../node_modules/react-native'

正直このへんよくわからないし触りたくない

Jestが実行できない

Jestを実行すると、そもそも動かなくていろんなエラーがでて落ちる

Issueはこれ

github.com

package.json に以下のコードを追加したら動くようになった

  "jest": {
    "preset": "react-native",
     "transform": {
       "^.+\\.js$": "<rootDir>/node_modules/react-native/jest/preprocessor.js"
     }
  }

これはとりあえずの回避策で

PRはちゃんと出てるみたい: Fix jest-preset to use internal preprocessor (fix testing with 0.56) by vovkasm · Pull Request #20068 · facebook/react-native · GitHub

動くようになった

自分がハマったのはこれくらいです

--

※ 2018/07/25 追記

TextInputの日本語入力が出来ない件

すっかり忘れてたけど、直ってないじゃん!!

今の所、これが最善っぽい?

gist.github.com

元Issue: [iOS][TextInput] Fix controlled TextInput for Chinese (and other languages) by magicien · Pull Request #18456 · facebook/react-native · GitHub