メインコンテンツへスキップ

React Nativeオープンソースアップデート 2019年6月

·9分で読めます
Christoph Nakazawa
Christoph Nakazawa
元Facebookエンジニア

コードとコミュニティの健全性

過去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件以下であり、私たちは通常、数時間から数日以内に提案やレビューで返信しています。

意義のあるコミュニティからのコントリビューション

最近のコントリビューションの中から、私たちが素晴らしいと感じたいくつかをご紹介します。

Lean Core

Lean Coreの主な目的は、モジュールをReact Nativeから別のリポジトリに分離し、より良いメンテナンスを受けられるようにすることでした。わずか6ヶ月で、WebViewNetInfoAsyncStorageウェブサイトCLIといったリポジトリには、合わせて800件以上のPull Requestが寄せられました。メンテナンスの向上だけでなく、これらのプロジェクトはReact Native本体よりも頻繁に独立してリリースすることができます。

私たちはこの機会に、時代遅れのポリフィルやレガシーコンポーネントをReact Native本体から削除しました。ポリフィルは、古いバージョンのJavaScriptCore(JSC)でMapSetのような言語機能をサポートするために過去には必要でした。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コミュニティは、アップグレード体験を改善するために様々な取り組みで結集しました。autolinkingrn-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 ReactReact Native EUで講演します。また、間もなくリリースされる次のバージョン、0.60にもご注目ください。エキサイティングなものになるでしょう