React Nativeとの比較
React Nativeでも紹介しましたが、モバイルフレームワークという点において、現時点でのFlutterの競合フレームワークはReact Nativeと言えるでしょう。そのため、React NativeよりもFlutterを選択する理由がどこにあるのかと興味を持つと思います。
さらに、FlutterはReact Nativeよりも広く普及していません。そのため、React Nativeの方が良いのではないかと思うのではないでしょうか。筆者も最初はそう思い、React Nativeを採用しましが、React Nativeを取り巻く環境が少々複雑に感じるようになってきました。特に、使い始めよりも、多少慣れてきたときの方がより一層難しく感じるようになりました。次に、筆者がReact Nativeで課題に感じたポイントを紹介します。
React Nativeを取り巻く環境の複雑さ
React Nativeは、これまで紹介したようにWeb技術を使っている開発者であればなじみやすいです。JavaScriptを使いつつ、それでいてモバイルアプリの問題を非常にうまく回避することができるソリューションです。
もちろん、JavaScriptではなくTypeScriptを使って開発することも可能ですが、Webアプリと同様にJSXも利用することができます。このような多様性は、Babelというツールに依存するところが大きいです。また、開発中のアプリをすぐに動作確認したい場合などにはExpoというより便利なツールも用意されています。こういった問題の回避や改善するための手法が複数あり、その結果として、関連するソリューションが多くなりすぎているといった印象を受けるかもしれません。
例えば、ReactもしくはReact Nativeで使われるソリューションとして、図4のようなものがあります。
最初は知らなくても手順通りにできてしまうのであまり気になりませんでした。しかし、開発が進んでいくと、いつの間にかモバイルアプリの問題解決よりも環境の問題解決に多く時間を割いているケースもありました。見つけた問題解決方法が、React Native以外に関する場合には、React Nativeでも適用できるのかを調べる必要があります。
そして、それぞれのツールやライブラリなどもReact Nativeと同期され、リリースされるわけではないので、時間の経過とともに問題解決の複雑度が増します。すでにこういった周辺環境を熟知し、それを継続していけるという場合でないと難しいです。
開発パターンへの理解の難しさ
ReactはWebアプリでも広く使われています。そのため、多くの開発パターンやノウハウの情報がたくさんあります。そして、WebアプリでReactを使って最適化できるようなケースは、かなり高度なWebアプリを作る必要があるケースです。そういった背景が、React Nativeを初めてモバイルアプリを作るためのソリューションとして選択する場合には、かえって理解を複雑にするかもしれません。
例えば、PCのような大きな画面でWebSocketを使ってリアルタイムで画面更新される株やFX売買アプリを作るケースでは、ReactやReactを取り巻くソリューションの恩恵を感じることでしょう。しかし、そのようなWebアプリの難易度に比べて、React Nativeを使ってモバイルアプリを作る場合にはシンプルな場合が多いはずです。
問題解決するための方法をWeb上で探すと、必要以上に難しい方法や、前提としている環境がWebアプリであったりすることも多々見かけます。React Nativeを通じて「アプリ開発」も、「React」も初めて挑戦するという場合には、それらの情報の前提や背景を吟味し開発をすすめることは難しいです。そういった背景が、React Nativeを使う際に失敗しやすい要因の1つとだと筆者は感じました。
Flutterのデメリット
React Nativeに対する課題を述べましたが、実はReactのメリットの1つとして、Reactというエコシステムに深く入り込むほど、Reactが便利になってくるという側面があります。
そして、Reactはサーバーサイドやフロントエンド、モバイルアプリまでカバーしています。そういった側面が、前述した通りReact Nativeのデメリットだと筆者は捉えました。しかし、できるだけ同じ言語や同じツールで異なるレイヤーの開発までをカバーしたいという場合には、やはりFlutterやDartは現時点では適した環境・言語とは言えません。
Flutterは現時点では、モバイルアプリ開発専用と言えます。その点をデメリットと思うか、メリットと思うかは置かれた状況によって変わってくるでしょう。