サンフランシスコミートアップのレポート
先週、Zynga のサンフランシスコオフィスで開催された React Native ミートアップに参加する機会がありました。約 200 人が参加し、私と同じく React Native に興味を持っている他の開発者と出会うのに素晴らしい場所でした。
私は特に、Zynga、Netflix、Airbnbといった企業でReactとReact Nativeがどのように使われているかについて学ぶことに興味がありました。その夜のアジェンダは以下の通りでした。
- Reactにおけるラピッドプロトタイピング
- React NativeのためのAPI設計
- ギャップを埋める:既存のコードベースでReact Nativeを使用する
しかし、まずイベントは簡単な紹介と最近のニュースの簡単な要約から始まりました。
- React Nativeが今やGitHubでトップのJavaリポジトリであることをご存知でしたか?
- rnpm は React Native コアの一部になりました!これで、`rnpm link` の代わりに `react-native link` を使って、ネイティブ依存関係を持つライブラリをインストールできます。
- React Native Meetupコミュニティは急速に成長しています! 現在、世界中の様々なReact Nativeミートアップグループに4,800人以上の開発者がいます。
もしこれらのミートアップのいずれかがあなたの近くで開催されるなら、ぜひ参加することをおすすめします!
ZyngaでのReactにおけるラピッドプロトタイピング
最初のニュース発表の後、今夜のホストである Zynga から簡単な紹介がありました。アビシェク・チャダは、彼らが React をどのように使ってモバイルで新しい体験を素早くプロトタイプしているかについて話し、Draw Something のようなアプリの簡単なプロトタイプをデモしました。彼らは React Native と同様のアプローチを使い、ブリッジを介してネイティブ API へのアクセスを提供しています。これは、アビシェクがデバイスのカメラを使って聴衆の写真を撮り、誰かの頭に帽子を描いたときに実演されました。
NetflixでのReact NativeのためのAPI設計
次に、今夜最初の注目の講演。Netflix のシニアソフトウェアエンジニアであるクラレンス・リョンが、React Native のための API 設計について発表しました。まず、彼が挙げたのは、タブバーや日付ピッカーのようなコンポーネント、カメラロールやアプリ内課金のようなネイティブサービスへのアクセスを提供するライブラリという2種類の主要なライブラリです。React Native で使用するライブラリを構築する際には、2つのアプローチがあります。
- プラットフォーム固有のコンポーネントを提供する
- AndroidとiOSの両方で同様のAPIを持つクロスプラットフォームライブラリ
それぞれのアプローチには独自の考慮事項があり、自分のニーズに最も適したものを決定するのはあなた次第です。
アプローチ #1
プラットフォーム固有のコンポーネントの例として、クラレンスはReact NativeコアのDatePickerIOSとDatePickerAndroidについて話しました。iOSでは、日付ピッカーはUIの一部としてレンダリングされ、既存のビューに簡単に組み込むことができますが、Androidではモーダルで表示されます。この場合、個別のコンポーネントを提供するのは理にかなっています。
アプローチ #2
一方、写真ピッカーはAndroidとiOSで同様に扱われます。例えば、AndroidはiOSのようにSelfiesなどのフォルダに写真をグループ化しないなど、わずかな違いはありますが、それらは`if`文と`Platform`コンポーネントを使って簡単に処理できます。
どのようなアプローチを採用するにしても、API の表面積を最小限に抑え、アプリ固有のライブラリを構築するのが良いアイデアです。例えば、iOS のアプリ内課金フレームワークは、一度限りの消費型購入と、更新可能な定期購入をサポートしています。もしあなたのアプリが消費型購入のみをサポートする必要がある場合、クロスプラットフォームライブラリで定期購入のサポートを省略できるかもしれません。
Clarence氏のトークの最後には、短いQ&Aセッションがありました。そこから出てきた興味深い情報の一つは、Netflixでこれらのライブラリのために書かれたReact Nativeコードの約80%が、AndroidとiOSの両方で共有されているということでした。
ギャップを埋める:既存のコードベースで React Native を使用する
今夜の最後の講演は、Airbnb のリーランド・リチャードソンによるものでした。講演は、既存のコードベースで React Native を使用することに焦点を当てていました。私は React Native を使って新しいアプリをゼロから書くのがいかに簡単かを知っていたので、Airbnb が既存のネイティブアプリに React Native を採用した経験を聞くことに非常に興味がありました。
リーランドは、グリーンフィールドアプリとブラウンフィールドアプリについて話すことから始めました。グリーンフィールドとは、以前の作業を考慮せずにプロジェクトを開始することを意味します。これは、既存のプロジェクトの要件、開発プロセス、およびチームのさまざまなニーズを考慮する必要があるブラウンフィールドプロジェクトとは対照的です。
グリーンフィールドアプリに取り組んでいる場合、React Native CLI は Android と iOS の両方に単一のリポジトリを設定し、すべてが機能します。Airbnb で React Native を使用する最初の課題は、Android と iOS アプリがそれぞれ独自のリポジトリを持っていたという事実でした。複数のリポジトリを持つ企業は、React Native を採用する前にいくつかのハードルを乗り越える必要があります。
これを回避するため、AirbnbはまずReact Nativeコードベース用の新しいリポジトリを設定しました。彼らは継続的インテグレーションサーバーを使って、AndroidとiOSのリポジトリをこの新しいリポジトリにミラーリングしました。テストが実行され、バンドルがビルドされた後、ビルド成果物はAndroidとiOSのリポジトリに同期されます。これにより、モバイルエンジニアは開発環境を変更せずにネイティブコードに取り組むことができます。モバイルエンジニアはnpmをインストールしたり、パッカーを実行したり、JavaScriptバンドルをビルドすることを覚えたりする必要はありません。実際のReact Nativeコードを書くエンジニアは、React Nativeリポジトリで直接作業するため、AndroidとiOS間でコードを同期することを心配する必要はありません。
これにはいくつかの欠点がありました。主に、アトミックなアップデートをリリースできなかったことです。ネイティブコードとJavaScriptコードの組み合わせが必要な変更は、3つの別々のプルリクエストが必要となり、すべてを慎重に着陸させる必要がありました。競合を避けるため、ビルド開始後にマスターが変更された場合、CIはAndroidおよびiOSリポジトリへの変更の着陸に失敗します。これにより、コミット頻度の高い日(新しいリリースがカットされる日など)には長い遅延が発生する可能性がありました。
Airbnbはその後、モノレポアプローチに移行しました。幸いなことに、これはすでに検討されており、AndroidとiOSのチームがReact Nativeの使用に慣れると、彼らは喜んでモノレポへの移行を加速させました。
これにより、分割リポジトリのアプローチで抱えていた問題のほとんどが解決されました。Leland氏は、これがバージョン管理サーバーにより高い負荷をかけることになり、小規模な企業にとっては問題になる可能性があると指摘しました。
ナビゲーションの問題
リーランドの講演の後半は、私が心から関心を持っているトピック、つまりReact Nativeにおけるナビゲーション問題に焦点を当てていました。彼は、React Nativeにおける数多くのナビゲーションライブラリについて、ファーストパーティとサードパーティの両方について語りました。NavigationExperimentalは有望に見えたが、彼らのユースケースには適さなかったと述べられました。
実際、既存のナビゲーションライブラリはどれもブラウンフィールドアプリではうまく機能しないようです。ブラウンフィールドアプリでは、ナビゲーションの状態がネイティブアプリによって完全に所有されている必要があります。例えば、React Nativeビューが表示されている間にユーザーのセッションが期限切れになった場合、ネイティブアプリは必要に応じて制御を引き継ぎ、ログイン画面を表示できる必要があります。
Airbnbはまた、移行の一部としてネイティブナビゲーションバーをJavaScriptバージョンに置き換えることを避けたいと考えていました。その影響が不快になる可能性があったからです。当初、彼らはモーダル表示されるビューに限定していましたが、これは明らかにアプリ内でReact Nativeをより広く採用する際に問題を引き起こしました。
彼らは独自のライブラリが必要だと判断しました。そのライブラリは`airbnb-navigation`と呼ばれています。このライブラリはAirbnbのコードベースと強く結びついているため、まだオープンソース化されていませんが、年末までにはリリースしたいと考えています。
ライブラリのAPIについて詳しくは触れませんが、以下にいくつかの重要なポイントを挙げます。
- シーンを事前に登録する必要がある
- 各シーンは独自の
RCTRootView
内に表示されます。これらは各プラットフォームでネイティブに表示されます(例:iOSではUINavigationController
が使用されます)。 - シーン内のメインの
ScrollView
はScrollScene
コンポーネントでラップする必要があります。そうすることで、iOSでステータスバーをタップして一番上にスクロールするなどのネイティブの動作を活用できます。 - シーン間のトランジションはネイティブで処理されるため、パフォーマンスについて心配する必要はありません。
- Androidのバックボタンは自動的にサポートされます。
- Navigator.ConfigというUIレスコンポーネントを介して、View Controllerベースのナビゲーションバーのスタイリングを活用できます。
また、留意すべきいくつかの考慮事項もあります。
- ナビゲーションバーはネイティブコンポーネントであるため、JavaScriptで簡単にカスタマイズすることはできません。これは意図的なもので、ネイティブのナビゲーションバーを使用することがこのタイプのライブラリの厳しい要件だからです。
- ScreenPropsはブリッジを介して送信されるたびにシリアライズ/デシリアライズする必要があるため、ここで大量のデータを送信する際には注意が必要です。
- ナビゲーションの状態はネイティブアプリによって所有されているため(これもライブラリの厳しい要件)、Reduxのようなものでナビゲーションの状態を操作することはできません。
リーランドの講演の後にはQ&Aセッションも行われました。全体的に、AirbnbはReact Nativeに満足しています。彼らはApp Storeを介さずに問題を修正するためにCode Pushを使用することに興味を持っており、彼らのエンジニアはLive Reloadを気に入っています。なぜなら、彼らは少しの変更ごとにネイティブアプリが再構築されるのを待つ必要がないからです。
閉会の辞
イベントは、いくつかの追加のReact Nativeニュースで締めくくられました。
- DecoはReact Native Showcaseを発表し、全員に自分のアプリをリストに追加するよう呼びかけました。
- 最近のドキュメントの大幅な見直しが紹介されました!
- Deco IDEの制作者の一人であるDevin Abbott氏が、入門者向けのReact Nativeコースを教えることになりました。
ミートアップは、コミュニティの他の開発者と出会い、学ぶ良い機会を提供します。今後もさらに多くの React Native ミートアップに参加することを楽しみにしています。もしこれらのどれかに参加されるなら、ぜひ私を見つけて、React Native をあなたにとってより良くするためにどうすればよいか教えてください!