React Nativeオープンソースアップデート 2019年6月
コードとコミュニティの健全性
過去6ヶ月間で、550人以上の貢献者によってReact Nativeに合計2800のコミットが行われました。コミュニティから400人の貢献者が1,150以上のプルリクエストを作成し、そのうち820のプルリクエストがマージされました。
過去6ヶ月間における1日あたりのプルリクエストの平均数は、Lean Coreの取り組みによってウェブサイト、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。様々なコンポーネントに不足していたアクセシビリティロールの数を追加し、将来のより良いウェブサポートのための新しいAPIを追加しました。
- AccessibilityInfo.announceForAccessibility。以前はiOSのみでしたが、Androidのサポートが追加されました。
- アクセシビリティアクションサポートの拡張。ユーザー定義のアクションに関するアクセシビリティを扱うためのコールバックが追加されました。
- iOSアクセシビリティフラグのサポートと「reduce motion」のサポート。
- 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週間余りで、コミュニティは約40のプルリクエストを送信し、flowで型付けされたネイティブモジュールに対するこの作業を完了しました。上記のすでに言及された人々に加えて、Michał Chudziak、Michał Pierzchała、Wojtek Szafraniec、Jean Regisser、そして1つ以上のプルリクエストを送信したすべての人々に感謝いたします。
- Haste: 2015年以来、React Nativeは、相対パスではなくグローバルIDによってモジュールをインポートできる「haste」モジュールシステムを使用してきました。これは便利ですが、多くのツールで十分にサポートされていません。James Ideは、Reactが何年も前にhasteを削除したのと同様に、hasteを削除することを提案しました。彼は傘のタスクを通じてすべての作業を計画し、それを実現するために18のプルリクエストを送信しました!詳細については、彼のTwitterスレッドをチェックしてください。
- Android Fragments: John ShelleyによるAndroid Fragmentsを通じてReact Nativeを動作させるという提案がマージされ、0.61で利用可能になります。Android Fragmentsの詳細はこちらでご確認ください。
リーンコア
リーンコアの主な動機は、モジュールを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)に増加しました。現在、マスターではバンドルサイズが28kb削減され、579kbになっています。これは100kb以上の差です!
リーンコアの取り組みの最初のイテレーションを終えるにあたり、React Nativeに追加される新しいAPIについてより意図的に取り組み、React Nativeをより小さく、より速くする方法を継続的に評価するとともに、コミュニティがさまざまなコンポーネントの所有権を持つことを可能にする方法を見つけるよう努力します。
ユーザーフィードバック
6ヶ月前、私たちはコミュニティに「React Nativeについて嫌いなことは何ですか?」と尋ね、人々が直面している問題の概要を把握することができました。私たちは数ヶ月前にその投稿に返信しました。主要な問題に関してこれまでに達成された進捗をまとめる時期が来ました。
- アップグレード: React Nativeコミュニティは、アップグレード体験を改善するために複数の取り組みを行いました。オートリンク、rn-diff-purgeを介したより良いアップグレードコマンド、アップグレードヘルパーウェブサイト(近日公開)。また、各メジャーリリースごとにブログ記事を公開することで、破壊的変更やエキサイティングな新機能を確実に伝達します。これらの改善の多くは、0.60リリース以降の将来のアップグレードを大幅に容易にするでしょう。
- サポート / 不確実性: 多くの人々は、プルリクエストの活動不足や、React Nativeに対するFacebookの投資に関する一般的な不確実性に不満を抱いていました。上記で示したように、私たちはさらに多くのプルリクエストを受け入れる準備ができており、皆様の提案と貢献を熱心に楽しみにしていると自信を持って言えます!
- パフォーマンス: React Native 0.59は、新しいより高速なJavaScriptCore(JSC)バージョンと共にリリースされました。別途、私たちはインラインリクワイヤをデフォルトで有効にすることを容易にするために取り組んでおり、今後数ヶ月でさらにエキサイティングな最新情報をお届けします。
- ドキュメント: 最近、React Nativeのドキュメントすべてを見直し、書き直す作業を開始しました。貢献を希望される場合は、ぜひお力をお借りしたいです!
- Xcodeでの警告: 私たちは既存の警告をすべて取り除き、新しい警告を導入しないよう努力しています。
- ホットリローディング: Reactチームは、まもなくReact Nativeに統合される新しいホットリローディングシステムを構築しています。
残念ながら、まだすべてを改善できたわけではありません。
- デバッグ: 私たちは、人々が毎日遭遇していた多くの不便なバグや問題を修正しましたが、残念ながら、望むほどこの点で進捗はありませんでした。React Nativeでのデバッグが優れているとは言えず、将来的にはこの改善を優先します。
- Metro symlinks: 残念ながら、これに対するシンプルで直接的な解決策はまだ実装できていません。しかし、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にも注目してください。きっとエキサイティングなものになるでしょう ✨