本文へスキップ

「announcement」タグ付き投稿 51 件

すべてのタグを表示

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と呼ばれる色を提供しています。これは、React Nativeで次のようにPlatformColorを使用して使用できます。

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

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

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

一方、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で定義されているcolorButtonNormalをViewコンポーネントの背景色に設定します。

ドキュメント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を起動します。
  • クラッシュレポーター:AndroidおよびiOSデバイスからのクラッシュレポートを表示します。
  • React DevTools:他のすべてのツールと並んで、最新バージョンのReact DevToolsを使用します。
  • ネットワークインスペクター:デバイスアプリケーションによって行われたすべてのネットワークリクエストを表示します。
  • 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-tvos0.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での不足しているprops、onSlidingComplete アクセシビリティイベント、Switchコンポーネントのデフォルトのロールを"button"から"switch"に変更するなど、アクセシビリティが改善されました。

破壊的変更

  • PropTypesの削除:React Nativeコアのアプリサイズの影響を軽減し、ランタイムではなくコンパイル時にチェックする静的型システムを優先するために、コアコンポーネントからpropTypesを削除します。
  • accessibilityStatesの削除非推奨のaccessibilityStatesプロパティを削除し、コンポーネントがアクセシビリティサービスに状態に関する情報をより意味のある方法で記述できる新しいaccessibilityStateプロパティを使用しました。
  • TextInput の変更: 使用頻度が低く、W3C 準拠しておらず、Fabricでの実装が困難であるため、onTextInput を TextInput から削除しました。Fabric での実装が困難なためです。また、ドキュメント化されていない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 コマンドを参考に、UI は Jest から着想を得ています。

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

·読了時間 3 分
Dan Abramov
Facebook の React Core チーム

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

Fast Refresh

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

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

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

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

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

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

  • Fast Refresh は、デフォルトで関数コンポーネント(およびフック!)の 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 を介した自動リンクサポートを導入しました。また、エンドツーエンドテストの実行に CocoaPods を統合したため、これ以降、RN を 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:Time To Interactive)の短縮により、React Native のパフォーマンスを向上させます。

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

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

Hermes と React Native のロゴが翼のある怒りに結合し、おそらく Android 電話から、輝く電気嵐から上昇しているイラスト。 Rachel Nabors によるイラスト

React Native 0.60 の発表

·読了時間:5分
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 on discussions-and-proposals

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

CocoaPodsのデフォルト使用

CocoaPodsは、React NativeのiOSプロジェクトに組み込まれました。これまで使用していなかった場合は、iOSプラットフォームのコードを開く際に、xcworkspaceファイルを使用するようにしてください(ヒント:ルートプロジェクトディレクトリからxed iosを試してみてください)。また、内部パッケージのpodspecがXcodeプロジェクトと互換性を持つように変更され、トラブルシューティングとデバッグが容易になります。この素晴らしいサポートを実現するために、0.60へのアップグレードの一環として、Podfileいくつかの簡単な変更を加える必要があります。use_frameworks!との互換性の問題があることを認識しており、回避策と今後のパッチに関する課題を追跡しています。

Lean Coreからの削除

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月

·読了時間:8分
Christoph Nakazawa
クリストフ・ナカザワ
元Facebookエンジニア

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

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

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

有意義なコミュニティ貢献

最近、素晴らしい貢献があったので、いくつか紹介したいと思います。

Lean Core

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) に増加しました。現在、masterブランチではバンドルサイズが28KB削減され、579KBになっています。これは100KB以上の差です!

Lean Core の最初のイテレーションが完了するにつれて、React Native に追加される新しいAPIについてより意図的に取り組み、React Native をより小さく、高速にする方法を継続的に評価し、コミュニティがさまざまなコンポーネントの所有権を握る方法を見つける努力をします。

ユーザーフィードバック

6ヶ月前、コミュニティに「React Nativeで何が気に入らないですか?」という質問をしました。これは、人々が直面している問題の全体像を把握するのに役立ちました。数ヶ月前に投稿に返信しましたが、主要な問題に対する進捗状況を要約する時期です。

  • アップグレード:React Native コミュニティは、アップグレードエクスペリエンスの改善に積極的に取り組んでおり、自動リンクrn-diff-purgeによるより優れたアップグレードコマンド、アップグレードヘルパーウェブサイト(近日公開予定)などが提供されています。また、メジャーリリースごとにブログ記事を公開することで、破壊的変更とエキサイティングな新機能を確実に伝えます。これらの改善の多くにより、0.60 リリース以降の将来のアップグレードが大幅に容易になります。
  • サポート/不確実性:多くの人が、プルリクエストへの活動の不足と、FacebookによるReact Nativeへの投資に関する一般的な不確実性に不満を持っていました。上記で示したように、私たちは、さらに多くのプルリクエストに対応できる準備が整っており、皆様からの提案と貢献を熱心に期待していることを自信を持って言えます!
  • パフォーマンス:React Native 0.59 は、新しく、はるかに高速なバージョンのJavaScriptCore (JSC) を搭載しています。別途、inline-requiresをデフォルトで有効にすることを容易にするための作業を進めており、今後数ヶ月でさらにエキサイティングなアップデートを提供する予定です。
  • ドキュメント:最近、React Native のドキュメントの見直しと書き直しを開始しました。貢献をご希望の場合は、ぜひご協力ください!
  • Xcode の警告:既存の警告をすべて解消し、新しい警告が発生しないように努めています。
  • ホットリロード:React チームは、まもなく React Native に統合される新しいホットリロードシステムを構築しています。

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

  • デバッグ:毎日遭遇していた多くの不便なバグと問題を修正しましたが、残念ながら、私たちが望むほどには進捗がありませんでした。React Nativeでのデバッグは理想的ではないことを認識しており、今後、この改善を優先します。
  • Metro シンボリックリンク:残念ながら、まだこれに対するシンプルで直接的な解決策を実装できていません。しかし、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エンジニア

今週、Eli WhiteF8 2019で、Facebook の Android および iOS アプリケーションにおける React Native について講演を行いました。過去2年間の取り組みと今後の取り組みについて共有できることを嬉しく思っています。

Facebook の開発者ウェブサイトで動画をご覧ください。

F8 Talk about React Native

講演のハイライト

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

オープンソースに関する React Radio Podcast

Eli の講演は、最近のオープンソースの取り組みについて説明して締めくくられています。3月に進捗状況のアップデートを行い、最近ではNader DabitGant Labordeが Christoph を彼らのポッドキャストReact Native Radioに招待し、オープンソースにおける React Native についてチャットしました。

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

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

近日中に、お気に入りのポッドキャスティングアプリでエピソードを見つけるか、ここで録音されたものを聞くことができます。

React Native 0.59 のリリース

読了時間6分
Ryan Turner
コアメンテナー&React Native 開発者

React Native 0.59 リリースへようこそ!これは88人のコントリビューターによる644コミットを含む、大きなリリースです。貢献は他にも様々な形で行われます。皆様によるイシューのメンテナンス、コミュニティの育成、React Nativeに関する教育へのご尽力に感謝申し上げます。今月は多くの待望の変更が加わっており、皆様に喜んでいただけるものと信じています。

🎣 Hooksが登場

このリリースには、ステートフルなロジックをコンポーネント間で再利用できるReact Hooksが含まれています。Hooksに関する話題は多いですが、まだ聞いたことがない方は、下記の素晴らしいリソースをご覧ください。

  • Hooksの紹介では、なぜHooksをReactに追加するのかを説明しています。
  • Hooksの概要は、組み込みHooksの速習概要です。
  • 独自のHooksの作成は、カスタムHooksによるコードの再利用を示しています。
  • React Hooksを理解するでは、Hooksによって実現される新たな可能性を探ります。
  • useHooks.comでは、コミュニティが管理するHooksのレシピとデモを紹介しています。

ぜひ、あなたのアプリで試してみてください。私たちと同じように、再利用の利便性を実感していただけることを願っています。

📱 JSCの更新によるパフォーマンス向上とAndroidでの64ビットサポート

React Nativeは、アプリケーションの動作にJSC(JavaScriptCore)を使用しています。AndroidのJSCは数年前のバージョンであり、多くの最新のJavaScript機能がサポートされていませんでした。さらに悪いことに、iOSの最新のJSCと比較してパフォーマンスが低かったのです。このリリースでは、すべてが変わります。

@DanielZlotin@dulmandakh@gengjiawen@kmagiera、そして@kudoによる素晴らしい作業のおかげで、JSCはここ数年の進化に追いつきました。これにより、64ビットサポート、最新のJavaScriptサポート、そして大幅なパフォーマンス向上がもたらされます。今後のWebKitの改善をそれほどの手間をかけずに活用できるよう、このプロセスを維持可能なものにした点も称賛に値します。Software MansionとExpoがこの作業を可能にしたことに感謝いたします。

💨 インラインrequireによるアプリ起動速度の向上

私たちは、デフォルトで高性能なReact Nativeアプリを提供することを目指しており、Facebookの最適化をコミュニティに提供するために取り組んでいます。アプリケーションは必要なときにリソースを読み込むため、起動が遅くなることはありません。この機能は「インラインrequire」と呼ばれ、Metroが遅延読み込みするコンポーネントを特定できるようにします。複雑で多様なコンポーネントアーキテクチャを持つアプリでは、最も大きな改善が見られます。

source of the metro.config.js file in the 0.59 template, demonstrating where to enable inlineRequires

デフォルトで有効にする前に、コミュニティの皆様にその動作状況をご報告いただく必要があります。0.59にアップグレードすると、新しいmetro.config.jsファイルが作成されます。オプションをtrueに切り替え、フィードバックをお寄せください!インラインrequireの詳細については、パフォーマンスドキュメントを参照して、アプリのベンチマークを行ってください。

🚅 Lean coreの進行状況

React Nativeは、複雑なリポジトリを持つ大規模で複雑なプロジェクトです。これにより、コードベースはコントリビューターにとって分かりにくくなり、テストが困難になり、開発依存関係として肥大化します。Lean Coreは、より良い管理のためにコードを個別のライブラリに移行することでこれらの問題に対処するための取り組みです。ここ数回のリリースでは、その最初のステップが行われていますが、真剣に取り組む時が来ました

追加のコンポーネントが正式に非推奨になったことに気付かれるかもしれません。これは素晴らしいニュースです。これらの機能を積極的に維持管理する所有者がいるようになったからです。警告メッセージに従い、これらの機能の新しいライブラリに移行してください。将来のリリースでは削除される予定です。以下は、コンポーネント、そのステータス、そして移行先を示す表です。

コンポーネント非推奨?新しい場所
AsyncStorage0.59@react-native-community/react-native-async-storage
ImageStore0.59expo-file-system または react-native-fs
MaskedViewIOS0.59@react-native-community/react-native-masked-view
NetInfo0.59@react-native-community/react-native-netinfo
Slider0.59@react-native-community/react-native-slider
ViewPagerAndroid0.59@react-native-community/react-native-viewpager

今後数ヶ月間で、より多くのコンポーネントがLean coreへと移行されます。この作業へのご協力をお願いします。 Lean core umbrella にアクセスしてご参加ください。

👩🏽‍💻 CLIの改善

React Nativeのコマンドラインツールは、開発者にとってエコシステムへのエントリーポイントですが、長年の問題を抱えており、公式サポートがありませんでした。CLIツールは新しいリポジトリに移行され、専用のメンテナンスチームがすでにいくつかのエキサイティングな改善を行いました。

ログのフォーマットが大幅に向上しました。コマンドの実行速度が大幅に向上しました。すぐに違いに気付くでしょう。

0.58&#39;s CLI is slow to start0.58&#39;s CLI is nearly instantaneous

🚀 0.59へのアップグレード

React Nativeのアップグレードプロセスに関する皆様からのフィードバックを参考に、今後のリリースでエクスペリエンスを向上させるための措置を講じています。0.59にアップグレードするには、rn-diff-purgeを使用して、現在のReact Nativeバージョンと0.59の違いを特定し、それらの変更を手動で適用することをお勧めします。プロジェクトを0.59にアップグレードしたら、新しく改良されたreact-native upgradeコマンド(rn-diff-purgeに基づいています!)を使用して、新しいリリースが利用可能になるにつれて0.60以降にアップグレードできます。

🔨 破壊的変更

0.59のAndroidサポートは、Googleの最新の推奨事項に従って整理されたため、既存のアプリが壊れる可能性があります。この問題は、ランタイムクラッシュと「このアクティビティにはTheme.AppCompatテーマ(またはその子孫)を使用する必要があります」というメッセージとして表示される可能性があります。プロジェクトのAndroidManifest.xmlファイルを更新し、android:themeの値がAppCompatテーマ(例:@style/Theme.AppCompat.Light.NoActionBar)であることを確認することをお勧めします。

新しく改良されたreact-native upgradeコマンドに置き換わったため、react-native-git-upgradeコマンドは0.59で削除されました。

🤗 感謝

多くの新しいコントリビューターがFlow型からのネイティブコードの生成の有効化Xcode警告の解決に貢献しました。これらは、React Nativeの仕組みを学ぶ良い方法であり、より良い未来への貢献です。ありがとうございます!今後、同様のイシューにご注目ください。

これらは私たちが注目したハイライトですが、他にも多くの注目すべき点があります。すべての更新を確認するには、変更ログをご覧ください。0.59は巨大なリリースです。皆様が試していただけることを楽しみにしています。

今年後半にも、さらに多くの改善を予定しています。ご期待ください!

RyanReact Nativeコアチーム全体

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

·読了時間:5分
Christoph Nakazawa
クリストフ・ナカザワ
元Facebookエンジニア

私たちは、React Nativeオープンソースコミュニティへの投資を拡大することを決定した後、2018年第4四半期にReact Nativeオープンソースロードマップを発表しました。

最初のマイルストーンでは、コミュニティで最も目に見える側面の特定と改善に焦点を当てました。私たちの目標は、未処理のプルリクエストの削減、プロジェクトの表面積の削減、主要なユーザーの問題の特定、コミュニティ管理のガイドラインの確立でした。

過去2ヶ月間で、予想以上の進歩を遂げました。詳細については、以下をお読みください。

プルリクエスト

健全なコミュニティを構築するためには、コードへの貢献に迅速に対応する必要があります。過去数年間にわたって、コミュニティからの貢献のレビューを優先順位が低く、280件のプルリクエストが蓄積されました(2018年12月)。最初のマイルストーンでは、未処理のプルリクエストの数を約65件に削減しました。同時に、1日あたりのプルリクエストの平均件数は3.5件から7件に増加しました。つまり、過去3ヶ月間に約600件のプルリクエストを処理しました。

プルリクエストの約3分の2をマージし、3分の1をクローズしました。それらは、時代遅れであるか、品質が低い場合、またはプロジェクトの表面積を不必要に増やす場合に、マージされずにクローズされました。マージされたプルリクエストのほとんどは、バグの修正、クロスプラットフォームのパリティの向上、または新機能の導入を行いました。注目すべき貢献としては、型安全性の向上とAndroidXのサポートの継続的な取り組みがあります。

Facebookでは、masterからReact Nativeを実行しているため、React Nativeリリースに反映される前に、すべての変更を最初にテストします。マージされたプルリクエストのうち、6件のみが問題を引き起こしました。4件は内部開発のみに影響し、2件はリリース候補段階で検出されました。

コミュニティからのより目に見える貢献の1つは、更新された「RedBox」画面でした。これは、コミュニティが開発者のエクスペリエンスをより使いやすくしている良い例です。

Lean Core

React Nativeは現在、非常に広い表面積を持ち、Facebookではあまり使用していない多くのメンテナンスされていない抽象化があります。React Nativeを小さくし、コミュニティがFacebookではほとんど使用されていない抽象化をより適切に管理できるようにするために、表面積の縮小に取り組んでいます。

最初のマイルストーンでは、Lean Coreプロジェクトについてコミュニティに協力を要請しました。その反応は圧倒的で、進捗状況を把握するのに苦労するほどでした。1ヶ月足らずで完了した作業をご覧ください

最も嬉しかったのは、メンテナーが長年の問題の修正、テストの追加、そして長らく要望されていた機能のサポートに飛びついてくれたことです。これらのモジュールは、React Native内であった時よりも多くのサポートを受けており、これがコミュニティにとって大きな一歩であることを示しています。そのようなプロジェクトの例としては、抽出以降多くのプルリクエストを受け取っているWebViewや、現在コミュニティメンバーによってメンテナンスされているCLIがあり、多くの必要な改善と修正が行われています。

主要なユーザー問題

12月には、コミュニティにReact Nativeについて気に入らない点を尋ねました。回答をまとめ、すべての問題に返信しました。幸いにも、コミュニティが直面している多くの問題は、Facebookでも問題となっています。次のマイルストーンでは、主要な問題の一部に対処する予定です。

最も多くの票を集めた問題の1つは、新しいバージョンのReact Nativeへのアップグレードの開発者エクスペリエンスでした。残念ながら、私たちはmasterブランチからReact Nativeを実行しているので、自分ではこの問題を経験していません。ありがたいことに、コミュニティのメンバーがすでにこの問題に対処するために立ち上がっています。

0.59リリース

特にMike GrabowskiLorenzo SciandraといったReact Nativeコミュニティの助けがなければ、リリースを行うことはできませんでした。リリース管理プロセスを改善し、今後より積極的に関与していく予定です。

  • 主要なリリースごとにブログ記事を作成するために、コミュニティメンバーと協力します。
  • ユーザーが新しいバージョンにアップグレードすると、CLIで直接破壊的変更を表示します。
  • リリースにかかる時間を短縮します。自動テストの増加と、改善された手動テストプランの作成を検討しています。

これらの計画の多くは、今後のReact Native 0.59リリースに組み込まれます。0.59には、React Hooks、Android向けの新しい64ビット版JavaScriptCore、多くのパフォーマンスと機能の改善が含まれています。現在リリース候補として公開されており、今後2週間以内に安定版となる予定です。

今後のステップ

今後2ヶ月間は、未解決のGitHubの問題数を減らしながら、予定通りにプルリクエストを管理し続けます。Lean Coreプロジェクトを通じて、React Nativeの表面積を削減し続けます。コミュニティのトップ5の問題に対処する予定です。コミュニティガイドラインを最終化したら、ウェブサイトとドキュメントに注目します。

3月には、コミュニティから10名以上の貢献者をFacebookロンドンに招き、これらの取り組みを進めていくことを大変楽しみにしています。皆様がReact Nativeを使用されていることを嬉しく思っており、2019年に取り組んでいる改善点を皆様が見て感じていただければ幸いです。数ヶ月後に改めてアップデートを行い、その間も皆様のプルリクエストをマージしていきます! ⚛️✌️