今天,我们发布了 React Native 0.63,默认情况下启用了 LogBox。
LogBox
我们经常从社区收到反馈,称 React Native 中的错误和警告难以调试。为了解决这些问题,我们查看了 React Native 中的整个错误、警告和日志系统,并对其进行了从头开始的重新设计。
LogBox 是 React Native 中完全重新设计的红框、黄框和日志体验。在 0.62 版本中,我们将 LogBox 作为可选功能引入。在此版本中,我们将 LogBox 作为所有 React Native 的默认体验推出。
LogBox 通过关注三个主要目标来解决错误和警告过于冗长、格式不佳或不可操作的抱怨。
- **简洁**:日志应提供调试问题所需的最低限度信息。
- **格式化**:日志应进行格式化,以便您可以快速找到所需的信息。
- **可操作**:日志应该是可操作的,以便您可以修复问题并继续前进。
为了实现这些目标,LogBox 包括
- **日志通知**:我们重新设计了警告通知,并添加了对错误的支持,以便所有 console.warn 和 console.log 消息都显示为通知,而不是覆盖您的应用程序。
- **代码帧**:每个错误和警告现在都包含一个代码帧,该代码帧显示日志的源代码,直接在应用程序内,允许您快速识别问题来源。
- **组件堆栈**:所有组件堆栈现在都从错误消息中剥离,并放入自己的部分,其中显示前三个帧。这为您提供了一个单一一致的空间来期望堆栈帧信息,而不会使日志消息混乱。
- **堆栈帧折叠**:默认情况下,我们现在折叠与应用程序代码无关的调用堆栈帧,以便您可以快速查看应用程序中的问题,而无需筛选 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 的更多信息,请参阅此处文档here。
Pressable
React Native 旨在使应用程序能够满足用户对平台的期望。这包括避免“暗示”——一些暗示体验是用 React Native 构建的小细节。这些暗示的一个主要来源是 Touchable 组件:Button
、TouchableWithoutFeedback
、TouchableHighlight
、TouchableOpacity
、TouchableNativeFeedback
和 TouchableBounce
。这些组件通过允许您向用户交互提供视觉反馈来使您的应用程序具有交互性。但是,由于它们包含不匹配平台交互的内置样式和效果,因此用户可以分辨出体验是用 React Native 编写的。
此外,随着 React Native 的发展以及我们对高质量应用程序的要求提高,这些组件并没有随之发展。React Native 现在支持 Web、桌面和电视等平台,但对其他输入模式的支持却有所欠缺。React Native 需要在所有平台上支持高质量的交互体验。
为了解决这些问题,我们发布了一个名为 Pressable
的新核心组件。此组件可用于检测各种类型的交互。API 的设计目的是提供对交互当前状态的直接访问,而无需在父组件中手动维护状态。它还旨在使平台能够扩展其功能,以包括悬停、模糊、焦点等。我们预计大多数人将构建和共享利用 Pressable
的底层组件,而不是依赖于 TouchableOpacity
等内容的默认体验。
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 组件运行的简单示例
您可以从文档中了解更多信息。
每个原生平台都有系统定义颜色的概念。这些颜色会自动响应系统主题设置(例如浅色或深色模式)、辅助功能设置(例如高对比度模式),甚至是在应用程序中的上下文(例如包含视图或窗口的特性)。
虽然可以通过Appearance
API 和/或AccessibilityInfo
检测其中一些设置并相应地设置您的样式,但这种抽象不仅开发成本高,而且近似于原生颜色的外观。当处理混合应用程序时,这些不一致性尤其明显,其中 React Native 元素与原生元素并存。
React Native 现在提供了一种开箱即用的解决方案来使用这些系统颜色。PlatformColor()
是一个新的 API,可以像 React Native 中的任何其他颜色一样使用。
例如,在 iOS 上,系统提供了一种名为 labelColor
的颜色。这可以通过 PlatformColor
在 React Native 中使用,如下所示
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 支持
在发布四年多后,我们放弃了对 iOS 9 的支持。此更改将使我们能够通过减少需要放在原生代码中的兼容性检查的数量来更快地前进,以检测某个功能是否在特定 iOS 版本上受支持。由于其市场份额为 1%,因此对您的客户几乎不会产生负面影响。
同时,我们也放弃了对 Node 8 的支持。其 LTS 维护周期于 2019 年 12 月到期。当前的 LTS 是 Node 10,现在是我们目标的版本。如果您仍在使用 Node 8 开发 React Native 应用程序,我们建议您升级以接收所有最新的安全修复和更新。
其他值得注意的改进
- **支持在
<Text />
中渲染 <View />
而不显式设置大小**:您现在可以在任何 <Text />
组件中渲染任何 <View />
,而无需显式设置其宽度和高度,这在以前并非总是可能的。在 React Native 的先前版本中,这会导致 RedBox。
- **将 iOS 启动屏幕从
xib
更改为 storyboard
**:从 2020 年 4 月 30 日开始,提交到 App Store 的所有应用程序都必须使用 Xcode 故事板来提供应用程序的启动屏幕,并且所有 iPhone 应用程序都必须支持所有 iPhone 屏幕。此提交调整了默认的 React Native 模板,使其与此要求兼容。
感谢数百位贡献者帮助实现了 0.63!
特别感谢Rick Hanlon 撰写了关于 LogBox
的部分,以及Eli White 撰写了本文中关于 Pressable
的部分。
要查看所有更新,请查看0.63 版本更新日志。