React Nativeコアコントリビューターサミット2022
パンデミックとオンラインのみのイベントが数年続いた後、私たちはReact Nativeのコアコントリビューターを一同に集める時が来たと心から感じました!
そこで9月初旬、私たちはReact Nativeの主要コントリビューター、ライブラリメンテナー、MetaのReact NativeおよびMetroチームを集め、Core Contributor Summit 2022を開催しました。Callstackは、同時期に開催されたReact Native EUカンファレンスの一環として、ポーランドのヴロツワフにある本社でサミットを主催しました。
私たちはReact Nativeコアチームと共に、参加者が参加できる一連のワークショップを考案しました。トピックは以下の通りです。
- React Native Codegen & TypeScriptのサポート
- React Native新アーキテクチャのライブラリ移行
- React Native Monorepo
- Metro Web とエコシステムのアラインメント
- Metro の簡素化されたリリースワークフロー
私たちは、この2日間にわたる知識共有とコラボレーションの量に感銘を受けました。このブログ記事では、この集まりの成果を少しだけお見せしたいと思います。
React Native Codegen & TypeScriptのサポート
React NativeのCodegenは、React Nativeの新アーキテクチャの根幹をなす部分です。そのサポートと改善は、React Nativeの将来にとって最優先事項の一つです。例えば、今年初めには、FlowではなくTypeScriptの仕様から始まる汎用コードのサポートを追加しました。
このセッションでは、Codegenの主要な概念を説明し、その仕組みを記述することで、新しい貢献者をCodegenに迎え入れる機会を得ました。その後、主に2つの領域に焦点を当てました。
1. Codegenで現在サポートされていない新しい型のサポート。最も要望の多かったものの一つは、TypeScriptの文字列ユニオン型でした。
数名のチームがこのタスクに取り組むため会議室に移動しました。彼らは、Codegenの単体テストの実行方法など、途中でいくつかの困難に遭遇し、克服しました。コードの処理を開始する前に、コードの実行フローを理解するのにかなりの時間を費やしました。数時間の共同作業の後、文字列ユニオンを認識できる最初のプロトタイプが完成しました。この経験は、デザインパターンや将来望む理想的なアーキテクチャについて議論する上で非常に役立ちました。
2. ユースケースが不足していたiOSの自動リンクの改善。
具体的には、ライブラリとアプリがモノレポで共存しているシナリオでは、自動リンクがうまく機能しませんでした。Androidではすでにこのユースケースがサポートされていましたが、iOSでは不足していました。
Codegenのコントリビューターとの作業を通じて、そのコードベースでの作業が簡単ではないことに気づきました。たとえば、1つの型のサポートを追加するには、Flowで記述されたスペックを持つモジュール、TypeScriptで記述されたスペックを持つモジュール、Flowで記述されたスペックを持つコンポーネント、TypeScriptで記述されたスペックを持つコンポーネントの4つの異なる場所に同じコードをコピー&ペーストする必要がありました。
この気づきにより、私たちは、より保守しやすいコードベースへと状況を改善するため、コミュニティに助けを求める包括的なタスクを作成しました。
参加は際立っており、最初の40タスクを5日間で迅速に割り当てることができました。10月末までに、コミュニティは47タスクを完了し、他の多くのタスクも準備が整っており、マージを待っています。
この取り組みは、これらの改善に貢献したすべての人々にとってHacktoberfestにも貢献しました!
React Native新アーキテクチャライブラリの移行
React Native分野で話題のホットなトピックは新アーキテクチャです。新アーキテクチャをサポートするライブラリの存在は、エコシステム全体の移行において極めて重要な点です。したがって、私たちはライブラリメンテナーが新アーキテクチャに移行するのをサポートしたいと考えています。
当初、このセッションはブレインストーミングとして始まり、コアコントリビューターはReact Nativeチームに新アーキテクチャに関するあらゆる質問をする機会を得ました。この対面でのフィードバックループは、コアコントリビューターにとっての明確化と、React Nativeチームにとってのフィードバック収集の両方にとって非常に重要でした。共有されたフィードバックや懸念の一部は、React Native 0.71で実装されることになります。
その後、可能な限り多くのライブラリを新しいアーキテクチャに実際に移行する作業に移りました。このセッションでは、react-native-document-picker、react-native-store-review、react-native-orientationなどのいくつかのコミュニティパッケージの移行プロセスを開始しました。
繰り返しになりますが、もしあなたがライブラリを移行中でサポートが必要な場合は、GitHubの新アーキテクチャワーキンググループにご連絡ください。
React Native Monorepo
現在、React Nativeの新しいバージョンをリリースすることは簡単ではありません。React NativeはNPMで最もダウンロードされているパッケージの1つであり、私たちはリリースプロセスがスムーズであることを確認したいと考えています。
そのため、react-nativeリポジトリをリファクタリングし、Monorepo RFC(#480)を実装したいと考えています。
このセッションでは、まずブレインストーミングを行い、すべてのコントリビューターから意見を収集しました。下流の依存関係に対する破壊的変更を減らすために、リポジトリを進化させることが重要だからです。
その後、2つの側面で作業を開始しました。まず、モノレポをサポートするためにContinuous Integrationインフラストラクチャを拡張し、テストインフラストラクチャにVerdaccioを追加する必要がありました。次に、いくつかのパッケージの名前変更とスコープの追加を開始し、6つの異なる貢献をもたらしました。
この取り組みの状況は、この包括的な課題の下で追跡できます。近いうちに、この取り組みについてさらに詳しく共有できることを願っています。
Metro Webとエコシステムの連携
私たちのJavaScriptバンドラーであるMetroは、React Nativeの開発体験の基盤であり不可欠な部分であり、JSエコシステムの最新標準と連携することを確認したいと考えています。
このセッションの焦点は、Metroの機能セットを改善し、Webユースケース、npm、およびバンドラーエコシステムでより効果的に機能するように議論することでした。議論の主要な2つの領域
1. "exports"(パッケージエントリーポイント)仕様の採用
"exports"仕様の採用には大きな可能性があります。このセッションでは、"exports"でプラットフォーム固有のコードをどのように扱うかについて議論しました。多くの要因を考慮し、Metroリゾルバーに"strict"モードと"non-strict"モードを追加することで、"exports"の非常に非破壊的な展開計画を考案しました。builder-bobを活用することが、ライブラリ作成者が摩擦なくstrictモードを採用するのにどのように役立つかについて議論しました。
この議論の結果
- パッケージのエクスポートがReact Nativeでどのように機能するかについてのMetroに関するRFC。
- 「react-native」をコミュニティ条件として含めるためのNode.jsに関するRFC。
2. Webとバンドラーエコシステム
Metroチームは、Expoとのパートナーシップからの進捗と、今後のバンドル分割およびツリーシェイキングのサポートについてもこの作業モデルを継続する意向を共有しました。ESモジュールのサポートについて再び触れ、Yarn PnPやWebでの出力最適化などの将来の潜在的な機能について検討しました。MetroのコアがJestとロジックやデータ構造を共有していること、そして再利用の機会について議論しました。
開発者は、バンドル分割とサードパーティツールとの相互運用性に関する洞察に満ちたユースケースを提示しました。これにより、Metroの潜在的な拡張ポイントと現在のドキュメントの改善について議論することにつながりました。
この議論は、翌日のリリースワークフローの簡素化に関するセッションのための良い基盤となりました。
Metroのリリースワークフローの簡素化
前述のように、React Nativeのリリースは簡単ではありません。
React Native、React Native CLI、そしてMetroをリリースする必要があるため、事態はさらに複雑になります。これらのツールは、React NativeとCLIがどちらもMetroに依存しているため、相互に接続されています。これにより、いずれかのパッケージが新しいバージョンをリリースする際に、いくつかの摩擦が生じます。
現在、私たちはこれを直接的なコミュニケーションと同期リリースを通じて管理していますが、改善の余地があります。
このセッションでは、React Native、Metro、CLI間の依存関係を再検討しました。React NativeからCLIを抽出した「Lean Core」の取り組みにおけるいくつかの設計上の決定が、これらの2つのプロジェクトを相互依存させ、機能の一部が重複していたことが明らかになりました。当時の決定は理にかなっており、CLIチームはこれまで以上に迅速に反復することができました。
それらを見直し、両チームの経験を活かして道筋を見つける時が来ました。その結果、Metroチームが@react-native-community/cli-plugin-metroの開発を引き継ぎ、一時的にReact Nativeのコアに戻し、その後おそらくMetroモノレポに移動することになります。

ホワイトボードにパッケージ間の依存関係を3時間描き続けたこととは別に、最大の収穫は、CLIとMetroチームがそれぞれの課題、経験、計画を共有し、互いの理解を深めることができたことでした。
実際に顔を合わせなければ、これほどの協力関係を築くことはできなかったでしょう。
数日間一緒に過ごした数時間が、これほど多くの知識共有とアイデアの相互作用をもたらしたことに、私たちは今でも感銘を受けています。このサミットでは、React Nativeエコシステムを改善し、再形成するのに役立つイニシアチブの種をまきました。
私たちを主催してくださったCallstack、そしてCore Contributor Summit 2022にご参加くださったすべての参加者の皆様に改めて感謝申し上げます。
React Nativeの開発に参加にご興味のある方は、ぜひ私たちの公開イニシアチブに参加し、ウェブサイトにある貢献ガイドをお読みください。将来、皆様に直接お会いできることを願っています!

