React Nativeチームは先頃,React Native開発者を対象に,"あなたがReact Nativeで気に入らない部分は何ですか?"という,ひとつの質問の調査を行った。最初の不満として圧倒的に多かったのは,デバッグを含む開発者エクスペリエンスだった。コミュニティへの対応やドキュメントなども,不満な部分として際立っていた。多くの開発者が,React Nativeのアプリケーションプログラミングインターフェース(API)を拡張して,SVGでの開発などで頻繁に発生するユースケースに対応することを求めていた。ネイティブ風アプリケーションのためのシームレスでクロスプラットフォームな開発ツールという,React Nativeの目標がまだ実現できていないのではないか,と指摘する声もあった。
回答した開発者の大多数は,アップグレードに多くの労力が必要で,時間が掛かりすぎることを残念に思っていた。Jan Hesters氏は言う。
あるバージョンから別のバージョンへのアップグレードが難しく,たくさんの作業が必要です。特に,いくつかのバージョンをいくつか飛ばした状態から最新のバージョンにするには,バージョン毎に手作業でアップグレードしなければなりません。
デバッグエクスペリエンスが標準以下であるという指摘もある。Sèbastien Lorber氏は,次のように述べている。
例外の根本原因が簡単に突き止められないことがよくあります。Chromeデバッガのコンソールに表示されるスタックトレースが本来の場所ではなく
ExceptionManager
につながっている場合があり,デバッグに時間を要することが少なくないのです。componentDidCatch
を使っても,あまり役には立ちません。
改善の余地のある領域として,ツーリングに言及する開発者もいた。ホットリローディングが動作しない場合がある,スタイルシートに最適化の余地がある,警告が多すぎたり,意味不明なエラーを出すツールがある,などが指摘されている。古くなった依存関係が障害になる場合や,Cocoaでの開発が非常に煩雑な点も挙げられていた。Tycho Tatitscheffs氏が,この問題を詳しく説明している。
Cocoapodのサポートが不十分です。アップグレード時に動作しなくなることがよくあります。あまりにも問題が多いので,@ortaがネイティブな問題に自動的に対処するプラグインを開発しています – https://github.com/orta/cocoapods-fix-react-native.
CocoaはAppleのオブジェクト指向アプリケーションプログラミングインターフェースで,CocoaPodはSwiftおよびObjective-CのCocoaプロジェクトを対象とする依存関係マネージャである。iOS,tvOS,watchOS用にも同じようなAPIがあり,Cocoa Touchと呼ばれている。
Windows開発者の中には,プラットフォームの開発者エクスペリエンスが貧弱であることに嫌悪感を示すものいる。Attila Szeremi氏が言う。
これらプラットフォーム上での,React Nativeの開発者エクスペリエンスはひどいものです。ファイルウォッチャがファイル変更に追いつかないことはしょっちゅうです。最悪の場合,ホットリローディングが最初の5回程度しか動作せず,以降はまったく動かなくなるので,バンドラを何度も再起動しなければならなくなります。
一部の開発者からは,React Nativeの開発言語をJavaScriptからSwiftやKotlinに置き換えてはどうか,という提案もある。Ilja Daderko氏がそのメッリットを挙げている。
問題は多々あるでしょうし,rnを書き直すために必要な労力の大きさも理解しています。それでも,JavaScriptに慣れている人たちにとっては,SwiftやKotlinの方がずっとフレンドリだと思うのです。SwiftやKotlinの学習曲線はObjCやJavaほど急勾配ではないので,OSSのコントリビュータや,JS開発者からのカスタムネイティブモジュールも増えるかも知れません。
Githubのイシューへの対応の遅さやプルリクエストに対する無応答を,React Nativeチームによるコミュニティへの関心の欠如だと捉えている開発者もいる。この状況は,React Nativeオープンソースプロジェクトに対する開発者のコントリビューションに対して,マイナスに作用する可能性がある。実際に,コントリビューションプロセスが不必要に複雑だという声が,開発者の間に上がっている。コミュニティサポートが不十分であるという認識は,一部の開発者によれば,React Native全般に対する不確実性の意識や,将来に対する信頼性の低下をも生み出している。
ドキュメントに関しては,一般的な障害や既知の問題に関して,より多くのトラブルシュート情報の提供を求める声が上がった。ある開発者が,具体的な例を挙げている。
KeyboardAvoidingViewを適切に設定するのは,ほとんど不可能です。どの場合にどの動作を使用するのか,という点に関するドキュメントの記述があいまいであることや,他の状況(スクロールビューの内部あるいは近くなど)によって使用方法に一貫性がないことがその理由です。
ドキュメントをもっと充実させるか,あるいはreact-native-keyboard-aware-scroll-viewのような方法を採用することで,この問題は解決できるのではないかと思います。
https://github.com/APSL/react-native-keyboard-aware-scroll-view
Van der Auwermeulen Grègoire氏は別の例を挙げている。
ReactJSライフサイクルイベントがネイティブなライフサイクルイベントと一致していないため,JSスレッドで使用する上で問題となることが多いのです。高度で具体的な,ブリッジングの問題に関して,もっとドキュメントが必要です。
初心者向けの操作ガイドがあることは認識されているが,例えばライブラリ開発者用に,React Native内部の非公開機能のような高度な内容や,パフォーマンスの測定や最適化を取り上げたような,特定目的のドキュメントの必要性に対する意見もあった。
React NativeのAPIサーフェスに関しては,一部の開発者から,サードパーティライブラリが提供する機能をコアに組み込めるようにしたいという意見がある。SVCイメージやナビゲーション,ビューの再利用,プッシュ通知,カメラ,ビデオやオーディオや指紋認証{\5},モーションベースインターフェースなどが対象として挙げられている。
目標としている,ネイティブのようなユーザエクスペリエンスを提供できていない,という意見もある。ネイティブアプリとReact Nativeで開発されたようなハイブリッドアプリとの間では,依然として起動時間が重大な相違要因となっている。iOS上のエクスペリエンスがAndroidより優先されているという面で,クロスプラットフォームという目標を達成できていない,という指摘もある。Adam Burdette氏が次のように述べている。
Androidはいまだセカンドクラスの扱いです。iOSにはない,Android固有の障害が数多くあります。開発者の多くが,開発中のAndroidの問題を見逃しているのです。
例:
{0 && <View />}
はAndroidではクラッシュします。予期しない偽の値があると,Androidではエラー画面を表示することなくクラッシュするのです。戻り値がブール値であることを確認しなければなりません。iOSはこれを適切に処理しています。Androidではプロパティフレックスに名前を付けるとクラッシュしますし,secureTextEntry
の切り替えは数年前から動作しないままです。他にもたくさんありますが,クロスプラットフォームであるという主張をよりサポートする方向に開発を進めるには,Androidが今後の大きな焦点になるはずです。
React Native開発者の苦情が最も少なかったカテゴリはUI関連だった。スタイリングとスタイリングの不一致,zIndex
の不一致,自動スクロール,反転リスト,あるいはイメージの寸法などが挙げられていた。
今回の記事の主要な情報源でもあるGithubのイシューでは,React Nativeチームが開発者に対して,自身のReact Nativeでの経験に関する苦情を挙げるように要請していた。我々は81件の回答を分析し,5,486の"いいね"を集めて,6つのカテゴリに集約した。カテゴリは"いいね"の多い順に,"開発とデバッグ","コミュニティへの投資","ドキュメント","API","有効性","UI"である。
React Nativeは,JavaScriptとReactを使ってネイティブなモバイルアプリを記述するためのフレームワークである。Reactと同じように,開発者はコンポーネントツリーの形でユーザインターフェースを記述する。React(レンダラとしてReact DOMを使用する)と違うのは,コンポーネントツリーがモバイルデバイスのネイティブなAPIを使ってレンダリングされる点だ。iOSでは,React Nativeのコンポーネントは実際のUI View
にレンダリングされるが,Androidではネイティブなビュー
に書き込まれる。JavaScript層とネイティブ層は,ブリッジと呼ばれるソフトウェアを使ってコミュニケーションを持つ。
モバイルプラットフォームをターゲットにする開発者には,いくつかのテクノロジとスタックがある。アプリケーションは一般的に,モバイルアプリケーション,ハイブリッドアプリケーション,ネイティブアプリケーションの3つのカテゴリに分類される。ネイティブアプリケーションは特定のプラットフォームを対象とするもので,対応するテクノロジを使って開発され,コンピュータデバイス上にインストールされる。WebアプリケーションはWebテクノロジを使って開発され,ブラウザを通じて複数のプラットフォームで使用することが可能である。ハイブリッドアプリは,ネイティブとWebの両アプリケーションを組み合わせたものだ。ターゲットデバイスとは関係しない独自のテクノロジを使って開発されるが,一般的にはクロスプラットフォームである。
ハイブリッドアプリケーション開発用フレームワークとしては,React Native,Flutter,Xamarin,Ionicなどがある。