Vapor Trail

明るく楽しく元気よく

CapacitorかReact Nativeかクロスプラットフォームの選定に悩む

受託開発の仕事をしていると一般ユーザ向けのスマホアプリの開発でAndroidiOSの両方とも使用できるようにして欲しいという依頼が多い(業務用の場合はAndroid Onlyだけにして楽することもある)。

基本的に別々にネイティブアプリを作るという選択肢は無いが理由としては、

  • 小さい会社なので人手が足りない。
  • 予算がない。
  • 当然?納期が短い。
  • Kotlin、SwiftもしくはJavaObjective-Cの技術の知見がない。

といったことが挙げられる。

そうなるとWebの知識でスマホアプリを作ることができるハイブリッドアプリで作ろうということになるが、どのフレームワークで開発するのか悩んだ。

Capacitor(Ionic)

Cordovaの後継のCapacitorというプロジェクト。
自分はCordovaで作られたアプリ(バックエンドも含めて)の保守・運用を担当しているからとっつきやすそう。
Cordovaがつらい話はこちらが詳しいが個人的につらかったのは

  • LiveReloadに対応していないので開発しづらい。
  • webpackが使えない。
  • 結局ネイティブ層に手を入れている(当時はプラグインがなかったので自作したっぽい)。

今やCordovaの名前を殆ど聞かなくなってしまったが2016~17年の時点ではまぁベストな選択肢だったと思う。

「Cordovaつらい」を経験した自分としてはLiveReloadに対応しているのがアツい。
Ionic=AngularなイメージだったがReact・Vue.jsにも対応している。
ドキュメントがちゃんと日本語化されているのもポイント高い。

Capacitor: Webアプリのためのネイティブなクロスプラットフォームライブラリ
Ionic Framework - Ionic Framework 日本語ドキュメンテーション

ネット上でCapacitorやIonicを使用しているということを目にすることが少ないしまわりでも採用例を聞いたことがないのは懸念点。初めて知ったがクラスメソッドのカフェアプリはCapacitorを採用していた

ExpoもしくはReact Native

海外の有名企業で採用されている。TwitterなどでReact Nativeの名前をよく見るしまわりでもReact Nativeの採用例を聞く。
基本的なSDKが一通り揃ったExpoという開発ツールがあり開発体験が良い。ただしネイティブ層に手を入れることができないので要求される機能が実装可能かどうかよく検討したほうがよい。

懸念点としてReact Nativeのバージョンがいまだに0.63で3ヶ月ごとに大きな変更がある。
それにあわせてExpoも更新されるのでアップデートに追従するのがつらそう。 特にExpoのドキュメントがv35.0.0までしか表示されておらず、v34.0.0がリリースされたのが2019年6月なので1年経たたずにドキュメントが見れなくなくなるっぽい(どこかにあるのかもしれないけど)。

Expo maintains ~6 months of backwards compatibility. Once an SDK version has been deprecated, you will no longer be able to use the Expo client for development or build new binaries via expo build.
https://docs.expo.io/workflow/upgrading-expo-sdk-walkthrough/
Expo は ~6ヶ月間の後方互換性を維持しています。SDKのバージョンが非推奨になると、expo buildコマンドで新しいバイナリをビルドしたりExpoクライアントを開発に使用したりすることができなくなります。

アップデートに追従していく覚悟があるか。
開発が終了してポツポツと機能追加や変更があるような受託開発で採用すると保守がつらそう。

参考:2020 年の React Native 開発 - tomoima525's blog

Flutter

Dart言語なので自分以外のメンバーが保守・開発に参加することがより難しくなるので見送り。

別の問題

総合的に考えるとWebViewで十分な要求なのでCapacitorを採用することがプロジェクトにとっても会社にとっても良さそうなのだが、自分個人としてみるとその選択が果たして最良なのかという問題が出てくる。 エンジニアとして自分のスキルセットを考えたときにReact Nativeのスキルを身につけたほうが市場価値が上がり転職しやすいのではとか考えたりする。CapacitorとIonicの知名度が低いので職務経歴書が採用企業に引っかからない可能性がある。GreenやIndeedで検索してもReact Nativeのほうが求人多いし、今の時代なんでも即戦力求められるから経験ないとそもそも雇ってくれないし。基本的に「やりたいから」って理由で技術選択することは後でケツ拭く人のこと考えると好きじゃないけどどうするべきか。