React Nativeオープンソースアップデート 2019年6月
コードとコミュニティの健全性
過去6か月で、550人以上のコントリビューターによって、合計2800件のコミットがReact Nativeに行われました。コミュニティの400人のコントリビューターが1,150件以上のプルリクエストを作成し、そのうち820件のプルリクエストがマージされました。
過去6か月間の1日あたりのプルリクエストの平均数は、リーンコアの取り組みを通じてウェブサイト、CLI、および多くのモジュールをReact Nativeから分離したにもかかわらず、3件から約6件に増加しました。オープンなプルリクエストの平均数は現在25件未満であり、通常、数時間または数日以内に提案とレビューで返信しています。
有意義なコミュニティ貢献
素晴らしいと思った最近の貢献をいくつか紹介します。
- アクセシビリティ:React Native 0.60には、AndroidとiOSの両方でアクセシビリティAPIへの多くの改善が同梱されます。すべての新機能は、基盤となるプラットフォームによって提供されるAPIを直接使用しているため、AndroidとiOSの両方でネイティブの支援テクノロジーと統合されます。Marc Mulcahy、Alan Kenyon、Estevão Lucas、Sam Mathias Weggersen、およびJanic Duplessisの貢献に感謝します。
- 追加のアクセシビリティロール+状態と新しいアクセシビリティ状態API。さまざまなコンポーネントに欠落していたアクセシビリティロールと、将来のWebサポートを向上させるための新しいAPIを追加しました。
- AccessibilityInfo.announceForAccessibility。以前はiOSのみだったAndroidのサポートを追加しました。
- 拡張されたアクセシビリティアクションのサポート。ユーザー定義アクションに関するアクセシビリティに対処するためのコールバックを追加しました。
- iOSアクセシビリティフラグのサポートと「モーションの削減」のサポート。
- Androidキーボードアクセシビリティの改善。キーボードナビゲーションを介してアクションを呼び出すための
clickable
プロパティとonClick
コールバックを追加しました(注:これはまもなくfocusable
に名前が変更されます)。 - CALayerを使用してテキストを描画。iOSで拡大されたテキストが消える問題を修正しました。
- 新しいアプリ画面:コミュニティは、0.60に実装された新しいアプリ画面のデザインを考え出しました。この画面は、ほとんどの人がReact Nativeを初めて使用するときに表示するものです。ドキュメントへの初回ユーザーのリンクが表示されるようになり、今後のウェブサイトのデザイン変更に合わせた外観になっています🌟。Orta、Adam Shurson、Glauber Castro、Karan Singh、Eli Perkins、Lucas Bento、およびEric Lewisのすべての作業とコラボレーションに感謝します!
- 「React Native Show」ビデオシリーズで新しいアプリ画面をチェックしてください。
- TurboModuleタイプ:新しいTurboModulesシステムでは、ネイティブで型安全な操作を保証するために、すべてのネイティブモジュールの型が必要です。わずか2週間強で、コミュニティはflow型ネイティブモジュールのこの作業を完了するために約40件のプルリクエストを送信しました。上記で既に言及した人々に加えて、Michał Chudziak、Michał Pierzchała、Wojtek Szafraniec、Jean Regisser、および1つ以上のプルリクエストを送信したすべての人々に感謝します。
- Haste:2015年以来、React Nativeは、相対パスの代わりにグローバルIDを使用してモジュールをインポートできる「haste」モジュールシステムを使用してきました。これは便利ですが、多くのツールでは十分にサポートされていません。James Ideは、Reactが数年前にhasteを削除したのと同様に、hasteを削除することを提案しました。彼は、包括的なタスクを通じてすべての作業を計画し、それを実現するために18件のプルリクエストを送信しました。詳細については、彼のTwitterスレッドを確認してください。
- Androidフラグメント:John ShelleyのAndroidフラグメントを介してReact Nativeを機能させるという提案がマージされ、0.61で利用可能になります。Androidフラグメントの詳細はこちら。
リーンコア
Lean Coreの主な動機は、React Nativeからモジュールを個別のリポジトリに分割し、より良いメンテナンスを受けられるようにすることでした。わずか6ヶ月の間に、WebView、NetInfo、AsyncStorage、ウェブサイト、CLIなどのリポジトリが、合わせて800件以上のプルリクエストを受けました。メンテナンス性の向上に加えて、これらのプロジェクトはReact Native自体よりも頻繁に独立してリリースできるようにもなります。
また、React Native自体から、時代遅れのポリフィルやレガシーコンポーネントを削除する機会も得ました。ポリフィルは、過去には古いバージョンのJavaScriptCore(JSC)でMap
やSet
のような言語機能をサポートするために必要でした。現在、React Nativeには新しいバージョンが搭載されているため、これらのポリフィルは削除されました。
この作業はまだ進行中であり、ネイティブ側とJavaScript側の両方で、さらに多くのものを分割または削除する必要がありますが、表面積とアプリサイズを増大させる傾向を逆転させることができたという初期の兆候が見られます。例えばJavaScriptバンドルを見ると、約1年前のバージョン0.54ではReact NativeのJavaScriptバンドルサイズは530kbでしたが、わずか6ヶ月後のバージョン0.57では607kb(+77kb)に増加しました。現在、masterブランチではバンドルサイズが28kb減少し579kbになっており、100kb以上のデルタとなっています!
Lean Coreの最初のイテレーションを終えるにあたり、React Nativeに追加される新しいAPIについてはより意図的に取り組み、React Nativeをより小さく、より速くする方法を継続的に評価し、さまざまなコンポーネントのオーナーシップをコミュニティが引き継げるようにする方法を見つけていきます。
ユーザーフィードバック
6ヶ月前、私たちはコミュニティに「React Nativeの何が気に入らないか?」と尋ね、人々が直面している問題の概要を把握しました。私たちは数ヶ月前に投稿に返信しており、上位の問題に対して行われた進捗状況をまとめる時期になりました。
- アップグレード: React Nativeコミュニティは、アップグレード体験を改善するために、オートリンキング、rn-diff-purgeによるアップグレードコマンドの改善、アップグレードヘルパーウェブサイト(近日公開)など、さまざまな改善を行いました。また、各メジャーリリースごとにブログ記事を公開することで、破壊的な変更やエキサイティングな新機能をお知らせします。これらの改善点の多くにより、0.60リリース以降の将来のアップグレードが大幅に容易になるでしょう。
- サポート/不確実性:多くの人々が、プルリクエストの活動不足や、FacebookのReact Nativeへの投資に関する一般的な不確実性に不満を抱いていました。上記で示したように、私たちはより多くのプルリクエストを受け入れる準備ができており、皆さんの提案と貢献を心待ちにしていると自信を持って言えます!
- パフォーマンス: React Native 0.59には、新しく大幅に高速化されたJavaScriptCore(JSC)のバージョンが搭載されました。また、デフォルトでinline-requiresを有効にしやすくする作業を進めており、今後数ヶ月の間にさらにエキサイティングなアップデートをお届けします。
- ドキュメント:私たちは最近、React Nativeのすべてのドキュメントをオーバーホールし、書き直す取り組みを開始しました。もし貢献したいと考えているなら、ぜひご協力をお願いします!
- Xcodeでの警告:私たちは既存のすべての警告を削除し、新しい警告を導入しないように努めています。
- ホットリローディング: Reactチームは、近いうちにReact Nativeに統合される新しいホットリローディングシステムを構築しています。
残念ながら、まだすべてを改善することはできませんでした。
- デバッグ:私たちは、人々が日常的に遭遇していた多くの不便なバグや問題を修正しましたが、残念ながら、これについては期待していたほどの進展が見られていません。React Nativeでのデバッグが優れていないことを認識しており、今後、この改善を優先します。
- Metroシンボリックリンク:残念ながら、これについてはまだシンプルで簡単な解決策を実装できていません。しかし、React Nativeユーザーは、さまざまな回避策を共有しており、それらが役立つかもしれません。
過去6ヶ月間の大きな変更を踏まえ、再び同じ質問をしたいと思います。最新バージョンのReact Nativeを使用しており、フィードバックしたいことがある場合は、「React Nativeの何が気に入らないか?」の新しいエディションにコメントしてください。
継続的インテグレーション
Facebookは、すべてのプルリクエストと内部的な変更を最初にFacebookのリポジトリに直接マージし、その後、すべてのコミットをGitHubに同期して戻します。Facebookのインフラストラクチャは、一般的な継続的インテグレーションサービスとは異なり、すべてのオープンソーステストがFacebook内で実行されているわけではありません。これは、GitHubに同期されるコミットが、オープンソースのテストを頻繁に壊し、修正に多くの時間がかかることを意味します。
React NativeチームのHéctor Ramosは、過去2ヶ月間、FacebookとGitHubの両方でReact Nativeの継続的インテグレーションシステムを改善することに費やしました。オープンソースのテストのほとんどは、変更がFacebookでReact Nativeにコミットされる前に実行されるようになったため、コミットが同期される際にGitHubでCIが安定した状態に保たれます。
次へ
React Nativeの将来に関する私たちの講演をぜひチェックしてください!今後数ヶ月のうちに、FacebookのReact NativeチームのメンバーがChain ReactとReact Native EUで講演を行います。また、間もなくリリースされる次のバージョン、0.60にもご期待ください。エキサイティングなものになるでしょう✨