本文へ移動

GAAD誓約 - 3月のアクセシビリティに関する問題のアップデート

·読了時間3分
Alexandra Marlette
Alexandra Marlette
React NativeのGAAD誓約オープンソースアクセシビリティコミュニティマネージャー

GitHubコミュニティに徹底的にレビューされたギャップ分析と、React Nativeのアクセシビリティを改善するための問題リストを提供してから4週間が経ちました。React Nativeコミュニティの助けを借りて、アクセシビリティの改善にすでに大きな進歩が見られています。コミュニティメンバーは、コントリビューターの支援、テストのレビュー、以前のアクセシビリティの問題への注目を集めることに貢献してきました。3月8日以降、コミュニティは4つのプルリクエストで6つの問題を解決し、さらに7つのプルリクエストがレビューのために準備中です。

この作業が継続されている一方で、FacebookのReact Nativeとアクセシビリティチームは、この取り組みの前に提出されたアクセシビリティのバグと問題を評価し、それらが現在のギャップ分析によってすでに網羅されているかどうか、またはプロジェクトに取り込む必要がある追加の問題があるかどうかを判断しています。1つの新しい問題はすでに発見され、プロジェクトに移されました。他の4つは既存の問題に直接マッピングされ、さらに2つは根本原因に対処する既存の問題に対処することで解決される予定です。

ご参加いただいたすべてのコミュニティメンバーに感謝いたします。皆様のおかげで、React Nativeを誰もが利用できるものにするための取り組みが確実に進んでいます!

iOSでHermesを搭載したReact Native 0.64の発表

·読了時間4分
Mike Grabowski
Mike Grabowski
CallstackのCTO兼共同設立者

本日、iOSでHermesのサポートを提供するReact Native 0.64をリリースします。

iOSでのHermesのオプトイン

Hermesは、React Nativeの実行に最適化されたオープンソースのJavaScriptエンジンです。メモリ使用量の削減、ダウンロードサイズの縮小、アプリが使用可能になるまでの時間(対話時間:TTI)の短縮により、パフォーマンスが向上します。

このリリースでは、iOSでもHermesを使用してビルドできるようになったことをお知らせできることを嬉しく思います。iOSでHermesを有効にするには、`Podfile`で`hermes_enabled`を`true`に設定し、`pod install`を実行します。

use_react_native!(
:path => config[:reactNativePath],
# to enable hermes on iOS, change `false` to `true` and then install pods
:hermes_enabled => true
)

iOSでのHermesのサポートはまだ初期段階であることにご注意ください。さらなるベンチマークを実行しているため、オプトインとして維持しています。皆様自身のアプリケーションで試していただき、その結果をお知らせいただければ幸いです!

デフォルトで有効になっているインライン要件

インライン要件は、スタートアップ時にではなく、使用されるまでJavaScriptモジュールの実行を遅らせることで、スタートアップ時間を改善するMetroの設定オプションです。

この機能は、数年前にオプトイン設定オプションとして存在し、推奨されてきました。ドキュメントのパフォーマンスセクションに記載されています。今では、追加の設定なしで高速なReact Nativeアプリケーションを使用できるように、新しいアプリケーションでこのオプションをデフォルトで有効にしています。

インライン要件は、モジュールのインポートを取り、インラインになるように変換するBabel変換です。例として、インライン要件は、ファイルの先頭にあるこのモジュールのインポート呼び出しを、それが使用されている場所に移動します。

import {MyFunction} from 'my-module';

const MyComponent = props => {
const result = MyFunction();

return <Text>{result}</Text>;
};

const MyComponent = props => {
const result = require('my-module').MyFunction();

return <Text>{result}</Text>;
};

インライン要件の詳細については、パフォーマンスドキュメントをご覧ください。

ChromeでHermesトレースを表示する

昨年、FacebookはMajor League Hackingフェローシップをスポンサーし、React Nativeへの貢献を支援しました。Jessie NguyenSaphal Patroは、Hermesを使用している場合に、Chrome DevToolsのパフォーマンスタブを使用してアプリケーションの実行を視覚化する機能を追加しました。

詳細については、新しいドキュメントページをご覧ください。

プロキシサポート付きHermes

Hermesにプロキシサポートを追加し、react-native-firebaseやmobxなどの一般的なコミュニティプロジェクトとの互換性を確保しました。これらのパッケージを使用していた場合は、プロジェクトでHermesに移行できるようになりました。

今後のリリースでHermesをAndroidのデフォルトのJavaScriptエンジンにする予定なので、Hermesを使用する際に発生する残りの問題を解決するために取り組んでいます。アプリのHermesへの採用を妨げている問題がある場合は、Hermes GitHubリポジトリに問題を報告してください。

React 17

React 17には、新しい開発者向けの機能や主要な破壊的変更は含まれていません。React Nativeアプリケーションの場合、主な変更点は新しいJSX変換で、ファイルがJSXを使用するためにReactをインポートする必要がなくなりました。

React 17の詳細については、Reactブログをご覧ください。

主要な依存関係のバージョンの変更

  • Android APIレベル16~20のサポートを終了しました。Facebookアプリでは、利用率が十分に低いAndroidバージョンに対するサポートを継続的に終了しています。Facebookアプリがこれらのバージョンをサポートしなくなったため、React Nativeの主要なテスト環境としても、React Nativeでのサポートも終了します。
  • Xcode 12とCocoaPods 1.10が必要です。
  • Nodeの最小サポートバージョンが10から12に引き上げられました。
  • Flipperを0.75.1にアップデートしました。

謝辞

0.64のリリースに貢献してくれた数百名ものコントリビューターに感謝します!0.64の変更ログには、このリリースに含まれるすべての変更が記載されています。

GAAD誓約 - React Nativeアクセシビリティの改善

読了時間2分
Alexandra Marlette
Alexandra Marlette
React NativeのGAAD誓約オープンソースアクセシビリティコミュニティマネージャー

React Nativeコミュニティの皆様へ

2020年5月、FacebookはGAAD pledgeに署名した最初の企業となり、アクセシビリティをReact Nativeオープンソースプロジェクトの中核的な要素にすることを約束しました。5月以降、FacebookはReact Nativeにおけるアクセシビリティのギャップを綿密にレビューし、文書化してきました。これまでにギャップ分析で90件の問題が明らかになり、すべてGitHubのissueとして登録されています。

全体として、React Native APIはアクセシビリティを強力にサポートしていることがわかりました。しかし、多くのコアコンポーネントがプラットフォームのアクセシビリティAPIをまだ完全に活用しておらず、プラットフォーム固有の機能の一部にはサポートが不足していることもわかりました。

コントリビューターの熱意と多様性は、常にReact Nativeの開発において重要な役割を果たしており、これらのアクセシビリティのギャップは、現在および新規のコントリビューターにとって素晴らしい機会です。React Nativeへの貢献に関心のある方は、React Nativeをよりアクセシブルにするためにご参加ください。

コントリビューターの努力を称えるため、アクセシビリティの問題が解決され、プルリクエストに添付されると、コミュニティマネージャーからTwitterで感謝のメッセージが送られます。コードベースに受け入れられたプルリクエストのコントリビューターは、React Nativeブログの毎月のissueアップデートで紹介されます。

React Nativeをすべての人にとってよりアクセシブルにするために、ご協力をお願いします。

ご協力の方法:

  • 新規コントリビューターは、貢献ガイドを読み、React Native GitHubにある46件の初心者向けissueを参照してください。

  • もう少し努力が必要なissueに関心のあるコントリビューターは、React Nativeのアクセシビリティ向上のためのプロジェクトページにアクセスして、React Nativeの知識が必要なGitHubのissueを確認してください。

  • React Nativeのドキュメントを更新して、解決されたアクセシビリティのギャップを反映することに関心のあるテクニカルライターは、React Nativeドキュメントを参照してください。

  • この取り組みを、お手伝いできるかもしれない方々に共有してください!

  • React NativeのGAAD PledgeオープンソースアクセシビリティコミュニティマネージャーをTwitterまたはFacebookでフォローして、進捗状況を最新の状態に保ってください。

React Nativeドキュメントのアップデート

読了時間3分
Rachel Nabors
Facebook ドキュメンテーションエンジニア

昨年、ユーザーインタビューを実施し、アンケートを送信して、人々がReact Nativeのドキュメントをどのように、いつ使用しているかを詳しく調べました。24件のインタビューと3000件以上のアンケート回答から得られたデータとガイダンスに基づき、React Nativeのドキュメントの改善に取り組んできました。そして、本日その成果を共有できることを嬉しく思います。

インタビュー、アンケート、ドキュメント作成へのご参加いただいた皆様に心より感謝申し上げます!皆様のご協力のおかげで実現しました。

React Nativeチームの原則

読了時間5分
Eli White
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向けにゼロから構築された新しい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環境のような根本的に異なる消費エクスペリエンスまで多岐にわたります。

この原則に基づき、プラットフォーム間の整合性を促進するために、クロスプラットフォームC++でReact Nativeの新しいコアアーキテクチャを実装するという決定を行いました。また、WindowsやmacOSなどの他のプラットフォームのメンテナンス担当者であるMicrosoftを対象とした公開インターフェースを改良しています。あらゆるプラットフォームでReact Nativeをサポートできるように努めています。

宣言型UI

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

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

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

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

·8分間の読書
Mike Grabowski
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をオプトインとして導入しました。このリリースでは、すべてのReact NativeでLogBoxをデフォルトのエクスペリエンスとして開始します。

LogBoxは、エラーと警告があまりにも冗長である、書式が不適切である、または実行不可能であるという不満に対処するために、3つの主要な目標に焦点を当てています。

  • 簡潔:ログは、問題をデバッグするために必要な最小限の情報を提供する必要があります。
  • 書式設定:ログは、必要な情報をすばやく見つけることができるように書式設定する必要があります。
  • 実行可能:ログは実行可能である必要があるため、問題を修正して先に進むことができます。

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

  • ログ通知:警告通知を再設計し、エラーのサポートを追加しました。そのため、すべてのconsole.warnとconsole.logメッセージは、アプリを覆うのではなく、通知として表示されます。
  • コードフレーム:すべてのエラーと警告には、アプリ内でログのソースコードを表示するコードフレームが含まれるようになりました。これにより、問題の発生源をすばやく特定できます。
  • コンポーネントスタック:すべてのコンポーネントスタックは、エラーメッセージから削除され、上位3つのフレームが表示された独自のセクションに配置されるようになりました。これにより、ログメッセージを混乱させることなく、スタックフレーム情報の期待できる一貫性のある単一のスペースが提供されます。
  • スタックフレームの折りたたみ:デフォルトでは、アプリケーションコードに関連しないコールスタックフレームが折りたたまれるようになりました。これにより、アプリの問題をすばやく確認し、React Nativeの内側を調べる必要がなくなります。
  • 構文エラーの書式設定:構文エラーの書式設定を改善し、構文強調表示付きのコードフレームを追加しました。これにより、エラーの原因を確認し、修正して、React Nativeが邪魔になることなくコーディングを続けることができます。

これらの機能はすべて、エラーと警告間で一貫性があり、1つの使いやすい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を使用してエクスペリエンスが構築されたことを示す小さなもの—を回避することを含みます。これらの手がかりの主な原因の1つは、Touchableコンポーネント(ButtonTouchableWithoutFeedbackTouchableHighlightTouchableOpacityTouchableNativeFeedbackTouchableBounce)でした。これらのコンポーネントを使用すると、ユーザーインタラクションへの視覚的なフィードバックを提供できるため、アプリケーションをインタラクティブにすることができます。しかし、プラットフォームのインタラクションと一致しない組み込みのスタイルとエフェクトが含まれているため、ユーザーはエクスペリエンスが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と呼ばれる色を提供しています。これは、次のようにPlatformColorを使用してReact Nativeで使用できます。

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

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

iOSで定義されているように、Textコンポーネントの色を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>;

Androidで定義されているように、Viewコンポーネントの背景色を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 storyboardを使用する必要があり、すべての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

本日、FlipperをデフォルトでサポートするReact Nativeバージョン0.62をリリースします。

このリリースは、世界的なパンデミックの真っ只中で行われます。このバージョンを本日リリースするのは、このリリースを実現するために尽力してくれた数百人のコントリビューターの功績を尊重し、リリースがマスターからあまり遅れないようにするためです。問題への対応能力の低下を考慮し、必要に応じてアップグレードの延期を検討してください。

デフォルトのFlipper

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

Screenshot of Flipper for React Native

Flipperは、すぐに使用できる次の機能を提供します。

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

さらに、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の取り組みの一環として、React Native WindowsやReact Native macOSなどの他のプラットフォームとApple TVを連携させるために、コアからApple TV固有のコードの削除を開始しました。

今後は、React NativeのApple TVサポートは、対応するreact-native-tvosNPMパッケージとともに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エラーおよび警告エクスペリエンスをオプトインとして追加しました。有効にするには、require('react-native').unstable_enableLogBox()index.jsファイルに追加します。
  • React DevTools v4: この変更には、最新のReact DevToolsへのアップグレードが含まれており、パフォーマンスの大幅な向上、ナビゲーションエクスペリエンスの改善、React Hooksの完全サポートを提供します。
  • アクセシビリティの改善: accessibilityValueの追加、Touchablesの不足しているプロパティ、onSlidingComplete アクセシビリティイベント、およびSwitchコンポーネントのデフォルトの役割を"button"から"switch"に変更するなど、アクセシビリティが改善されました。

破壊的変更

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

非推奨

謝辞

0.62 を実現するために尽力してくれた数百人のコントリビューターに感謝します!

すべての更新を確認するには、0.62 の変更ログをご覧ください。

新しいReact NativeコマンドであるDoctorの紹介

·読了時間2分
Lucas Bento
React Native コミュニティ

React Native コミュニティの6人のコントリビューターによる20件以上のプルリクエストを経て、開発環境の開始、トラブルシューティング、エラーの自動修正に役立つ新しいコマンドであるreact-native doctorをリリースできることを嬉しく思います。doctorコマンドは、ExpoHomebrew独自のdoctorコマンドを参考に、Jestにヒントを得たUIで作成されています。

高速リフレッシュを搭載したReact Native 0.61の発表

·読了時間3分
Dan Abramov
Facebook React Core

Fast Refreshと呼ばれる新しいリロードエクスペリエンスを含むReact Native 0.61を発表できることを嬉しく思います。

Fast Refresh

React Nativeコミュニティによくある問題点について尋ねたところ、上位の回答の1つは「ホットリロード」機能が壊れているということでした。関数コンポーネントでは信頼性のある動作をせず、画面を更新できないことが多く、タイプミスやミスにも対応できませんでした。ほとんどの人が信頼性が低いため、オフにしていたと聞いています。

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

  • Fast Refreshは、関数コンポーネントとHooksを含む最新のReactを完全にサポートします。
  • Fast Refreshは、タイプミスやその他のミスをうまく回復し、必要に応じて完全なリロードにフォールバックします。
  • Fast Refreshは、侵入的なコード変換を実行しないため、デフォルトで有効にするのに十分な信頼性があります。

Fast Refreshの動作を確認するには、このビデオをご覧ください。

試してみて、ご意見をお聞かせください!必要に応じて、Dev Menu(iOSではCmd + D、AndroidではCmd + MまたはCtrl + M)でオフにすることができます。オンとオフの切り替えは瞬時に行えるため、いつでも実行できます。

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

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

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による自動リンクサポートを導入しました。また、e2eテスト実行にもCocoaPodsを統合したため、これからは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:Time To Interactive)の短縮により、React Nativeのパフォーマンスを向上させます。

「パフォーマンスデータを分析した結果、JavaScriptエンジン自体が起動パフォーマンスとダウンロードサイズに大きく影響していることに気づきました。このデータに基づき、デスクトップやラップトップと比較して、より制約のある携帯電話の環境でJavaScriptのパフォーマンスを最適化する必要がありました。他の選択肢を検討した後、Hermesと呼ぶ新しいJavaScriptエンジンを構築しました。これは、メモリ、ストレージ、処理能力が限られた大量市場向けデバイスでも、React Nativeアプリに焦点を当ててアプリのパフォーマンスを向上させるように設計されています。」—Hermes:モバイルアプリ向けに最適化されたオープンソースJavaScriptエンジン(React Nativeから開始)

すぐに開始したいですか?ドキュメントで、既存のReact NativeアプリでHermesを有効にするための新しいガイドを確認してください

HermesとReact Nativeのロゴが翼のある怒りに合体し、光るAndroid携帯からと思われるものから、激しい雷雨の中で上昇しているイラスト。 イラスト:レイチェル・ネイボーズ