🐝

個人開発者から見た React Native (2021)

2021/01/12に公開2

こんばんは。@___35d です。会社を経営したり、個人開発で Web アプリやネイティブアプリを作ってる者です。今日は React Native について書こうと思います。

React Native 歴について

僕は、会社で2年、個人開発でも2年ほど React Native を使っていて(被っている期間もあるので期間で言うと3年くらい)、React Native でアプリを6本(仕事・プライベート合わせて)ほど 0 → 1 で作った経験があります(運用も2年ほどしていました)。

この記事の結論と、なぜ書こうと思ったのかについて

結論を先に書いてしまいます。React Native という技術は、

  • 向いてる人(組織)には向いてるし、向いてない人(組織)には向いてない
  • 向いてるプロダクトには向いてるし、向いてないプロダクトには向いてない
  • 個人開発にはけっこう向いてる気がする

です。(ほかの技術でも同じことかもしれませんが)すごく当たり前のことなのですが、向き不向きを度外視して、特定の技術を dis る主張が多すぎてげんなりしてきたのでこの記事を書き始めました。書き始めた理由がほかにもいくつかあって、まとめると、

  • 2年ほど前に、前職時代のテックブログで書いた React Native でアプリ開発をして良かったところ・ツラかったところ の情報が古くなってきた感があったのでアップデートしたかった
  • React Native という技術がどんな組織(人)に向いていて、どんな組織(人)に向いていないかという情報が日本語だとあまりないように感じた。(自分が思う)正しい情報を発信したかった
  • (React Native の特徴の一部のみを切り取って💩だという主張をよく見るような気がしたので、トータルで💩な部分、良い部分を伝える記事があれば良いなと思った)

だいたい言いたいことは終わりで、この記事の残りは、それぞれの結論の深堀りになります。


React Native が向いている組織

2年前に書いた記事の結論と変わっていません。ネイティブアプリエンジニア(iOS / Android)の開発リソースが潤沢な場合は React Native を採用するメリットはないと思います(断言)それぞれの開発チームを作り、それぞれが最高のアプリケーションを作りましょう。

「そんなのは理想論だ!」という企業は React Native の採用を検討しても良いかもしれません。Web エンジニアのリソースは潤沢だけれでも、ネイティブアプリエンジニアのリソースが少ない、みたいな組織の場合には、React Native は採用の余地があります。Swift / Kotlin で開発するよりも、 JavaScript(TypeScript)で書ける React Native は学習コストが比較的少なく済み、なおかつ iOS / Android がほぼ同じコードベースで動くのには計り知れないメリットがあります。

また、Web の技術スタックで既に React を採用しているといった場合には、さらに学習コストは少なく、さらに(きちんと設計されている場合に限りますが)、JavaScript(TypeScript)コードの共有も見込めます(モデル層・特定の hooks・コンポーネント等)

まとめると、以下のような組織には React Native が向いていると思います。

  • iOS / Android 両方のアプリを開発したいと思っているが、ネイティブアプリエンジニアのリソースが不十分
  • Web エンジニアのリソースには比較的余裕がある
  • React 等のフレームワークに抵抗がない(もしくは既に使用している)

(余談)表題にもある個人開発の場合には React Native はとても優れた技術だと思います。ほぼ共通のコードベースで、iOS / Android 両方のアプリを制作できるのは、計り知れないメリットがあります。

(余談)1人でデスクトップとモバイル両対応でデータ同期するアプリをどうやって作ったか にも書かれていますが、@craftzdog さんの個人開発アプリ inkdrop は React Native で制作されているそうです。5プラットフォーム(macOS、Linux、Windows、Android、iOS)で動くアプリケーションを、うまくコードを共通化しながら開発されているそうです。

React Native が向いているプロダクト

こちらは結論から書きます。以下をすべて満たす場合には、React Native の採用を検討しても良いプロダクトだと思います。

  • iOS と Android それぞれのネイティブにしかない機能を使用しない
  • ネイティブ拡張モジュールを(あまり)使用しない
  • (究極まで)パフォーマンスや UX を追求しない

(雑に言うと、Web API を叩いていい感じに描画するアプリ、みたいなやつだったら React Native でもいい感じに作れると思います)

(もっと雑に言うと、Expo(後述)で完結するアプリは React Native でいい感じに作れると思います)

機能に関して、React Native を採用したからと言って、ネイティブのモジュールを一切触れなくなるというわけではありません。ブリッジ と呼ばれる JavaScript とネイティブを繋ぐ機構が提供されており、これを使用することで、JavaScript からネイティブ層を操作することができるようになります。しかし、ここまでやってしまうと、クロスプラットフォーム開発のうまみはどこかに行ってしまい、iOS と Android それぞれで開発するのとほぼ工数変わらなくなるので、あまりオススメしません。(たとえば iOS の CallKit が機能要件に入ってきたらブリッジして Objective-C のコードを結局書くことになったりします。なら最初からネイティブで良かったじゃん、となりますよね。)

ネイティブ拡張モジュールが頻繁に登場すると、運用でツラミが増します。ぱっと動かすだけなら割とラクなのですが、いろいろとメンテナンスが大変になって運用コストが増す要因になります。ネイティブ拡張モジュールというのは、iOS や Android ネイティブのレイヤーにも変更が加わるモジュールです(iOS で言うと pod install が必要なやつです)これは JavaScript の世界のみで完結しないため、モジュールに不具合があったり、React Native のバージョンアップ・iOS のバージョンアップ等でかなり影響を受けやすいモジュールです。

  • モジュールにバグがあった場合にはネイティブのコードを読む必要が出てきたり
  • iOS / Android で API がそれぞれ異なっていたりすると、その分だけプロダクションコードに分岐が発生したり

ネイティブ拡張モジュールを使いまくる必要がありそうだったら、一度足を止めても良いかもしれません。

また、パフォーマンスや UX を追求するアプリは React Native の制約上 JavaScript のレイヤーではチューニングしきれないところがあるので、採用を見送った方が良いかもしれません。でもここまで追求するアプリは世の中そんなにない気がする……

(余談)Airbnb は2018年に React Native をやめると発表しました。「開発初期は良かったが、だんだんと Airbnb の求める品質は React Native では達成できなくなってきた」というような旨の話が書かれています。しかしこれは、かなり低レイヤーなレイアウトエンジン( Yoga )までも含めたパフォーマンスを追求した場合の話なので、相当(本当に相当)使い込まない限りはこのレベルまでは達しないと思います。

(余談)ちなみに、このあたりの問題をある程度解決してくれるのが Expo です。Expo は、React Native 周りの面倒事をまるっと解決してくれるツールです。アプリ開発でよく使われる機能群(タブやナビゲーション・アプリアイコン)をラップして使いやすいかたちで提供してくれたり、ビルドや証明書周りの面倒事をまるっとやってくれたり、テスト用アプリの配布をいい感じにやってくれたりと、とにかく素晴らしいツールです。特に理由がない限りは Expo を採用すると開発体験がぐっと良くなります。

Expo だけでは完結しない機能(In app purchase (アプリ内課金) 等)を使用するには、eject と呼ばれる Expo を剥がす操作をする必要があります。eject すると、Expo の便利な機能を使用することはできなくなり、iOS のビルドやアーカイブは XCode 上から行う必要があったりします。作るプロダクトがどの程度の機能要件なのかを

上でも書きましたが、 Expo で完結するような機能要件のアプリの場合には、React Native を採用するのが良いと思います。僕が作っている個人開発アプリ3本もすべて Expo で制作しました(1本は途中で eject しましたが) Expo は個人開発の強い味方です。

まとめ

使う場面をしっかり判断するのもエンジニアの仕事だと思っています。ただ技術を dis るのではなく、なぜ自分たちには合わなかったのか?までしっかり言語化することでコミュニティが発展していくと思います。

  • 組織・プロダクトの性質に応じて採用するか検討しましょう
  • 僕が作るような個人開発でのアプリ制作では React Native はかなり優秀

(参考記事)


  • けっこう怒りドリブンで一気に書き上げたので文章メチャメチャな気がしますゴメンナサイ
  • Flutter とか Xamarin とかのことは一切知らないので、そのへんとは比較できてないです

Discussion

Tsuburaya YujiTsuburaya Yuji

(勢いで書きなぐって公開したので後で恥ずかしくなって消す未来が見える)

uuyu-guuyu-g

React Nativeの採用を検討するのにとても参考になりましたのでぜひ残していただけると嬉しいです...!