こんにちは。渡辺と申します。
5 年ぶりのReact Native Advent Calendarです。
先日のReact Native Japanのイベントで話を聞いて、久しぶりに書いてみようと思ったものの、すっかり期限を失念して当日夜になってしまいました。
思い返すと前回の2020年もその前の2019年にも2018年も期限をまもらなかったので、いままで何も成長していなかったのかもしれません。
そして、なにか書くといいつつ、何も他のみなさまのように有用な書くことが思いつかないので、過去 8~9 年間の自分とReact Nativeの案件を振り返ってみようと思います。
ポエムです。
2017年 - React Native との出会い
最初のReact Native案件は、コミットログを見返してみたところ、2017年6月でした。
当初開発者としてはなく、PMとして参加していたのですが、なし崩し的に開発にも関わることになりました。
コミットログを見返すときに当時のコードも少し見返してみたのですが、ちょっと吐き気がしたのですぐ閉じました。
採用理由は今となってはおぼろげですが、iOSエンジニアとの雑談で「こういうフレームワークもありますよ」と聞き、ミーハーな好奇心から「試してみようか」という軽いノリで決めた記憶があります。
何より衝撃的だったのは、ネイティブアプリ開発の経験がない自分でも、React Nativeなら実用的なアプリを作れるという事実でした。その感動から、以降のアプリ案件はほぼすべてReact Nativeで進めることに。
そのあとアップグレードで地獄をみるともしらずに、、
当時の技術選択で一つ後悔しているのが、2017年時点ではTypeScriptの導入が遅れたことです。一部でプレーンなJavaScriptを使い、別のプロジェクトではFlowに手を出したりと、技術スタックが統一されないまま負債を積み上げてしまいました。
2018-2019年 - 現実と向き合う
2018年:深淵を覗く
最初の年には、目新しさからかご機嫌に嬉々としてReactNativeをさわっていたものの、2018年にもなると徐々に深淵に触れ、苦しみも増えてきました。
しかし、ネイティブ開発と比較した開発速度の優位性は明確で、まだFlutterのような代替手段も今ほど有力な選択肢ではなかったので、引き続き積極的に採用していました。
この年は、Airbnbが「React Nativeから撤退する」というニュースが流れ、コミュニティにざわつきが広がりました。
「React Nativeはオワコンか?」というような議論もちらほら聞くようになっていました。
2019 年:アップグレード地獄との戦い
3年目になり、この辺りになると少し飽きてきているというのと、運用の中でのアップグレードのつらさに直面し、少し苦しさの方が上回ることの方が多かったです。
特に品質がまちまちな外部ライブラリを多数導入していたプロジェクトでは、アップグレード時にビルドが通らず、深夜まで泣きながらGitHubのIssueを漁る日々が続きました。
(逆にいうとIssueを掘る日々にエンジニアとしての基礎体力を鍛えてもらった気がします)
Nativeレイヤーとの連携や、特にAndroidでのパフォーマンスの問題など、容易には解決できない課題にも直面していました。
Expoを利用した案件も多かったのですが、当時は苦しみが前に出過ぎたのか辛い気持ちが前面にでたアドベントカレンダーを書いていました。懐かしい。
https://qiita.com/muzou/items/f50a6dca3aa3a8f53695
一方で、Reactにおける大きな進化もありました。React Hooksがデファクトスタンダードとなり、非同期処理やReduxのmiddlewareで扱っていたような副作用を伴う処理の記述が劇的に簡潔になりました。
個人的にすごく嬉しかったものの、既存プロジェクトの移行には工数がかかり、頭を悩ませました(実は今でも一部で古い書き方が残っています)。
2020-2023年 - 距離を置いた年月
この時期、会社の主力の案件がWeb中心にシフトしたこともあり、少しReact Nativeから距離を置くようになりました。
とはいえ運用はあるので、iOS/AndroidのOSの更新だったり、それに伴うReact Nativeのアップグレードだったり、「酸いも甘いも、」のうち酸っぱいものばっかり食べてました。
完全に主観ですが、このころReact Nativeはオワコンで、Flutterの方が今どきだべ、みたいな空気感が醸成されていた気もします。
「Flutterはできませんか?」というような相談が本当に何件も来ていました。(毎回断っていたので来なくなりました。。)
私自身、Flutterに心が動かされて少し浮気しそうな気持ちになったことも少なからずあるのですが、なんといっても日頃Webの開発があり、普段Next.js/Reactを触っている身からすると、心理的な切り替えコストを無視できず、少し消極的な理由で React Native を採用しつづけていました(といっても新規のアプリは少なかったのですが)
2024 年 - 静かな進化
この頃もあまり積極的なキャッチアップはしていなかったのですが、運用案件で継続的に関わってはいたので、ExpoのCNGが非常に強力になっていたり、HermesやNew Architectureだったり、進化している感、を感じてはいました。
詳細は理解しきれていなくても、「なんか、確実に良くなっている」という感覚がありました。
2025 年 - 再評価の時
近年どちらかというと消極的な選択として選定していたReact Nativeなのですが、一周して結構いいのではと思ってきています。
なぜ今、React Native なのか
1. パフォーマンスの向上
- スマートフォン自体の高スペック化
- New Architecture によるアーキテクチャの改善
- Hermes エンジンの最適化
まずは、パフォーマンス面ですが、そもそもスマホの端末自体のスペックも向上していますし、アーキテクチャ的にも改善が積み重ねられ、2010年代によく感じてたような問題に遭遇することが、ほとんどなくなってきました。
もちろん、再レンダリングが多発するような書き方だったり、とんでもない処理を入れたりとかでまだ問題になるケースもあるとは思いますが、React 自体習熟したエンジニアさんが世の中に増えてきているので、昔見かけたようなとんでもない再レンダリング数を誘発するコード、みたいなものは見かけなくなってきました。
2. 環境構築の簡素化
Expoの進化により、かつて悪夢だったネイティブモジュールの設定やビルド環境の構築が大幅に簡素化されました。
EASビルドを利用することで、なぜか他の人はビルド通るけれども自分は通らない、といった謎の環境依存の問題に悩まされることも少なくなりました。
(とはいえローカルでのビルドやExpo抜きのプロジェクトも全然扱っていますが)
3. 生成AIとの相性の良さ
2024-2025年のトレンドといえば生成AIを利用したCoding Agentをつかった開発かと思いますが、React/Typescriptの学習ソースが潤沢にあるためか、React Nativeにおいても違和感なく活用できている印象があります。
(もちろんReact Native自体のコードも大量に世の中にあるので、それもあると思いますが)
Reactでの設計パターンも、プロジェクトの大小に合わせて様々なアプローチがあるかと思いますが、ReactNativeでもほぼそのまま思想を取り入れることができるので、AIへの指示でも比較的伝えやすい?ような気がしています。
ちょっと他の言語で試していないので、比較優位なのかは不明ですが、おそらくAIが取り組みやすい言語、フレームワークであることは間違いないのかなと思います。
まとめ:
- 環境構築 → Expoが解決
- パフォーマンス問題 → Hermes、New Architecture、ハードウェア進化が解決
- 学習・開発効率 → 生成AI、成熟したエコシステムが後押し
かつての主要な欠点が軽減され、React Nativeの本来の強みがより際立つようになってきています。
結論
React Native はオワコンじゃなかった
Showcase みても Meta、Microsoft、Amazon、Discord ... 全然大丈夫そうです!
https://reactnative.dev/showcase
ということで、これからもRNにbetしていきたいと思います。
また5年後に答え合わせさせてください。