mthr blog

あれやこれを書いたり

React Native 0.67.x にアップデートしようと思ったら、Expo 44.x の対応で右往左往した話

先日、React Native を 0.67.x にアップデートしました。経験的に、React Native のメジャーアップデート(数字的にはマイナーバージョンアップデート?)の場合は、何から問題があったりしますが、今回は違った大変さだったので、記録として残したいと思います。

React Native 0.67.x にアップデートしよう

既存アプリを早速 0.67 に挙げたところ、Android でビルドに失敗しました。ログを確認したところ、Gradle が 7.2 にアップデート されたことに伴い、Expo で失敗していました。Expo を Bare Workflow で利用してました。すぐさま、Expo の issue を見に行ったところ、対応中ということで、対応版のリリースを待つことになりました。

翌週、対応修正された Expo 44.0.6 が無事にリリースされました。それではと、0.67 のアップデート作業を再開したところ、今度は、iOS がビルドできない・・・。

Expo 44.x に対応する

またまた、Expo の issue を覗きに行きました。Expo 44.x で「Swift ネイティブモジュールのサポートに伴い、Objective-C と Swift の統合で問題が起った。具体的には、ヘッダーファイルのインポートで Swift が正しく解釈できないために問題が起こる」とのこと。詳しくは Kudo さんのコメント を参照してください。

iOS 向けにネイティブモジュールを利用している一部のライブラリで、この Expo 由来の問題が発生しました。Expo の導入で、どうしても Expo の設定に引っ張られるため、対応せざるを得ないようでした。

Expo は素晴らしいサービスですが、React Native アプリの1ライブラリである Expo のせいで、他のライブラリを修正対応しないといけないのは何か考えることはあります。しかし、Expo 並のクオリティがあるもの、代わりになるものもそうそうないので、対応しました。

Expo チームが既に有名所のライブラリで issue や PR を出して、修正に動いていたので、ライブラリを対応版にアップデートするだけすみました。中には、うちのライブラリは Expo 向けじゃないから、そのままクローズするところもありましたが、これも正しい対応だと思います。また、リリースが遅いライブラリに関しては patch-package を使って、自分でパッチを作って対応しました。

その他、自分で管理していたライブラリは Expo の問題には影響しなかったのですが、Gradle 7 対応にライブラリをアップデートしました。

まとめ

React Native のアップデートで何か問題は起こるだろうと思って挑んだところ、React Native 本体とは異なるところで振り回されました。今回のアップデートは久々に疲れた。Expo の改修も前向きな意味があるものなので、いつかやらないといけないことを今回やったと思えば、よい前借りだったのではないかと思っています。