React Nativeオープンソースアップデート 2019年6月
コードとコミュニティの健全性
過去6ヶ月間で、550人以上のコントリビューターによって合計2800のコミットがReact Nativeに対して行われました。コミュニティからの400人のコントリビューターが1,150件以上のPull Requestを作成し、そのうち820件のPull Requestがマージされました。
Lean Coreの取り組みによってウェブサイト、CLI、そして多くのモジュールをReact Nativeから分離したにもかかわらず、過去6ヶ月間の1日あたりの平均Pull Request数は3件から約6件へと増加しました。現在、オープンなPull Requestの平均数は25件以下であり、私たちは通常、数時間から数日以内に提案やレビューで返信しています。
意義のあるコミュニティからのコントリビューション
最近のコントリビューションの中から、私たちが素晴らしいと感じたいくつかをご紹介します。
- アクセシビリティ: React Native 0.60では、AndroidとiOSの両方でアクセシビリティAPIに多くの改善が施されます。新機能はすべて、基盤となるプラットフォームが提供するAPIを直接使用しているため、AndroidとiOSの両方でネイティブの支援技術と統合されます。Marc Mulcahy氏、Alan Kenyon氏、Estevão Lucas氏、Sam Mathias Weggersen氏、そしてJanic Duplessis氏のコントリビューションに感謝します。
- アクセシビリティのロールとステートの追加、そして新しいAccessibility States API。様々なコンポーネントに不足していたアクセシビリティのロールと、将来的にWebサポートを向上させるための新しいAPIが追加されました。
- AccessibilityInfo.announceForAccessibility。以前はiOSのみでしたが、Androidのサポートが追加されました。
- アクセシビリティアクションサポートの拡張。ユーザー定義のアクションに関するアクセシビリティを扱うためのコールバックが追加されました。
- iOSのアクセシビリティフラグのサポートと「視差効果を減らす」のサポート。
- Androidキーボードアクセシビリティの改善。キーボードナビゲーションでアクションを呼び出すための
clickable
プロパティとonClick
コールバックが追加されました(注意:これは近いうちにfocusable
に名称変更される予定です)。 - CALayersを使用してテキストを描画。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件のPull Requestが送られました。既に名前を挙げた方々に加え、Michał Chudziak氏、Michał Pierzchała氏、Wojtek Szafraniec氏、Jean Regisser氏、そして1件以上のPull Requestを送ってくださったすべての方々に感謝します。
- Haste: 2015年以来、React Nativeは「haste」モジュールシステムを使用していました。これは相対パスの代わりにグローバルIDでモジュールをインポートできる便利なものですが、多くのツールで十分にサポートされていませんでした。James Ide氏が、何年も前にReactがhasteを削除したのと同様に、hasteの削除を提案しました。彼はアンブレラタスクを通じてすべての作業を計画し、18件のPull Requestを送って実現させました!詳細は彼のTwitterスレッドをご覧ください。
- Android Fragments: John Shelley氏による、React NativeをAndroid Fragments経由で動作させる提案がマージされ、0.61で利用可能になります。Android Fragmentsについてはこちらをご覧ください。
Lean Core
Lean Coreの主な目的は、モジュールをReact Nativeから別のリポジトリに分離し、より良いメンテナンスを受けられるようにすることでした。わずか6ヶ月で、WebView、NetInfo、AsyncStorage、ウェブサイト、CLIといったリポジトリには、合わせて800件以上のPull Requestが寄せられました。メンテナンスの向上だけでなく、これらのプロジェクトはReact Native本体よりも頻繁に独立してリリースすることができます。
私たちはこの機会に、時代遅れのポリフィルやレガシーコンポーネントをReact Native本体から削除しました。ポリフィルは、古いバージョンのJavaScriptCore(JSC)でMap
やSet
のような言語機能をサポートするために過去には必要でした。React Nativeが新しいバージョンのJSCを搭載した今、これらのポリフィルは削除されました。
この作業はまだ進行中であり、ネイティブ側と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コミュニティは、アップグレード体験を改善するために様々な取り組みで結集しました。autolinking、rn-diff-purgeによるより良いアップグレードコマンド、アップグレードヘルパーウェブサイト(近日公開)などです。また、各メジャーリリースごとにブログ記事を公開し、破壊的変更やエキサイティングな新機能について確実に伝えていきます。これらの改善の多くは、0.60リリース以降の将来のアップグレードを大幅に容易にするでしょう。
- サポートと不確実性: 多くの人々がPull Requestに対する反応のなさと、FacebookのReact Nativeへの投資に関する全般的な不確実性に不満を感じていました。上で示したように、私たちは自信を持って、より多くのPull Requestに対応する準備ができており、皆さんの提案やコントリビューションを心待ちにしていると言えます!
- パフォーマンス: 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はすべてのPull Requestと内部の変更をまず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にもご注目ください。エキサイティングなものになるでしょう ✨