跳至主要内容

带有“announcement”标签的 51 篇文章

查看所有标签

宣布发布 React Native 0.63,包含 LogBox

·阅读时长 8 分钟
Mike Grabowski
Mike Grabowski
Callstack 首席技术官兼联合创始人

今天,我们发布了 React Native 0.63,默认情况下启用 LogBox。

LogBox

我们经常收到社区的反馈,说 React Native 中的错误和警告难以调试。为了解决这些问题,我们查看了 React Native 中的整个错误、警告和日志系统,并对其进行了重新设计 从头开始

Screenshot of LogBox

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 的更多信息,请参阅文档 此处

Pressable

React Native 旨在使应用程序能够满足用户对平台的期望。这包括避免“暗示”——一些表明体验是使用 React Native 构建的小细节。这些暗示的一个主要来源是 Touchable 组件:ButtonTouchableWithoutFeedbackTouchableHighlightTouchableOpacityTouchableNativeFeedbackTouchableBounce。这些组件通过允许您为用户交互提供视觉反馈,使您的应用程序具有交互性。但是,由于它们包含不匹配平台交互的内置样式和效果,因此用户可以分辨出体验是用 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 组件实际应用的简单示例

您可以从 文档 中了解更多信息。

原生颜色 (PlatformColor、DynamicColorIOS)

每个原生平台都有系统定义颜色的概念。颜色会自动响应系统主题设置(如亮模式或暗模式)、辅助功能设置(如高对比度模式),甚至是在应用中的上下文(如包含视图或窗口的特性)。

虽然可以通过 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 版本的变更日志

宣布发布 React Native 0.62,包含 Flipper

·阅读时间:5 分钟
Rick Hanlon
Facebook React Native 核心团队

今天,我们发布了 React Native 0.62 版本,其中默认包含对 Flipper 的支持。

此次发布正值全球大流行期间。我们今天发布此版本是为了尊重数百位贡献者为实现此版本所付出的努力,并防止版本落后于主分支。请注意贡献者帮助解决问题的能力有所下降,并在必要时准备延迟升级。

默认启用 Flipper

Flipper 是一款用于调试移动应用的开发者工具。它在 Android 和 iOS 社区很受欢迎,在本版本中,我们已为新旧 React Native 应用默认启用了支持。

Screenshot of Flipper for React Native

Flipper 默认提供以下功能

  • Metro 操作:从工具栏直接重新加载应用并触发开发者菜单。
  • 崩溃报告器:查看来自 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

作为我们 精简核心工作 的一部分,以及为了使 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 的公开版本。对于此 0.62 版本的 react-native,请将 Apple TV 项目升级到使用 react-native-tvos 0.62。

更多升级支持

在发布 0.61 版本时,社区引入了一个新的 升级助手 工具来支持开发者升级到新版本的 React Native。升级助手提供从您当前版本到目标版本的更改差异,使您能够查看特定升级需要进行的更改。

即使使用此工具,升级时也会出现问题。今天,我们通过宣布 Upgrade-Support 来提供更多专门的升级支持。Upgrade Support 是一个 GitHub 问题跟踪器,用户可以在其中提交特定于升级其项目的 issue,以获得社区的帮助。

我们一直在努力改进升级体验,我们希望这些工具能够为用户提供他们在我们尚未涵盖的极端情况下所需的帮助。

其他改进

  • LogBox:我们正在添加新的 LogBox 错误和警告体验作为可选功能;要启用它,请将 require('react-native').unstable_enableLogBox() 添加到您的 index.js 文件中。
  • React DevTools v4:此更改包括升级到 最新版本的 React DevTools,它提供了显着的性能提升、改进的导航体验以及对 React Hooks 的完全支持。
  • 辅助功能改进:我们对辅助功能进行了改进,包括添加 accessibilityValueTouchables 上缺少的 props、onSlidingComplete 辅助功能事件,以及将 Switch 组件的默认角色从 "button" 更改为 "switch"

重大更改

  • 删除 PropTypes:我们正在从核心组件中删除 propTypes,以减少 React Native 核心对应用大小的影响,并倾向于在编译时而不是运行时进行检查的静态类型系统。
  • 删除 accessibilityStates:我们已 删除 已弃用的 accessibilityStates 属性,转而使用新的 accessibilityState 属性,这是一种更具语义意义的方式,组件可以通过它向辅助功能服务描述有关其状态的信息。
  • TextInput 更改:我们已从 TextInput 中 删除了 onTextInput,因为它不常见、不符合 W3C 标准,并且难以在 Fabric 中实现。我们还删除了未公开的 inputView 属性和 selectionState

弃用

致谢

感谢数百位贡献者帮助实现了 0.62 版本!

要查看所有更新,请查看 0.62 版本的变更日志

认识 Doctor,一个新的 React Native 命令

·阅读时间:2 分钟
Lucas Bento
React Native 社区

在 React Native 社区 6 位贡献者提交了 20 多个 pull request 后,我们很高兴推出 `react-native doctor`,这是一个新的命令,可以帮助您开始使用、排查并自动修复开发环境中的错误。`doctor` 命令深受 ExpoHomebrew 的 `doctor` 命令启发,并融合了 Jest 的 UI 设计元素。

宣布发布 React Native 0.61,包含快速刷新

·阅读时间:3 分钟
Dan Abramov
Facebook React 核心团队

我们很高兴地宣布 React Native 0.61 发布,其中包含一个名为“快速刷新”的新加载体验。

快速刷新

当我们询问 React Native 社区关于 常见痛点 时,其中一个最主要的答案是“热重载”功能存在问题。它在函数组件中无法可靠地工作,经常无法更新屏幕,并且对拼写错误和错误不具有弹性。我们了解到,大多数人因为它不可靠而将其关闭。

在 React Native 0.61 中,**我们将现有的“实时重载”(保存时重载)和“热重载”功能合并到一个名为“快速刷新”的新功能中**。快速刷新是从头开始实现的,遵循以下原则

  • 快速刷新**完全支持现代 React**,包括函数组件和 Hooks。
  • 快速刷新**在出现拼写错误**和其他错误时可以优雅地恢复,并在需要时回退到完整重载。
  • 快速刷新**不会执行侵入式代码转换**,因此它足够可靠,可以默认启用。

要查看快速刷新的实际效果,请观看此视频

尝试一下,并告诉我们您的想法!如果您愿意,可以在开发者菜单中将其关闭(iOS 上按 Cmd+D,Android 上按 Cmd+M 或 Ctrl+M)。开启和关闭都是即时的,因此您可以随时进行操作。

以下是一些快速刷新技巧

  • 默认情况下,快速刷新会保留函数组件(以及 Hooks!)中的 React 本地状态。
  • 如果您需要在每次编辑时重置 React 状态,可以在包含该组件的文件中添加一个特殊的 `// @refresh reset` 注释。
  • 快速刷新始终会重新挂载类组件,而不会保留状态。这确保了它的可靠性。
  • 我们都会在代码中犯错!在您保存文件后,快速刷新会自动重试渲染。修复语法或运行时错误后,您无需手动重新加载应用程序。
  • 在编辑过程中添加 `console.log` 或 `debugger` 语句是一种简洁的调试技巧。

如果您遇到任何与快速刷新相关的问题,请在 GitHub 上报告,我们会进行调查。

其他改进

  • **修复了 `use_frameworks!` CocoaPods 支持。**在 0.60 中,我们进行了一些更新以默认集成 CocoaPods。不幸的是,这破坏了使用 `use_frameworks!` 的构建。此问题已在 0.61 中修复,从而更容易将 React Native 集成到需要使用动态框架构建的 iOS 项目中。
  • **添加 `useWindowDimensions` Hook。**此新的 Hook 会自动提供并订阅尺寸更新,并且在大多数情况下可以替代 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 更新日志

认识 Hermes,一个为 React Native 优化的全新 JavaScript 引擎

·阅读时间:2 分钟
Rachel Nabors
Facebook 文档工程师

上周在 Chain React 大会上,我们宣布了 Hermes,这是我们在 Facebook 开发的一个开源 JavaScript 引擎。它是一个小巧轻便的 JavaScript 引擎,经过优化可在 Android 上运行 React Native。 查看详情!

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

·阅读时间:5 分钟
Ryan Turner
核心维护者 & React Native 开发者

在数百位贡献者数月的辛勤工作之后,React Native 核心团队自豪地宣布发布 0.60 版本。此版本处理了 Android 和 iOS 平台的重要迁移,并且还解决了许多问题。这篇博文涵盖了此版本的亮点。但一如既往,请参阅更新日志以获取更多详细信息。最后,感谢贡献者帮助我们实现这一里程碑!

关注可访问性

可访问性 API 已经有了许多改进,例如 `announceForAccessibility`,以及对 角色操作支持标志等的改进。可访问性是一门复杂的科学,但我们希望这些改进能够让成为 A11Y 变得更容易一些。请务必查看 2019 年 6 月 React Native 开源更新,以获取有关这些更改的更多详细信息。

全新开始

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 本身。它们不能在一个应用程序中并存使用,因此所有应用程序代码和依赖项代码都需要使用其中一个。

matt-oakesdiscussions-and-proposals

虽然您自己的原生代码需要由您自己迁移,但 @mikehardy@cawfree@m4tt72 创建了一个名为“jetifier”的 巧妙的工具 来修补您的 `node_modules`。库维护者需要进行升级,但此工具为您提供了一个临时解决方案,同时给他们时间发布 AndroidX 版本。因此,如果您发现与 AndroidX 迁移相关的错误,请尝试使用此工具。

默认使用 CocoaPods

CocoaPods 现在是 React Native iOS 项目的一部分。如果您还没有,请务必从现在开始使用 `xcworkspace` 文件打开 iOS 平台代码(提示:尝试从根项目目录运行 `xed ios`)。此外,内部包的 `podspec` 已更改以使其与 Xcode 项目兼容,这将有助于进行故障排除和调试。预计在升级到 0.60 的过程中,您需要对 `Podfile` 进行 一些简单的更改 以引入此激动人心的支持。请注意,我们知道 `use_frameworks!` 存在兼容性问题,并且我们正在跟踪一个 问题,其中包含解决方法和未来的补丁。

精简核心移除

**WebView** 和 **NetInfo** 之前已提取到单独的存储库中,在 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 创建了一个名为 升级助手 的优秀工具,旨在简化升级流程。它帮助 React Native 用户处理老旧应用或复杂的自定义情况,查看不同版本之间的变化。请查看 更新后的升级文档,并立即尝试使用它来进行升级!

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

致库维护者

AndroidX 的更改几乎肯定需要更新您的库,因此请确保尽快添加支持。如果您目前无法升级,请考虑使用 jetifier 检查您的库,以确认用户是否能够在构建时修补您的库。

查看 自动链接 文档以更新您的配置和自述文件。根据您库之前是如何集成的,您可能还需要进行一些其他更改。请查看 CLI 的 依赖项 指南,了解如何定义您的依赖项接口。

致谢

虽然这些是我们注意到的重点,但还有许多其他令人兴奋的更新。要查看所有更新,请查看 变更日志。一如既往,敬请关注更多新闻。同时,享受 0.60 版本!

2019 年 6 月 React Native 开源更新

·阅读时长 8 分钟
Christoph Nakazawa
Christoph Nakazawa
前 Facebook 工程师

代码与社区健康

在过去的六个月中,React Native 累计收到了来自 550 多位贡献者的 2800 次提交。社区中的 400 位贡献者创建了超过 1150 个 Pull Request,其中 820 个 Pull Request 已合并。

在过去的六个月中,平均每天的 Pull Request 数量从 3 个增加到大约 6 个,即使我们通过精简核心工作将网站、CLI 和许多模块从 React Native 中分离出来。现在平均未处理的 Pull Request 数量低于 25 个,我们通常会在几小时或几天内回复建议和审查。

有意义的社区贡献

我们想重点介绍一些我们认为很棒的最新贡献。

精简核心

精简核心 的主要动机是将模块从 React Native 拆分为单独的存储库,以便它们可以获得更好的维护。在短短六个月内,WebViewNetInfoAsyncStorage网站CLI 等存储库共收到了 800 多个 Pull Request。除了更好的维护之外,这些项目还可以比 React Native 本身更频繁地独立发布。

我们还借此机会从 React Native 本身中删除了过时的 polyfill 和旧版组件。在过去,polyfill 是必需的,以便在旧版 JavaScriptCore (JSC) 中支持诸如 MapSet 之类的语言特性。现在 React Native 附带了一个新版本,因此已删除了这些 polyfill。

这项工作仍在进行中,在原生和 JavaScript 方面仍然需要拆分或删除更多内容,但有早期迹象表明我们成功地扭转了增加表面积和应用大小的趋势:例如,当查看 JavaScript 包时,大约一年前在 0.54 版本中,React Native JavaScript 包的大小为 530kb,并在短短 6 个月内增长到 0.57 版本的 607kb(+77kb)。现在,我们在 master 分支上看到了 28kb 的包大小减少,降至 579kb,变化幅度超过 100kb!

随着我们完成精简核心工作的第一轮迭代,我们将努力更加有意识地添加新的 React Native API,并且我们将持续评估使 React Native 更小更快的方法,以及赋予社区拥有各种组件所有权的方法。

用户反馈

六个月前,我们询问社区“您不喜欢 React Native 的哪些方面?”,这很好地概述了人们面临的问题。我们 几个月前回复了该帖子,现在是总结在主要问题上取得的进展的时候了。

  • 升级:React Native 社区在提升升级体验方面取得了多项改进:自动链接,通过 rn-diff-purge 提供了更佳的升级命令,以及即将推出的升级助手网站。我们还将通过发布每个主要版本的博文来确保传达重大更改和令人兴奋的新功能。这些改进中的许多都将使未来 0.60 版本之后的升级变得更加容易。
  • 支持/不确定性:许多人对 Pull Request 活动的缺乏以及 Facebook 对 React Native 投资的不确定性感到沮丧。如上所示,我们可以自信地说,我们已准备好处理更多 Pull Request,并且热切期待您的建议和贡献!
  • 性能:React Native 0.59 发布了一个新的、速度更快的 JavaScriptCore (JSC) 版本。另外,我们一直在努力使默认启用 内联 require 变得更容易,并在未来几个月内为您提供更多令人兴奋的更新。
  • 文档:我们最近开始努力 彻底检修并重写所有 React Native 文档。如果您想贡献,我们非常乐意得到您的帮助!
  • Xcode 中的警告:我们 消除了所有现有的警告,并努力避免引入新的警告。
  • 热重载:React 团队正在构建一个 新的热重载系统,该系统将很快集成到 React Native 中。

遗憾的是,我们尚未能够改进所有内容。

  • 调试:我们修复了许多人们每天都会遇到的不便的错误和问题,但遗憾的是,我们在这方面取得的进展并不像我们希望的那样多。我们认识到使用 React Native 进行调试并不是很好,并且我们将在未来优先改进这一点。
  • Metro 符号链接:遗憾的是,我们还没有能够为此实现一个简单而直接的解决方案。但是,React Native 用户 分享了各种解决方法,这些方法可能对您有效。

鉴于过去六个月的大量更改,我们想再次向您提出同样的问题。如果您正在使用最新版本的 React Native,并且您有一些想反馈的内容,请在我们的新版 “您不喜欢 React Native 的哪些方面?” 中发表评论。

持续集成

Facebook 首先将所有 Pull Request 和内部更改合并到 Facebook 的存储库中,然后将所有提交同步回 GitHub。Facebook 的基础设施与常见的持续集成服务不同,并非所有开源测试都在 Facebook 内部运行。这意味着同步到 GitHub 的提交经常会破坏开源中的测试,这需要大量时间来修复。

Héctor Ramos 来自 React Native 团队,过去两个月一直在改进 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
Christoph Nakazawa
前 Facebook 工程师

本周,Eli WhiteF8 2019 上发表了关于 Facebook 的 Android 和 iOS 应用程序中 React Native 的演讲。我们很高兴与大家分享我们在过去两年中的工作以及我们接下来的计划。

Facebook 的开发者网站 上观看视频。

F8 Talk about React Native

演讲亮点:

  • 我们在 2017 年和 2018 年专注于 React Native 最大的产品——Facebook 的 Marketplace。我们与 Marketplace 团队合作,以提高产品质量并增添乐趣。此时,Marketplace 成为 Facebook 应用中 Android 和 iOS 上质量最高的应用之一。
  • Marketplace 的性能也是一个巨大的挑战,尤其是在中端 Android 设备上。在过去一年中,我们启动时间减少了 50% 以上,并且还有更多改进正在进行中!最大的改进正在集成到 React Native 中,并将在今年晚些时候提供给社区。
  • 我们有信心可以使用 React Native 构建 Facebook 所需的高质量和高性能应用程序。这种信心让我们能够投资更大的项目,例如 重新思考 React Native 的核心
  • Microsoft 支持并使用 React Native for Windows,使人们能够利用他们的专业知识和代码库来渲染到 Microsoft 的通用 Windows 平台。请查看下周的 Microsoft Build,以 了解更多信息

关于开源的 React Radio 播客

Eli 的演讲以讨论我们最近的开源工作结束。我们在 3 月份 发布了我们进展的更新,最近 Nader DabitGant Laborde 邀请 Christoph 参加了他们的播客 React Native Radio 的聊天,讨论 React Native 的开源情况。

播客亮点:

  • 我们讨论了 Facebook 的 React Native 团队如何看待开源,以及我们如何构建一个可持续的社区,以扩展 React Native 规模 的项目。
  • 作为 精简核心 工作的一部分,我们正计划移除多个模块。自提取以来,WebView 和 React Native CLI 等许多模块已收到 100 多个 Pull Request。
  • 接下来,我们将专注于彻底检修 React Native 网站和文档。敬请期待!

您很快就会在您最喜欢的播客应用程序中找到该剧集,或者您可以在这里收听录音。

发布 React Native 0.59

·阅读时长:6 分钟
Ryan Turner
核心维护者 & React Native 开发者

欢迎使用 React Native 的 0.59 版本!这是另一个重大版本,包含 88 位贡献者提交的 644 次提交。贡献也以其他形式出现,因此感谢您维护问题、培养社区并向人们教授 React Native。本月带来了许多备受期待的更改,我们希望您喜欢它们。

🎣 Hooks 来了

React Hooks 是此版本的一部分,它允许您跨组件重用有状态逻辑。关于 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 的更多信息,在性能文档中 对您的应用进行基准测试。

🚅 精简核心正在进行中

React Native 是一个庞大而复杂的项目,拥有一个复杂的代码仓库。这使得代码库对贡献者来说不太容易理解,难以测试,并且作为开发依赖项变得臃肿。 精简核心 是我们为解决这些问题而做出的努力,通过将代码迁移到独立的库中以实现更好的管理。过去的几个版本已经看到了这方面的初步步骤,但让我们认真起来

您可能会注意到,一些组件现在已正式弃用。这是一个好消息,因为这些功能现在有了积极维护它们的负责人。请注意警告信息,并将您的使用迁移到这些功能的新库,因为它们将在未来的版本中被移除。下表列出了组件、其状态以及您可以迁移到的位置。

组件已弃用?新家
AsyncStorage0.59@react-native-community/react-native-async-storage
ImageStore0.59expo-file-systemreact-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

在接下来的几个月里,将会有更多组件遵循这条路径走向更精简的核心。我们正在寻求帮助——请前往 精简核心总览 贡献您的力量。

👩🏽‍💻 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-git-upgrade 命令已在 0.59 中移除,取而代之的是新改进的 react-native upgrade 命令。

🤗 感谢

许多新的贡献者帮助 启用了从 Flow 类型生成原生代码解决了 Xcode 警告 - 这些都是学习 React Native 工作原理和为更大的利益做出贡献的好方法。谢谢!请关注未来类似的问题。

虽然这些是我们注意到的亮点,但还有许多其他值得兴奋的更新。要查看所有更新,请查看 变更日志。0.59 是一个巨大的版本——我们迫不及待地想让你尝试一下。

今年剩余时间我们还有更多改进即将推出。敬请期待!

Ryan 和整个 React Native 核心团队

2019 年 3 月 React Native 开源更新

·阅读时间:5 分钟
Christoph Nakazawa
Christoph Nakazawa
前 Facebook 工程师

我们在 2018 年第四季度宣布了我们的 React Native 开源路线图,当时我们决定更多地投资于 React Native 开源社区。

对于我们的第一个里程碑,我们专注于识别和改进社区中最明显的方面。我们的目标是减少未完成的拉取请求,减少项目的表面积,识别主要的用户问题,并为社区管理建立指南。

在过去的两个月里,我们取得的进展超出了预期。继续阅读以了解更多详情。

拉取请求

为了构建一个健康的社区,我们必须快速响应代码贡献。在过去的几年里,我们降低了审查社区贡献的优先级,并积累了 280 个拉取请求(2018 年 12 月)。在第一个里程碑中,我们将未完成的拉取请求数量减少到约 65 个。同时,每天打开的拉取请求平均数量从 3.5 增加到 7,这意味着我们在过去三个月处理了约 600 个拉取请求

我们合并了 近三分之二 并关闭了三分之一的拉取请求。如果它们已过时或质量低下,或者如果它们不必要地增加了项目的表面积,则在未合并的情况下关闭它们。大多数合并的拉取请求修复了 bug,改进了跨平台一致性,或引入了新功能。值得注意的贡献包括改进类型安全性和支持 AndroidX 的持续工作。

在 Facebook,我们从 master 运行 React Native,因此我们在更改进入 React Native 版本之前首先对其进行测试。在所有合并的拉取请求中,只有六个导致了问题:四个仅影响内部开发,两个在候选版本状态中被捕获。

社区贡献中比较明显的一个是 更新的“RedBox”屏幕。这是一个很好的例子,说明社区如何使开发者体验更加友好。

精简核心

React Native 目前拥有非常广阔的表面积,其中包含许多我们不经常在 Facebook 使用的未维护的抽象。我们正在努力减少表面积,以便使 React Native 更小,并允许社区更好地维护在 Facebook 中大部分未使用的抽象。

在第一个里程碑中,我们请求社区在精简核心项目上提供帮助。反响热烈,我们几乎无法跟上所有的进展。查看不到一个月内完成的所有工作

我们最兴奋的是维护者们已经开始修复长期存在的问题,添加测试,并支持长期以来请求的功能。这些模块获得的支持比它们在 React Native 中获得的支持更多,这表明这对社区来说是一个巨大的进步。此类项目的示例包括 WebView,自提取以来 收到了许多拉取请求,以及现在由 社区成员维护 的 CLI,并收到了急需的改进和修复。

主要的用户问题

12 月份,我们询问社区他们 不喜欢 React Native 的哪些方面。我们汇总了回复并 回复了每一个问题。幸运的是,我们的社区面临的许多问题也是 Facebook 遇到的问题。在我们的下一个里程碑中,我们计划解决一些主要问题。

投票数最高的难题之一是升级到 React Native 的新版本时的开发者体验。不幸的是,我们自己并没有遇到这个问题,因为我们从 master 运行 React Native。值得庆幸的是,社区成员已经开始着手解决这个问题。

0.59 版本

如果没有 React Native 社区的帮助,特别是 Mike GrabowskiLorenzo Sciandra,我们将无法发布版本。我们希望改进发布管理流程,并计划从现在开始更多地参与其中。

  • 我们将与社区成员合作,为每个主要版本创建一篇博文。
  • 当人们升级到新版本时,我们将直接在 CLI 中显示破坏性更改。
  • 我们将缩短发布所需的时间。我们正在探索增加自动化测试的方法,并创建改进的手动测试计划。

许多这些计划将被整合到即将发布的 React Native 0.59 版本 中。0.59 版本将包含 React Hooks、Android 的 64 位 JavaScriptCore 新版本,以及许多性能和功能改进。它目前已发布为候选版本,预计在未来两周内稳定。

后续步骤

在接下来的两个月里,我们将继续管理拉取请求 以保持进度,同时开始减少未解决的 GitHub 问题数量。我们将通过精简核心项目继续减少 React Native 的表面积。我们计划解决社区提出的 5 个主要问题。在完成社区指南后,我们将把注意力转向我们的网站和文档。

我们非常高兴能够在 3 月份邀请超过 10 位来自我们社区的贡献者到 Facebook 伦敦,帮助推动其中一些工作。我们很高兴您正在使用 React Native,并希望您能在 2019 年看到和感受到我们正在努力改进的地方。我们将在几个月后再次更新,并在此期间合并您的拉取请求!⚛️✌️