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

React Nativeドキュメントの更新

·4分で読めます
Rachel Nabors
Facebook ドキュメンテーションエンジニア

昨年、私たちはユーザーインタビューを実施し、React Nativeドキュメントがどのように、いつ使用されているかについて詳しく知るためにアンケートを送付しました。24件のインタビューと3000件を超えるアンケート回答から得られたデータとガイダンスに基づき、React Nativeのドキュメント改善に取り組むことができ、その進捗を本日共有できることを嬉しく思います。

インタビュー、アンケート、そして私たちのドキュメンテーション活動に参加してくださった皆様、本当にありがとうございました!皆様の協力がこれを可能にしています。

React Nativeチームの原則

·5分で読めます
Eli White
イーライ・ホワイト
ソフトウェアエンジニア @ Meta

FacebookのReact Nativeチームは、React Nativeにおける作業の優先順位を決定するのに役立つ原則によって導かれています。これらの原則は、私たちのチームに特有のものであり、React Nativeコミュニティのすべてのステークホルダーを必ずしも代表するものではありません。私たちは、私たちを動かすもの、どのように意思決定を行うか、どのように努力を集中させるかについて、より透明性を高めるためにこれらの原則をここで共有しています。

ネイティブ体験

React Nativeの最優先事項は、各プラットフォームで人々が抱く期待に応えることです。これが、React Nativeがプラットフォームのプリミティブをレンダリングする理由です。私たちはクロスプラットフォームの一貫性よりもネイティブなルック&フィールを重視します。

たとえば、React NativeのTextInputはiOSのUITextFieldをレンダリングします。これにより、パスワードマネージャーやキーボードコントロールとの統合がすぐに機能するようになります。プラットフォームのプリミティブを使用することで、React Nativeアプリは、AndroidやiOSの新しいリリースによるデザインや動作の変更にも対応できます。

ネイティブアプリのルック&フィールに合わせるためには、そのパフォーマンスも合わせなければなりません。ここに、私たちの最も野心的な努力が集中しています。たとえば、Facebookは、Android上のReact Nativeのためにゼロから構築された新しいJavaScriptエンジンであるHermesを開発しました。Hermesは、React Nativeアプリの起動時間を大幅に改善します。また、スレッドモデルを最適化し、React Nativeがネイティブコードと相互運用しやすくするための主要なアーキテクチャ変更にも取り組んでいます。

大規模なスケーラビリティ

Facebookアプリの数百の画面はReact Nativeで実装されています。Facebookアプリは、膨大な種類のデバイスで何十億人もの人々に利用されています。これが、私たちが大規模な最も困難な問題に投資する理由です。

アプリにReact Nativeをデプロイすることで、小規模では見られない問題を特定できます。たとえば、Facebookは、最新のiPhoneから多くの古い世代のAndroidデバイスまで、幅広いデバイスでパフォーマンスを向上させることに注力しています。この焦点は、Hermes、Fabric、TurboModulesなどのアーキテクチャプロジェクトに情報を与えます。

React Nativeが大規模な組織にもスケールできることを証明しました。数百人の開発者が同じアプリに取り組んでいる場合、段階的な採用は必須です。これが、React Nativeを一度に1画面ずつ採用できるようにした理由です。まもなく、これをさらに一歩進めて、既存のネイティブ画面の個々のネイティブビューをReact Nativeに移行できるようになります。

大規模なスケーラビリティに焦点を当てるということは、私たちのチームが現在取り組んでいない多くのことがあることを意味します。たとえば、私たちのチームは業界におけるReact Nativeの採用を推進していません。また、大規模では見られない問題に対するソリューションを積極的に構築することもありません。コミュニティにとって重要なそれらの領域に集中できる多くのパートナーとコアコントリビューターがいることを誇りに思っています。

開発者の速度

優れたユーザー体験は反復的に作成されます。実行中のアプリでコード変更の結果を確認するのに、数秒しかかからないはずです。React Nativeのアーキテクチャにより、開発中にほぼ瞬時のフィードバックを提供できます。

React Nativeを導入することで開発速度が大幅に向上したというチームからの声をよく聞きます。これらのチームは、開発中の瞬時のフィードバックにより、さまざまなアイデアを試したり、細かな変更ごとにコーディングセッションを中断する必要がないため、さらに磨きをかけることがはるかに簡単になると感じています。React Nativeに変更を加える際には、開発者体験のこの品質を確実に維持するようにしています。

React Nativeが開発者の速度を向上させる唯一の方法は、瞬時のフィードバックだけではありません。チームは、高品質のオープンソースパッケージの急速に成長しているエコシステムを活用できます。チームは、Android、iOS、およびWeb間でビジネスロジックを共有することもできます。これにより、更新をより迅速に出荷し、プラットフォームチーム間の組織的なサイロを減らすことができます。

あらゆるプラットフォーム

2014年にReact Nativeを発表した際、「一度学んだら、どこでも書ける」というモットーを掲げました。そして、私たちは「どこでも」を意味します。開発者は、デバイスモデルやオペレーティングシステムに制限されることなく、できるだけ多くの人々にリーチできるべきです。

React Nativeは、モバイル、デスクトップ、Web、TV、VR、ゲーム機など、非常に異なるプラットフォームをターゲットとしています。開発者が最低限の共通点のために構築することを要求するのではなく、各プラットフォームで豊かな体験を可能にしたいと考えています。これを実現するために、各プラットフォームの独自の機能のサポートに焦点を当てています。これは、さまざまな入力メカニズム(例:タッチ、ペン、マウス)から、VRの3D環境のような根本的に異なる消費体験まで多岐にわたります。

この原則は、プラットフォーム間のパリティを促進するために、React Nativeの新しいコアアーキテクチャをクロスプラットフォームC++で実装するという決定に影響を与えました。また、MicrosoftのWindowsやmacOSなど、他のプラットフォームのメンテナーを対象とした公開インターフェースも改良しています。私たちは、あらゆるプラットフォームがReact Nativeをサポートできるように努めています。

宣言型UI

私たちはすべてのプラットフォームでまったく同じユーザーインターフェースを展開することに賛成しているわけではありません。私たちは、同じ宣言型プログラミングモデルで、各プラットフォーム独自の機能を公開することを信じています。私たちの宣言型プログラミングモデルはReactです。

私たちの経験では、Reactによって普及した単方向データフローは、アプリケーションを理解しやすくします。私たちは、命令的に管理されたビューではなく、宣言的なコンポーネントの構成として画面を表現することを好みます。ReactのWeb上での成功と、新しいネイティブAndroidおよびiOSフレームワークの方向性は、業界も宣言型UIを採用していることを示しています。

Reactは宣言型ユーザーインターフェースを普及させました。しかし、Reactが独自に解決できる未解決の問題がまだ多く残っています。React Nativeは、Reactの革新を基盤として構築を続け、宣言型ユーザーインターフェースムーブメントの最前線に立ち続けます。

LogBoxを搭載したReact Native 0.63の発表

·8分で読めます
Mike Grabowski
マイク・グラボウスキー
Callstack CTO兼共同創設者

本日、LogBoxをデフォルトで有効にしたReact Native 0.63をリリースします。

LogBox

React Nativeではエラーや警告のデバッグが難しいというコミュニティからのフィードバックが頻繁に寄せられています。これらの問題に対処するため、React Nativeのエラー、警告、ログシステム全体を見直し、ゼロから再設計しました

Screenshot of LogBox

LogBoxは、React Nativeにおけるredbox、yellowbox、そしてロギング体験を完全に再設計したものです。0.62ではLogBoxをオプトインとして導入しました。このリリースでは、LogBoxをReact Native全体のデフォルト体験としてローンチします。

LogBoxは、エラーや警告が冗長すぎる、フォーマットが悪い、またはアクションにつながりにくいという不満に対処するため、主に3つの目標に焦点を当てています。

  • 簡潔であること(Concise): ログは問題をデバッグするために必要な最小限の情報を提供するべきです。
  • 整形されていること(Formatted): ログは必要な情報をすぐに見つけられるように整形されるべきです。
  • 実行可能であること(Actionable): ログはアクション可能であるべきで、それによって問題を修正して先に進むことができます。

これらの目標を達成するために、LogBoxには以下の機能が含まれています。

  • ログ通知: 警告通知を再設計し、エラーのサポートも追加しました。これにより、すべてのconsole.warnとconsole.logメッセージがアプリを覆い隠すのではなく、通知として表示されるようになります。
  • コードフレーム: すべてのエラーと警告に、アプリ内で直接ログのソースコードを表示するコードフレームが含まれるようになりました。これにより、問題の原因を迅速に特定できます。
  • コンポーネントスタック: すべてのコンポーネントスタックはエラーメッセージから削除され、上位3つのフレームが表示される独自のセクションに配置されます。これにより、ログメッセージを乱雑にすることなく、スタックフレーム情報を期待する単一の一貫したスペースが提供されます。
  • スタックフレームの折りたたみ: デフォルトで、アプリケーションのコードに関係のないコールスタックフレームを折りたたむようになりました。これにより、React Nativeの内部を छानったりせず、アプリ内の問題を迅速に確認できます。
  • 構文エラーのフォーマット: 構文エラーのフォーマットを改善し、シンタックスハイライト付きのコードフレームを追加しました。これにより、エラーの原因を確認し、修正して、React Nativeに邪魔されることなくコーディングを続けることができます。

これらのすべての機能を、エラーと警告で一貫性があり、すべてのログを快適なUIでページングできる、改善されたビジュアルデザインにまとめました。

この変更に伴い、YellowBoxは非推奨となり、LogBox APIに置き換えられます。

  • LogBox.ignoreLogs(): この関数はYellowBox.ignoreLogs([])を置き換えるもので、指定された文字列または正規表現に一致するログを非表示にする方法です。
  • LogBox.ignoreAllLogs(): この関数はconsole.disableYellowBoxを置き換えるもので、エラーや警告の通知をオフにする方法です。注意:これは通知を無効にするだけで、キャッチされなかったエラーは引き続きフルスクリーンのLogBoxを開きます。

0.63では、これらの非推奨のモジュールやメソッドを使用すると警告が表示されます。0.64で削除される前に、これらのAPIの呼び出し箇所を更新してください。

LogBoxとReact Nativeのデバッグに関する詳細については、こちらのドキュメントを参照してください。

Pressable

React Nativeは、アプリケーションがプラットフォームのユーザーの期待に応えることを可能にするように構築されています。これには、「テイルズ」と呼ばれる、エクスペリエンスがReact Nativeで構築されたことを示す小さな兆候を避けることも含まれます。これらのテイルズの主な原因は、Touchableコンポーネントでした: ButtonTouchableWithoutFeedbackTouchableHighlightTouchableOpacityTouchableNativeFeedback、およびTouchableBounce。これらのコンポーネントは、ユーザーの操作に視覚的なフィードバックを提供できるようにすることで、アプリケーションをインタラクティブにします。しかし、プラットフォームの操作と一致しない組み込みのスタイルやエフェクトが含まれているため、ユーザーはReact Nativeで作成されたエクスペリエンスを認識できます。

さらに、React Nativeが成長し、高品質なアプリケーションに対する私たちの基準が上昇するにつれて、これらのコンポーネントはそれに伴って成長していませんでした。現在、React NativeはWeb、デスクトップ、TVなどのプラットフォームをサポートしていますが、追加の入力モードのサポートが不足していました。React Nativeは、すべてのプラットフォームで高品質なインタラクション体験をサポートする必要があります。

これらの問題に対処するため、Pressableという新しいコアコンポーネントを出荷します。このコンポーネントは、さまざまな種類のインタラクションを検出するために使用できます。このAPIは、親コンポーネントで状態を手動で維持することなく、インタラクションの現在の状態に直接アクセスできるように設計されています。また、ホバー、ブラー、フォーカスなどを含むように、プラットフォームがその機能を拡張できるように設計されています。ほとんどの人は、TouchableOpacityのようなデフォルトの体験に依存するのではなく、舞台裏でPressableを利用したコンポーネントを構築し共有することを期待しています。

import {Pressable, Text} from 'react-native';

<Pressable
onPress={() => {
console.log('pressed');
}}
style={({pressed}) => ({
backgroundColor: pressed ? 'lightskyblue' : 'white',
})}>
<Text style={styles.text}>Press Me!</Text>
</Pressable>;

Pressableコンポーネントの簡単な使用例:

詳細についてはドキュメントから学ぶことができます。

ネイティブカラー (PlatformColor, DynamicColorIOS)

すべてのネイティブプラットフォームには、システム定義の色の概念があります。ライトモードやダークモードなどのシステムテーマ設定、ハイコントラストモードなどのアクセシビリティ設定、さらには包含ビューやウィンドウの特性など、アプリ内のコンテキストにも自動的に応答する色です。

Appearance APIやAccessibilityInfoを介してこれらの設定の一部を検出し、それに応じてスタイルを設定することは可能ですが、そのような抽象化は開発コストが高いだけでなく、ネイティブカラーの外観を近似しているにすぎません。これらの不整合は、React Native要素がネイティブ要素と共存するハイブリッドアプリケーションに取り組む際に特に顕著になります。

React Nativeは、これらのシステムカラーを使用するための標準ソリューションを提供するようになりました。PlatformColor()は、React Nativeの他の色と同じように使用できる新しいAPIです。

たとえば、iOSでは、システムがlabelColorと呼ばれる色を提供しています。これは、React NativeでPlatformColorを使用して次のように使用できます。

import {Text, PlatformColor} from 'react-native';

<Text style={{color: PlatformColor('labelColor')}}>
This is a label
</Text>;

Textコンポーネントの色をiOSで定義されたlabelColorに設定します。

一方、AndroidはcolorButtonNormalのような色を提供します。この色はReact Nativeで次のように使用できます。

import {View, Text, PlatformColor} from 'react-native';

<View
style={{
backgroundColor: PlatformColor('?attr/colorButtonNormal'),
}}>
<Text>This is colored like a button!</Text>
</View>;

Viewコンポーネントの背景色をAndroidで定義されたcolorButtonNormalに設定します。

PlatformColorについて詳しくは、ドキュメントをご覧ください。また、RNTesterにある実際のコード例も確認できます。

DynamicColorIOSは、ライトモードとダークモードで使用する色を定義できるiOS専用APIです。PlatformColorと同様に、色を使用できる場所ならどこでも使用できます。DynamicColorIOSは、iOSのcolorWithDynamicProviderを内部で使用しています。

import {Text, DynamicColorIOS} from 'react-native';

const customDynamicTextColor = DynamicColorIOS({
dark: 'lightskyblue',
light: 'midnightblue',
});

<Text style={{color: customDynamicTextColor}}>
This color changes automatically based on the system theme!
</Text>;

システムテーマに基づいてテキストの色を変更します。

DynamicColorIOSについての詳細はドキュメントから学ぶことができます。

iOS 9およびNode.js 8のサポート終了

リリースから4年以上が経過し、iOS 9のサポートを終了します。この変更により、特定の機能が特定のiOSバージョンでサポートされていたかどうかを検出するためにネイティブコードに配置する必要がある互換性チェックの数を減らすことができるため、より迅速に作業を進めることができます。市場シェアが1%であるため、お客様に大きな悪影響を与えることはないはずです。

同時に、Node 8のサポートを終了します。そのLTSメンテナンスサイクルは2019年12月に期限切れとなりました。現在のLTSはNode 10であり、それが私たちがターゲットとしているバージョンです。まだReact Nativeアプリケーションの開発にNode 8を使用している場合は、最新のセキュリティ修正とアップデートを受け取るためにアップグレードすることをお勧めします。

その他の注目すべき改善点

  • 明示的なサイズなしで<View /><Text />でレンダリングするのをサポート: これまで常に可能ではなかった、幅と高さを明示的に設定することなく、任意の<View />を任意の<Text />コンポーネント内にレンダリングできるようになりました。以前のReact Nativeリリースでは、これはRedBoxを引き起こしていました。
  • iOS LaunchScreenをxibからstoryboardに変更: 2020年4月30日以降、App Storeに提出されるすべてのアプリは、アプリの起動画面を提供するXcodeストーリーボードを使用する必要があり、すべてのiPhoneアプリはすべてのiPhone画面をサポートする必要があります。このコミットは、デフォルトのReact Nativeテンプレートをこの要件と互換性があるように調整します。

謝辞

0.63を可能にしてくれた何百人ものコントリビューターに感謝します!

LogBoxセクションの執筆を担当したRick Hanlon、およびこの記事のPressable部分の執筆を担当したEli Whiteに特に感謝します。

すべてのアップデートを確認するには、0.63の変更履歴をご覧ください。

Flipperを搭載したReact Native 0.62の発表

·5分で読めます
Rick Hanlon
Facebook、React Native Core

本日、React Nativeバージョン0.62をリリースします。このバージョンには、デフォルトでFlipperのサポートが含まれています。

このリリースは世界的なパンデミックの最中に行われます。このリリースを可能にした何百人もの貢献者の作業を尊重し、リリースがマスターからあまり遅れないようにするため、本日このバージョンをリリースします。貢献者が問題の解決に協力する能力が低下していることに留意し、必要に応じてアップグレードを延期する準備をしてください。

デフォルトでFlipperを搭載

Flipperはモバイルアプリのデバッグ用開発者ツールです。AndroidおよびiOSコミュニティで人気があり、このリリースでは新規および既存のReact Nativeアプリでデフォルトでサポートが有効になりました。

Screenshot of Flipper for React Native

Flipperは、標準で以下の機能を提供します。

  • Metro Actions: ツールバーから直接アプリをリロードし、開発メニューをトリガーします。
  • Crash Reporter: AndroidおよびiOSデバイスからのクラッシュレポートを表示します。
  • React DevTools: 最新バージョンのReact DevToolsを他のすべてのツールと並行して使用できます。
  • Network Inspector: デバイスアプリケーションによって行われたすべてのネットワークリクエストを表示します。
  • Metro and Device Logs: Metroとデバイスの両方からのすべてのログを表示、検索、フィルタリングします。
  • Native Layout Inspector: React Nativeレンダラーによって出力されたネイティブレイアウトを表示および編集します。
  • Database and Preference Inspectors: デバイスのデータベースと設定を表示および編集します。

さらに、Flipperは拡張可能なプラットフォームであるため、NPMからプラグインをプルするマーケットプレイスを提供しており、ワークフロー固有のカスタムプラグインを公開およびインストールできます。利用可能なプラグインはこちらで確認できます。

詳細については、Flipperのドキュメントをご確認ください。

新しいダークモード機能

ユーザーの外観設定(例えば、好みのカラースキーム(ライトまたはダーク))にアクセスするための新しい`Appearance`モジュールを追加しました。

const colorScheme = Appearance.getColorScheme();
if (colorScheme === 'dark') {
// Use dark color scheme
}

また、ユーザー設定の状態更新を購読するためのフックも追加しました。

import {Text, useColorScheme} from 'react-native';

const MyComponent = () => {
const colorScheme = useColorScheme();
return <Text>useColorScheme(): {colorScheme}</Text>;
};

詳細については、AppearanceuseColorSchemeのドキュメントを参照してください。

Apple TVをreact-native-tvosに移行

Lean Coreの取り組みの一環として、またApple TVをReact Native WindowsやReact Native macOSのような他のプラットフォームと整合させるため、Apple TV固有のコードをコアから削除し始めました。

今後、React Native の Apple TV サポートは、対応する react-native-tvos NPM パッケージとともに、react-native-community/react-native-tvos で維持されます。これは、Apple TV をサポートするために必要な変更のみを含む、メインリポジトリの完全なフォークです。

`react-native-tvos`のリリースは、React Nativeのパブリックリリースに基づきます。今回の`react-native` 0.62リリースでは、Apple TVプロジェクトを`react-native-tvos` 0.62を使用するようにアップグレードしてください。

アップグレードサポートの強化

0.61がリリースされたとき、コミュニティは新しいバージョンのReact Nativeにアップグレードする開発者をサポートするための新しいアップグレードヘルパーツールを導入しました。アップグレードヘルパーは、現在のバージョンからターゲットバージョンへの変更点の差分を提供し、特定のアップグレードに必要な変更を確認できるようにします。

このツールを使っても、アップグレード中に問題が発生します。本日、私たちはUpgrade-Supportを発表することで、より専門的なアップグレードサポートを導入します。Upgrade SupportはGitHubの課題トラッカーであり、ユーザーはプロジェクトのアップグレードに関する具体的な問題を提出し、コミュニティからの支援を受けることができます。

私たちは常にアップグレード体験の改善に取り組んでおり、これらのツールがまだカバーできていないエッジケースでユーザーが必要とするサポートを提供できることを願っています。

その他の改善点

  • LogBox: 新しいLogBoxのエラーおよび警告表示機能をオプトインとして追加します。有効にするには、`index.js`ファイルに`require('react-native').unstable_enableLogBox()`を追加してください。
  • React DevTools v4: この変更には、最新のReact DevToolsへのアップグレードが含まれており、大幅なパフォーマンス向上、ナビゲーション体験の改善、React Hooksの完全なサポートを提供します。
  • アクセシビリティの改善: accessibilityValueの追加、Touchablesにおけるプロパティの不足、onSlidingComplete アクセシビリティイベント、Switchコンポーネントのデフォルトロールを"button"から"switch"に変更するなど、アクセシビリティが改善されました。

破壊的変更

  • PropTypesの削除: React Nativeコアのアプリサイズへの影響を減らし、実行時ではなくコンパイル時にチェックする静的型システムを優先するため、コアコンポーネントから`propTypes`を削除しています。
  • accessibilityStatesの削除: 非推奨のaccessibilityStatesプロパティを削除し、新しいaccessibilityStateプロパティを採用しました。これは、コンポーネントがアクセシビリティサービスにその状態に関する情報を記述するためのより意味的に豊かな方法です。
  • TextInputの変更: onTextInputは一般的でなく、W3Cに準拠せず、Fabricで実装が困難であるため、TextInputから削除しました。また、文書化されていないinputViewプロパティとselectionStateも削除しました。

非推奨

  • `AccessibilityInfo.fetch`はすでに非推奨でしたが、このリリースで警告を追加しました。
  • 将来的にデフォルトを切り替えるサポートのため、`useNativeDriver`の設定が必須になりました。
  • Animatedコンポーネントのrefは、内部コンポーネントになり、getNode非推奨になりました

謝辞

0.62を可能にしてくれた何百人もの貢献者に感謝します!

すべての更新内容を確認するには、0.62の変更履歴をご覧ください。

新しいReact Nativeコマンド、Doctorの紹介

·2分で読めます
Lucas Bento
React Native コミュニティ

React Nativeコミュニティの6人の貢献者による20件以上のプルリクエストを経て、開発環境の開始、トラブルシューティング、エラーの自動修正を支援する新しいコマンドであるreact-native doctorを発表できることを嬉しく思います。doctorコマンドは、ExpoHomebrew独自のdoctorコマンドから強くインスピレーションを受けており、Jestにインスピレーションを得たUIが少し加えられています。

Fast Refreshを搭載したReact Native 0.61の発表

·3分で読めます
Dan Abramov
Facebook React Core チーム

この度、React Native 0.61 のリリースを発表できることを嬉しく思います。このバージョンには、私たちが「Fast Refresh」と呼ぶ新しいリロード体験が含まれています。

高速リフレッシュ

React Nativeコミュニティに一般的な問題点について尋ねたところ、最も多かった回答の1つは「ホットリロード」機能が壊れていたことでした。関数コンポーネントで確実に動作せず、多くの場合画面の更新に失敗し、誤字やミスに強くありませんでした。信頼性が低すぎるため、ほとんどの人がオフにしているという話を聞きました。

React Native 0.61 では、既存の「ライブリロード」(保存時にリロード)と「ホットリロード」機能を、「Fast Refresh」という単一の新機能に統合します。Fast Refresh は、以下の原則に基づいてゼロから実装されました。

  • Fast Refresh は、関数コンポーネントやフックを含む、モダンな React を完全にサポートします。
  • Fast Refresh は、タイポやその他のミスから適切に回復し、必要なときにはフルリロードにフォールバックします。
  • Fast Refresh は、侵襲的なコード変換を行わないため、デフォルトで有効にできるほど信頼性があります。

Fast Refresh の動作については、こちらのビデオをご覧ください。

ぜひお試しいただき、ご意見をお聞かせください!もしお好みでなければ、開発メニュー(iOS では Cmd+D、Android では Cmd+M または Ctrl+M)でオフにできます。オンとオフの切り替えは瞬時に行えるので、いつでも変更できます。

Fast Refresh を使う上でのヒントをいくつか紹介します。

  • Fast Refresh は、デフォルトで関数コンポーネント(およびフック!)の React ローカルステートを保持します。
  • 編集のたびに React のステートをリセットする必要がある場合は、そのコンポーネントを含むファイルに特別なコメント // @refresh reset を追加できます。
  • Fast Refresh は、クラスコンポーネントを常にステートを保持せずに再マウントします。これにより、信頼性の高い動作が保証されます。
  • 私たちは誰でもコードで間違いを犯します!Fast Refresh は、ファイルを保存した後に自動的にレンダリングを再試行します。構文エラーやランタイムエラーを修正した後に、手動でアプリをリロードする必要はありません。
  • 編集中に console.logdebugger 文を追加するのは、便利なデバッグテクニックです。

Fast Refresh に関する問題は GitHub に報告してください。調査いたします。

その他の改善点

  • use_frameworks! CocoaPodsのサポートが修正されました。 0.60では、CocoaPodsをデフォルトで統合するためにいくつかの更新を行いました。残念ながら、これによりuse_frameworks!を使用するビルドが壊れてしまいました。これは0.61で修正され、動的フレームワークでのビルドを必要とするiOSプロジェクトにReact Nativeをより簡単に統合できるようになりました。
  • useWindowDimensions フックの追加。 この新しいフックは、画面サイズの更新を自動的に提供し、購読します。ほとんどの場合、Dimensions API の代わりに使用できます。
  • Reactが16.9にアップグレードされました。 このバージョンでは、UNSAFE_ライフサイクルメソッドの古い名前が非推奨になり、actの改善などが含まれています。React 16.9のブログ記事で自動移行スクリプトと詳細情報をご覧ください。

破壊的変更

  • React .xcodeprojの削除。 0.60では、CocoaPodsを介した自動リンクサポートを導入しました。また、CocoaPodsをe2eテスト実行にも統合したため、今後はiOSアプリにRNを統合するための統一された標準的な方法があります。これにより、React .xcodeprojのサポートは事実上非推奨となり、ファイルは0.61から削除されました。注: 0.60の自動リンクをすでに使用している場合は、影響を受けないはずです。

謝辞

0.61 のリリースに貢献してくださったすべてのコントリビューターに感謝します!

すべての更新内容については、0.61 の変更履歴をご覧ください。

React Nativeに最適化された新しいJavaScriptエンジン、Hermesの紹介

·2分で読めます
Rachel Nabors
Facebook ドキュメンテーションエンジニア

先週、Chain Reactで、Facebookで取り組んでいたオープンソースのJavaScriptエンジンであるHermesを発表しました。これは、AndroidでReact Nativeを実行するために最適化された、小さくて軽量なJavaScriptエンジンです。ぜひチェックしてください!

Hermesは、メモリ使用量の削減、ダウンロードサイズの縮小、アプリが利用可能になるまでの時間(TTI)の短縮により、React Nativeのパフォーマンスを向上させます。

「パフォーマンスデータを分析した結果、JavaScriptエンジン自体が起動パフォーマンスとダウンロードサイズに大きな影響を与えていることに気づきました。このデータをもとに、デスクトップやラップトップに比べて制約の多いモバイル環境でJavaScriptのパフォーマンスを最適化する必要があると考えました。他の選択肢を検討した後、Hermesと呼ぶ新しいJavaScriptエンジンを開発しました。これは、限られたメモリ、低速なストレージ、削減された計算能力を持つ量産デバイスであっても、React Nativeアプリに焦点を当て、アプリのパフォーマンスを向上させるように設計されています。」 —Hermes: React Nativeを皮切りに、モバイルアプリ向けに最適化されたオープンソースJavaScriptエンジン

すぐに始めたいですか?ドキュメントの既存のReact NativeアプリでHermesを有効にするための新しいガイドを必ずチェックしてください!

HermesとReact Nativeのロゴが翼のある怒りに結合され、孤立した輝くおそらくAndroidフォンからクラッシュする電撃嵐の中に立ち上がるイラスト。 イラストレーション:レイチェル・ネイバーズ

React Native 0.60の発表

·6分で読めます
Ryan Turner
コアメンテナー & React Native開発者

数百人の貢献者による数ヶ月にわたる懸命な努力を経て、React Nativeコアチームはバージョン0.60のリリースを発表できることを誇りに思います。このリリースでは、AndroidとiOSの両プラットフォームにおいて重要な移行が行われ、多くの問題も解決されています。このブログ投稿では、リリースのハイライトを扱いますが、詳細については常に変更ログを参照してください。最後に、このマイルストーンを達成するためにご協力いただいた貢献者の皆様に感謝いたします!

アクセシビリティへの焦点

announceForAccessibilityなどのアクセシビリティAPIに多くの改善が加えられ、ロールアクションのサポートフラグなどにも改善が見られました。アクセシビリティは複雑な科学ですが、これらの改善によってA11Yが少しでも容易になることを願っています。これらの変更の詳細については、React Nativeオープンソースアップデート2019年6月を必ずご確認ください。

新たな始まり

React Nativeのスタート画面が更新されました!新しいUIの作成に協力してくれた多くの貢献者に感謝します。この新しい「Hello World」は、より親しみやすく、魅力的な方法でユーザーをエコシステムに歓迎します。

The new init screen helps developers get started from the get-go with resources and a good example

AndroidXのサポート

AndroidXはAndroidエコシステムにおける大きな一歩であり、古いサポートライブラリアーティファクトは非推奨になっています。0.60では、React NativeはAndroidXに移行されました。これは破壊的な変更であり、ネイティブコードと依存関係も移行する必要があります

この変更に伴い、React NativeアプリはAndroidXを自身で使用し始める必要があります。1つのアプリで両方を並行して使用することはできないため、すべてのアプリコードと依存関係のコードはどちらか一方を使用する必要があります。

matt-oakes ( discussions-and-proposalsにて)

自身のネイティブコードは自分で移行する必要がありますが、@mikehardy@cawfree、および@m4tt72は、node_modulesをパッチする「jetifier」という巧妙なツールを構築しました。ライブラリのメンテナーはアップグレードする必要がありますが、このツールは、AndroidXバージョンをリリースするまでの間、一時的な解決策を提供します。したがって、AndroidX移行に関連するエラーが見つかった場合は、これを試してみてください。

デフォルトでCocoaPods

CocoaPodsはReact NativeのiOSプロジェクトの一部となりました。まだそうしていなかった場合は、今後はxcworkspaceファイルを使用してiOSプラットフォームコードを開いてください(ヒント:プロジェクトのルートディレクトリからxed iosを試してください)。また、内部パッケージのpodspecもXcodeプロジェクトと互換性があるように変更され、トラブルシューティングとデバッグに役立ちます。このエキサイティングなサポートをもたらすために、0.60へのアップグレードの一環として、Podfileいくつかの簡単な変更を行うことを期待してください。use_frameworks!との互換性問題があることを認識しており、回避策と将来のパッチに関する問題を追跡しています。

リーンコアの削除

WebViewNetInfo は以前は別々のリポジトリに抽出されていましたが、0.60ではReact Nativeリポジトリからの移行を完了しました。さらに、新しいApp Storeポリシーに関するコミュニティからのフィードバックに応え、Geolocation が抽出されました。まだ行っていない場合は、react-native-webview@react-native-community/netinfo、および@react-native-community/geolocationに依存関係を追加して移行を完了してください。自動化されたソリューションが必要な場合は、rn-upgrade-deprecated-modulesの使用を検討してください。メンテナーは抽出以来これらのリポジトリに100件以上のコミットを行い、コミュニティのサポートに興奮しています!

ネイティブモジュールは自動リンクされるようになりました

React Native CLIに取り組んでいるチームは、自動リンクと呼ばれるネイティブモジュールリンクの主要な改善を導入しました!ほとんどのシナリオでは、もはやreact-native linkを使用する必要はありません。同時に、チームはリンクプロセス全体を見直しました。上記のドキュメントで述べられているように、既存の依存関係は必ずreact-native unlinkしてください。

アップグレードヘルパー

@lucasbento@pvinis@kelset@watadarkstarは、アップグレードプロセスを簡素化するためにUpgrade Helperという素晴らしいツールを構築しました。これにより、ブラウンフィールドアプリや複雑なカスタマイズを持つReact Nativeユーザーが、バージョン間の変更点を確認できるようになります。更新されたアップグレードドキュメントを確認し、今日のアップグレードパスで試してみてください!

Upgrade Helper cleanly and easily shows the changes needed to migrate to a different version of React Native

ライブラリメンテナーへの注意

AndroidXの変更には、ライブラリの更新がほぼ確実に必要となるため、早めにサポートを含めるようにしてください。まだアップグレードできない場合は、jetifierに対してライブラリをチェックして、ユーザーがビルド時にライブラリをパッチできることを確認することを検討してください。

自動リンクのドキュメントを確認して、設定とREADMEを更新してください。ライブラリが以前にどのように統合されていたかによっては、追加の変更が必要になる場合もあります。依存関係インターフェースの定義方法については、CLIの依存関係ガイドを確認してください。

謝辞

これらが私たちが注目したハイライトですが、他にも多くのエキサイティングなアップデートがあります。すべてのアップデートについては、変更ログをご覧ください。常に最新情報にご期待ください。それまでの間、0.60をお楽しみください!

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

·9分で読めます
Christoph Nakazawa
クリストフ・ナカザワ
元Facebookエンジニア

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

過去6か月間で、550人以上の貢献者によってReact Nativeに合計2800件のコミットが行われました。コミュニティからの400人の貢献者が1,150件以上のプルリクエストを作成し、そのうち820件のプルリクエストがマージされました。

Lean Coreの取り組みにより、ウェブサイト、CLI、および多くのモジュールがReact Nativeから分離されたにもかかわらず、過去6か月間の1日あたりの平均プルリクエスト数は3件から約6件に増加しました。オープンなプルリクエストの平均数は現在25件を下回っており、通常、数時間から数日以内に提案とレビューで返信しています。

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

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

リーンコア

リーンコアの主な動機は、React Nativeからモジュールを別々のリポジトリに分割し、より良いメンテナンスを受けられるようにすることでした。わずか6か月で、WebViewNetInfoAsyncStorageウェブサイトCLIなどのリポジトリは、合計で800件以上のプルリクエストを受け取りました。より良いメンテナンスに加えて、これらのプロジェクトはReact Native自体よりも頻繁に独立してリリースできます。

また、React Native自体から時代遅れのポリフィルとレガシーコンポーネントを削除する機会も得ました。以前は、古いバージョンのJavaScriptCore (JSC)でMapSetなどの言語機能をサポートするためにポリフィルが必要でした。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リリース以降の将来のアップグレードを大幅に容易にするでしょう。
  • サポート/不確実性: 多くの人々は、プルリクエストの活動の欠如と、FacebookのReact Nativeへの投資に関する一般的な不確実性に不満を感じていました。上記で示したように、私たちはより多くのプルリクエストを受け入れる準備ができており、皆様の提案や貢献を心待ちにしていると自信を持って言えます!
  • パフォーマンス: React Native 0.59は、新しく、はるかに高速なJavaScriptCore(JSC)バージョンで出荷されました。これとは別に、インラインリクワイアをデフォルトで有効にすることを容易にする作業を行っており、今後数ヶ月でさらにエキサイティングなアップデートをお届けします。
  • ドキュメント: 最近、React Nativeのすべてのドキュメントを全面的に見直し、書き直す作業を開始しました。貢献を検討している場合は、ぜひお手伝いいただけると幸いです!
  • Xcodeでの警告: 私たちは既存の警告をすべて取り除き、新しい警告を導入しないよう努力しています。
  • ホットリローディング: Reactチームは、まもなくReact Nativeに統合される新しいホットリローディングシステムを構築しています。

残念ながら、まだすべてを改善できたわけではありません。

  • デバッグ: 私たちは毎日遭遇していた多くの不便なバグや問題を修正しましたが、残念ながら、望むほど進歩していません。React Nativeでのデバッグは優れていないことを認識しており、将来的にこれを改善することを優先します。
  • メトロシンボリックリンク: 残念ながら、これに対するシンプルで直接的な解決策はまだ実装できていません。しかし、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 ReactReact Native EUで講演します。また、間もなくリリースされる次のバージョン0.60にもご注目ください。エキサイティングなものになるでしょう

F8でのReact Nativeとオープンソースポッドキャスト

·3分で読めます
Christoph Nakazawa
クリストフ・ナカザワ
元Facebookエンジニア

今週、イーライ・ホワイトは、F8 2019で、FacebookのAndroidおよびiOSアプリケーションにおけるReact Nativeについて講演しました。過去2年間何をしてきたか、そして次に何をしようとしているかを共有できることを嬉しく思います。

Facebookの開発者向けウェブサイトでビデオをチェックしてください

F8 Talk about React Native

講演のハイライト:

  • 2017年と2018年は、React Native最大の製品であるFacebook Marketplaceに焦点を当てました。Marketplaceチームと協力して、品質を向上させ、製品に喜びを加えました。この時点で、MarketplaceはAndroidとiOSの両方でFacebookアプリ内で最も高品質な製品の1つです。
  • Marketplaceのパフォーマンスも大きな課題であり、特にミドルエンドのAndroidデバイスでは顕著でした。過去1年間で起動時間を50%以上削減し、さらなる改善が進められています!最大の改善はReact Nativeに組み込まれ、今年後半にコミュニティに提供される予定です。
  • React Nativeを使えば、Facebookが必要とする高品質で高性能なアプリを構築できるという確信があります。この確信により、React Nativeのコアを再考するといった、より大きな賭けに投資することができました。
  • MicrosoftはWindows版React Nativeをサポート・使用しており、人々がその専門知識とコードベースを活用してMicrosoftのユニバーサルWindowsプラットフォームにレンダリングできるようにしています。詳細については、来週のMicrosoft Buildで彼らの話を聞いてください

オープンソースに関するReact Radioポッドキャスト

イーライの講演は、最近のオープンソース活動について話して締めくくられました。私たちは3月に進捗状況を更新し、最近Nader DabitGant Labordeが、React Native Radioというポッドキャストにクリストフを招き、オープンソースにおけるReact Nativeについて話しました。

ポッドキャストのハイライト:

  • FacebookのReact Nativeチームがオープンソースについてどのように考えているか、そしてReact Nativeの規模のプロジェクトのために持続可能なコミュニティをどのように構築しているかについて話しました。
  • Lean Coreの取り組みの一環として、複数のモジュールを削除する予定です。WebViewやReact Native CLIのような多くのモジュールは、抽出されて以来100以上のプルリクエストを受け取っています。
  • 次に、私たちはReact Nativeのウェブサイトとドキュメントの全面的な見直しに注力します。ご期待ください!

このエピソードはまもなくお気に入りのポッドキャストアプリで配信されます。または、こちらですぐに録音を聴くこともできます。