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

GAADプレッジ - React Nativeのアクセシビリティ向上

·2分で読めます
Alexandra Marlette
Alexandra Marlette
React NativeのためのGAADプレッジ・オープンソース・アクセシビリティ・コミュニティマネージャー

React Nativeコミュニティの皆さん、

2020年5月、FacebookはGAADプレッジを最初に締結した企業となり、アクセシビリティをReact Nativeオープンソースプロジェクトの核となる部分にすることを約束しました。5月以来、FacebookはReact Native内のアクセシビリティのギャップを慎重にレビューし、文書化するために時間を費やしてきました。これまでのギャップ分析で90の問題が浮上し、そのすべてがGitHubの課題に翻訳されています。

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

貢献者の熱意と多様性は、これまで常にReact Nativeの開発において重要な役割を果たしてきました。これらのアクセシビリティのギャップは、現在の貢献者と新規の貢献者にとって大きな機会となります。React Nativeへの貢献に興味がある方は、React Nativeをよりアクセシブルにするために私たちに参加することを奨励します。

貢献者の努力を認識するため、アクセシビリティの問題がクローズされ、プルリクエストに添付された場合、貢献者はコミュニティマネージャーからTwitterで紹介されます。プルリクエストがコードベースに受け入れられた貢献者は、React Nativeブログの毎月の課題更新で注目されます。

ぜひ、私たちと一緒にReact Nativeを誰もがよりアクセスしやすいものにしていきましょう。

協力方法:

  • 新規貢献者は、貢献ガイドを読み、React Native GitHubで46の初めての課題に最適なリストを閲覧してください。

  • より多くの労力を必要とする問題に関心のあるコントリビューターは、「Improved React Native Accessibility」のプロジェクトページにアクセスして、React Nativeの知識が必要なGitHubの問題を確認してください。

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

  • このイニシアチブを、協力してくれる可能性のある方々と共有してください!

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

React Nativeドキュメントの更新

·4分で読めます
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上の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、およびウェブ間でビジネスロジックを共有することもできます。これにより、更新をより迅速にリリースし、プラットフォームチーム間の組織のサイロを減らすことができます。

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

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

React Nativeは、モバイル、デスクトップ、ウェブ、TV、VR、ゲーム機など、非常に異なるプラットフォームを対象としています。私たちは、開発者が最低共通の分母向けにビルドすることを要求するのではなく、各プラットフォームで豊かなエクスペリエンスを可能にしたいと考えています。これを達成するために、私たちは各プラットフォームのユニークな機能のサポートに焦点を当てています。これには、さまざまな入力メカニズム(例:タッチ、ペン、マウス)から、VRの3D環境のような根本的に異なる消費エクスペリエンスまでが含まれます。

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

宣言型UI

私たちは、すべてのプラットフォームでまったく同じユーザーインターフェースを展開するのではなく、同じ宣言型プログラミングモデルで各プラットフォームのユニークな機能を公開することを信じています。私たちの宣言型プログラミングモデルはReactです。

私たちの経験では、Reactによって普及した一方向データフローは、アプリケーションを理解しやすくします。私たちは、画面を命令的に管理されたビューとしてではなく、宣言型コンポーネントの構成として表現することを好みます。ウェブでの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をオプトインとして導入しました。このリリースでは、LogBoxをReact Native全体のデフォルト体験としてローンチします。

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

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

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

  • ログ通知: 警告通知を再設計し、エラーのサポートも追加しました。これにより、すべてのconsole.warnとconsole.logメッセージがアプリを覆い隠すのではなく、通知として表示されるようになります。
  • コードフレーム: すべてのエラーと警告に、アプリ内で直接ログのソースコードを表示するコードフレームが含まれるようになりました。これにより、問題の原因を迅速に特定できます。
  • コンポーネントスタック: すべてのコンポーネントスタックはエラーメッセージから削除され、先頭の 3 つのフレームが見える独自のセクションに配置されます。これにより、ログメッセージを cluttered (散らかす) ことなく、スタックフレーム情報を期待できる一貫した単一のスペースが提供されます。
  • スタックフレームの折りたたみ: デフォルトで、アプリケーションのコードに関係のないコールスタックフレームを折りたたむようになりました。これにより、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 は、アプリケーションがプラットフォームのユーザーの期待に応えることを可能にするように構築されています。これには、「tell」(そのエクスペリエンスが React Native で構築されたことを示す小さなもの)を避けることが含まれます。これらの tell の主要な原因の 1 つは、ButtonTouchableWithoutFeedbackTouchableHighlightTouchableOpacityTouchableNativeFeedbackTouchableBounce などの Touchable コンポーネントでした。これらのコンポーネントは、ユーザーインタラクションに視覚的なフィードバックを提供できるようにすることで、アプリケーションをインタラクティブにします。しかし、プラットフォームのインタラクションと一致しない組み込みのスタイルと効果が含まれているため、ユーザーはエクスペリエンスが 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 を使用している場合は、最新のセキュリティ修正と更新をすべて受け取るためにアップグレードすることをお勧めします。

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

  • 明示的なサイズなしで <Text /> 内に <View /> をレンダリングするサポート: これまで常に可能だったわけではありませんが、幅と高さを明示的に設定せずに、任意の <Text /> コンポーネント内に任意の <View /> をレンダリングできるようになりました。以前の 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のissueトラッカーであり、ユーザーはプロジェクトのアップグレードに関する特定の問題を提出し、コミュニティから助けを得ることができます。

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

その他の改善点

  • LogBox: 新しいLogBoxのエラーおよび警告表示機能をオプトインとして追加します。有効にするには、`index.js`ファイルに`require('react-native').unstable_enableLogBox()`を追加してください。
  • React DevTools v4: この変更には、パフォーマンスが大幅に向上し、ナビゲーションエクスペリエンスが改善され、React Hooksを完全にサポートする最新のReact DevToolsへのアップグレードが含まれています。
  • アクセシビリティの改善: 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テスト実行にも統合したため、今後はReact NativeをiOSアプリに統合する統一された標準的な方法が確立されます。これにより、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 フォンから、雷鳴が轟く嵐の中で立ち上がるイラスト。 イラスト:Rachel Nabors

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
Christoph Nakazawa
元Facebookエンジニア

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

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

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

意味のあるコミュニティ貢献

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

リーンコア

Lean Coreの主な動機は、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リリース以降の将来のアップグレードを大幅に容易にするでしょう。
  • サポート / 不確実性: 多くの人々は、プルリクエストの活動不足や、React Nativeに対するFacebookの投資に関する一般的な不確実性に不満を抱いていました。上記で示したように、私たちはさらに多くのプルリクエストを受け入れる準備ができており、皆様の提案と貢献を熱心に楽しみにしていると自信を持って言えます!
  • パフォーマンス: React Native 0.59は、新しいより高速なJavaScriptCore(JSC)バージョンと共にリリースされました。別途、私たちはインラインリクワイヤをデフォルトで有効にすることを容易にするために取り組んでおり、今後数ヶ月でさらにエキサイティングな最新情報をお届けします。
  • ドキュメント: 最近、React Nativeのドキュメントすべてを見直し、書き直す作業を開始しました。貢献を希望される場合は、ぜひお力をお借りしたいです!
  • Xcodeでの警告: 私たちは既存の警告をすべて取り除き、新しい警告を導入しないよう努力しています。
  • ホットリローディング: Reactチームは、まもなくReact Nativeに統合される新しいホットリローディングシステムを構築しています。

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

  • デバッグ: 私たちは、人々が毎日遭遇していた多くの不便なバグや問題を修正しましたが、残念ながら、望むほどこの点で進捗はありませんでした。React Nativeでのデバッグが優れているとは言えず、将来的にはこの改善を優先します。
  • Metro symlinks: 残念ながら、これに対するシンプルで直接的な解決策はまだ実装できていません。しかし、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にも注目してください。きっとエキサイティングなものになるでしょう