跳到主要内容

宣布发布 React Native 0.63 及 LogBox

· 阅读需 7 分钟
Mike Grabowski
Mike Grabowski
CTO and Co-Founder @ Callstack

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

LogBox​

我们经常收到社区反馈,指出在 React Native 中错误和警告难以调试。为了解决这些问题,我们全面审视了 React Native 中的错误、警告和日志系统,并从零开始重新设计。

LogBox 截图

LogBox 是 React Native 中完全重新设计的红框(redbox)、黄框(yellowbox)以及日志体验。在 0.62 版本中,我们引入了 LogBox 作为可选功能。在本次发布中,我们将 LogBox 作为 React Native 的默认体验推出。

LogBox 针对错误和警告过于冗长、格式混乱或无法行动的问题,聚焦于三个主要目标:

  • 简洁:日志应提供调试问题所需的最少信息。
  • 格式化:日志应格式化以便快速找到所需信息。
  • 可操作:日志应是可操作的,以便你能修复问题并继续开发。

为实现这些目标,LogBox 包含:

  • 日志通知:警告通知经过重新设计,并增加了对错误的支持,所有 console.warn 和 console.log 消息都会作为通知显示,而不会遮盖你的应用。
  • 代码片段:每个错误和警告都包含一个代码片段,显示日志的源代码,直接嵌入应用中,帮助快速定位问题源头。
  • 组件堆栈:所有组件堆栈信息从错误消息中剥离,放入单独部分,只显示顶部三个调用帧,这为你提供一个统一、一致的堆栈帧信息区,避免日志信息混乱。
  • 堆栈帧折叠:默认情况下,我们折叠与应用代码无关的调用堆栈帧,让你更快看到应用内部问题,而不是筛选 React Native 的内部代码。
  • 语法错误格式化:改进了语法错误的格式化,新增带语法高亮的代码片段,便于你看到错误源代码、修复问题,继续开发,避免 React Native 阻碍工作。

我们将这些功能整合到了统一且美观的视觉设计中,错误和警告体验保持一致,且支持翻页浏览所有日志,提升使用愉悦感。

本次变更还将逐步废弃 YellowBox,替换为 LogBox API:

  • LogBox.ignoreLogs():替代了 YellowBox.ignoreLogs([]),用于静默匹配特定字符串或正则表达式的日志。
  • LogBox.ignoreAllLogs():替代了 console.disableYellowBox,用于关闭错误和警告通知。注意:此方法仅关闭通知,未捕获错误仍会弹出全屏 LogBox。

在 0.63 中,使用这些已废弃模块或方法时会有警告。请在 0.64 版本移除前尽早更新代码。

有关 LogBox 和调试 React Native 的更多信息,请参阅文档 这里。

Pressable​

React Native 的设计旨在满足应用程序对平台体验的预期,其中之一是避免“痕迹”——那些能够暴露应用是用 React Native 构建的小细节。其中一大“痕迹”来源是 Touchable 组件:Button、TouchableWithoutFeedback、TouchableHighlight、TouchableOpacity、TouchableNativeFeedback 和 TouchableBounce。这些组件通过允许你为用户交互提供视觉反馈,使应用具备交互性。然而,由于它们内置了与平台交互不匹配的样式和效果,用户能够识别出应用是用 React Native 编写的。

此外,随着 React Native 发展,且对高质量应用的要求提高,这些组件却未能同步演进。React Native 目前支持 Web、桌面和 TV 等多平台,但对于新输入方式的支持不足。React Native 需要在所有平台上支持高质量的交互体验。

为了解决这些问题,我们推出了新的核心组件 Pressable。该组件可检测多种交互类型。其 API 设计允许直接访问当前交互状态,无需父组件手动维护状态。它还设计成可以让各平台扩展其能力,支持悬停(hover)、失焦(blur)、聚焦(focus)等。我们期望大多数开发者会基于 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,可像使用普通颜色一样使用系统颜色。

例如,在 iOS 上,系统提供了名为 labelColor 的颜色,在 React Native 中可用 PlatformColor 使用:

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

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

把文本颜色设置为 iOS 定义的 labelColor。

相反,Android 提供了如 colorButtonNormal 这样的颜色,你可以这样用:

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。Node 8 的 LTS 支持已于 2019 年 12 月结束。当前 LTS 是 Node 10,且我们以此作为目标版本。如果你仍在用 Node 8 开发 React Native 应用,建议升级以获得最新安全补丁和更新。

其他显著改进​

  • 支持在 <Text /> 中渲染 <View /> 而不需要明确设定尺寸:你现在可以在任意 <Text /> 组件内部渲染 <View />,无需显式设置其宽高。此前版本会导致红屏错误。
  • iOS LaunchScreen 从 xib 改为 storyboard:自 2020 年 4 月 30 日起,所有提交至 App Store 的应用必须使用 Xcode storyboard 来提供启动画面,且所有 iPhone 应用都必须支持所有 iPhone 屏幕尺寸。本次提交调整了默认 React Native 模板以符合此要求。

致谢​

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

备注

特别感谢 Rick Hanlon 撰写了有关 LogBox 的部分,感谢 Eli White 撰写了本文中的 Pressable 相关内容。

查看全部更新,请查看 0.63 版本更新日志。

宣布发布支持 Flipper 的 React Native 0.62 版本

· 阅读需 5 分钟
Rick Hanlon
Facebook React Native 核心团队成员

今天我们发布了 React Native 版本 0.62,默认支持 Flipper。

此次发布正值全球疫情期间。今天发布此版本是为了尊重数百位贡献者的努力,他们使得此次发布成为可能,同时避免版本跟主分支落后太多。请大家理解贡献者在处理问题方面能力受限,如有必要,准备延迟升级。

默认支持 Flipper​

Flipper 是一个用于调试移动端应用的开发者工具。它在 Android 和 iOS 社区中非常流行,在本次发布中,我们为新建和现有的 React Native 应用默认开启了对 Flipper 的支持。

React Native 的 Flipper 截图

Flipper 开箱即用的功能包括:

  • Metro 操作:直接从工具栏重新加载应用并触发开发者菜单。
  • 崩溃报告器:查看来自 Android 和 iOS 设备的崩溃报告。
  • React DevTools:使用最新版 React DevTools,与其他工具并列使用。
  • 网络检查器:查看设备应用发出的所有网络请求。
  • Metro 和设备日志:查看、搜索和筛选 Metro 和设备的所有日志。
  • 原生布局检查器:查看和编辑 React Native 渲染器输出的原生布局。
  • 数据库和偏好设置检查器:查看和编辑设备数据库与偏好设置。

此外,Flipper 作为一个可扩展的平台,提供了一个市场,从 NPM 拉取插件,你可以发布或安装针对自己工作流定制的插件。可用插件请见 这里。

更多信息请查看 Flipper 文档。

新增暗黑模式功能​

我们新增了一个 Appearance 模块,用于访问用户的外观偏好设置,比如他们偏好的配色方案(浅色或暗色)。

const colorScheme = Appearance.getColorScheme();
if (colorScheme === 'dark') {
// 使用暗色配色方案
}

我们还新增了一个钩子,用于订阅用户偏好的状态更新:

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

const MyComponent = () => {
const colorScheme = useColorScheme();
return <Text>useColorScheme(): {colorScheme}</Text>;
};

更多信息请查看文档的 Appearance 和 useColorScheme。

Apple TV 迁移至 react-native-tvos​

作为我们 Lean Core 计划 的一部分,同时为了使 Apple TV 与 React Native Windows、React Native macOS 等其他平台保持一致,我们开始从核心库中移除 Apple TV 相关代码。

今后,React Native 对 Apple TV 的支持将维护在 react-native-community/react-native-tvos 项目中,及对应的 react-native-tvos NPM 包。该仓库是 React Native 主仓库的完整分叉,仅包含支持 Apple TV 所需的变更。

react-native-tvos 的发布将基于公开发布的 React Native 版本。针对此次 0.62 版本,请升级 Apple TV 项目以使用 react-native-tvos 0.62。

更多升级支持​

0.61 版本发布时,社区推出了新的 升级辅助工具,帮助开发者升级 React Native 新版本。升级助手会显示你当前版本到目标版本的差异,便于你了解并应用所需的改动。

即便有此工具,升级时仍会遇到问题。今天我们推出了更多专门的升级支持——Upgrade-Support。Upgrade Support 是专门针对升级项目问题的 GitHub 问题跟踪区,用户可以在这里提交升级相关问题并获得社区帮助。

我们一直致力于改善升级体验,希望这些工具能在我们尚未覆盖的边缘案例中给予用户支持。

其他改进​

  • LogBox:我们新增了可选的 LogBox 错误和警告体验;要启用它,请在 index.js 文件中加入 require('react-native').unstable_enableLogBox()。
  • React DevTools v4:升级至 最新的 React DevTools,带来显著的性能提升、更好的导航体验及对 React Hooks 的完整支持。
  • 无障碍功能改进:我们改进了无障碍功能,包括新增 accessibilityValue、为 Touchables 添加缺失的属性、onSlidingComplete 无障碍事件,并将 Switch 组件的默认角色从 "button" 改为 "switch"。

破坏性变更​

  • 移除 PropTypes:为了减少 React Native 核心库对应用体积的影响,并鼓励使用编译时检查的静态类型系统,我们移除了核心组件中的 propTypes。
  • 移除 accessibilityStates:我们移除了已废弃的 accessibilityStates 属性,改用新的 accessibilityState 属性,它为组件向辅助功能服务提供状态信息提供了更丰富的语义描述。
  • TextInput 改动:移除了不常用、非 W3C 兼容且难以在 Fabric 中实现的 onTextInput 事件支持。同时也删除了未文档化的 inputView 属性和 selectionState。

弃用通知​

  • AccessibilityInfo.fetch 已被弃用,本次发布新增了警告提示。
  • 设置 useNativeDriver 现在是必需的,以支持未来切换默认值的计划。
  • Animated 组件的 ref 现在指向内部组件,并且弃用了 getNode 方法。

致谢​

感谢数百位贡献者的努力,让 0.62 版本成为可能!

欲了解全部更新内容,请查看 0.62 更新日志。

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

· 阅读需 2 分钟
Lucas Bento
React Native 社区

在 React Native 社区 6 位贡献者提交了 20 多个拉取请求后,我们很高兴推出 react-native doctor,这是一个新命令,旨在帮助你开始使用、排查问题并自动修复开发环境中的错误。doctor 命令的设计灵感主要来源于 Expo 和 Homebrew 自带的 doctor 命令,同时 UI 上借鉴了 Jest 的风格。

宣布发布带有快速刷新功能的 React Native 0.61

· 阅读需 4 分钟
Dan Abramov
Facebook React 核心成员

我们很高兴地宣布发布 React Native 0.61,这个版本包含了一个我们称之为快速刷新(Fast Refresh)的全新重载体验。

快速刷新​

当我们询问 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 中修复,方便需要用动态框架构建的 iOS 项目集成 React Native。
  • 新增 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 引擎。它是一款小巧轻量、为在 Android 上运行 React Native 优化的 JavaScript 引擎。快来看看吧!

Hermes 通过降低内存占用、减少下载大小,以及缩短应用可用时间或“交互时间”(TTI),提升了 React Native 的性能。

“在分析性能数据时,我们注意到 JavaScript 引擎本身是启动性能和下载大小的重要因素。基于这些数据,我们知道必须优化 JavaScript 性能,以适应手机这种更受限的环境,相较于台式机或笔记本电脑。在探索过其他选项后,我们构建了一个我们称之为 Hermes 的新 JavaScript 引擎。它设计用来提升应用性能,重点关注我们的 React Native 应用,即使是在内存有限、存储速度较慢且计算能力受限的主流设备上。” —Hermes:一款为移动应用优化的开源 JavaScript 引擎,起步于 React Native

想要立即开始使用?务必查看文档中的新手指南,了解如何在现有 React Native 应用中启用 Hermes!

Hermes 和 React Native 标志合并成带翼的烈焰,在孤独发光的安卓手机上方,闪电风暴中腾飞的插画。 插画作者:Rachel Nabors

宣布 React Native 0.60 发布

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

经过数百名贡献者数月的辛勤工作,React Native 核心团队自豪地宣布发布 0.60 版本。本次发布涵盖了 Android 和 iOS 平台的重要迁移,同时也修复了许多问题。本文将介绍本次发布的亮点。当然,请务必查阅更新日志以获取更详细的信息。最后,感谢所有贡献者帮助我们达成这一里程碑!

关注无障碍功能​

无障碍 API 进行了许多改进,比如 announceForAccessibility,以及对 roles、action support、flags 等的提升。无障碍是一门复杂的学问,但我们希望这些改进能让无障碍支持变得更容易。详情请务必查看 React Native 开源更新 2019 年 6 月。

崭新的起点​

React Native 的启动界面进行了更新!感谢众多贡献者帮助设计了新的界面。这个新的 “Hello World” 将以更友好、更吸引人的方式迎接用户进入生态系统。

新的初始化界面帮助开发者从一开始就利用资源和良好的示例快速入门

支持 AndroidX​

AndroidX 是 Android 生态系统的一大进步,旧的支持库组件正在被弃用。在 0.60 版本,React Native 已经迁移至 AndroidX。这是一个破坏性变更,您的原生代码和依赖也需要进行迁移。

由于此变更,React Native 应用必须开始使用 AndroidX。两者无法在同一应用中并行使用,因此应用的所有代码和依赖都必须统一使用其一。

来自 matt-oakes 在 discussions-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! 存在兼容性问题,相关 issue 正在跟踪并提供变通方案和未来补丁。

精简核心模块移除​

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 团队引入了对原生模块链接的重大改进,称为 自动链接(autolinking)!多数场景下,您不再需要使用 react-native link。同时,整体链接流程也得到了重新设计。请务必照文档所述先执行对现有依赖的 react-native unlink。

升级助手​

@lucasbento、@pvinis、@kelset 和 @watadarkstar 开发了一个极好的工具——Upgrade Helper,简化升级过程。它帮助 React Native 用户(尤其是已有底层项目或复杂定制的用户)清晰查看版本间的变更。请查看 更新的升级文档,并尝试使用该工具规划您的升级路径!

升级助手干净利落地展示了迁移到不同 React Native 版本所需的变更

致库维护者的一些提醒​

AndroidX 相关变更几乎肯定需要更新您的库,请尽快支持。如果您还无法升级,建议使用 jetifier 检查您的库,确保用户能在构建时对您的库进行修补。

请查看 自动链接文档 以更新配置和 README。根据您的库之前的集成方式,您可能还需做额外调整。CLI 的依赖 指南提供了关于如何定义依赖接口的信息。

感谢​

以上是我们记录到的主要亮点,当然还有许多值得期待的更新。查看全部更新请访问 更新日志。一如既往,请关注更多新闻。祝您愉快地使用 0.60 版本!

React Native 2019年6月开源更新

· 阅读需 9 分钟
Christoph Nakazawa
Christoph Nakazawa
Former Engineer @ Facebook

代码与社区健康状况​

在过去六个月中,超过550名贡献者向 React Native 提交了总计2800次提交。社区中有400名贡献者创建了超过 1,150个拉取请求(Pull Requests),其中有 820个拉取请求被合并。

在过去六个月中,平均每天的拉取请求数量已从3个增加到约6个,尽管我们通过 Lean Core 计划将网站、CLI 和许多模块从 React Native 中拆分出去。现在平均未处理拉取请求数量低于25个,我们通常在数小时或几天内回复并提出建议和审查意见。

有意义的社区贡献​

我们想特别强调一些我们认为非常棒的近期贡献:

Lean Core 计划​

Lean Core 的主要动机是将模块从 React Native 中拆分至独立仓库,以便获得更好的维护。在短短六个月内,WebView、NetInfo、AsyncStorage、网站及CLI 这几个仓库合计收到了超过800个拉取请求。除了更好的维护外,这些项目还能比 React Native 主体更频繁地独立发布。

我们也趁机从 React Native 中移除了过时的 polyfill 和遗留组件。过去,为支持老版本 JavaScriptCore (JSC) 中的语言特性如 Map 和 Set,必须使用 polyfill。现在 React Native 捆绑的是更新版本,因此这些 polyfill 被删除。

这项工作仍在进行中,原生与 JavaScript 两边还有许多内容需要拆分或删除,但已有迹象表明我们成功扭转了代码体积持续增长的趋势:比如查看 JavaScript bundle 大小,一年前的 0.54 版本为530KB,6个月后 0.57 版本增长到了607KB(+77KB),而现在在 master 分支上我们看到了减小了28KB至579KB,整体差异超过100KB!

随着 Lean Core 努力的第一轮结束,我们将更加审慎地对待向 React Native 添加的新 API,并将持续评估缩小和加速 React Native 的方法,同时寻找方式赋能社区接管各个组件的维护。

用户反馈​

六个月前,我们曾向社区提问 “你不喜欢 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 用户分享了各种可行的解决方案,或许能帮到你。

鉴于过去半年变化巨大,我们再次向你提问。如果您正在使用最新版本 React Native 并愿意反馈意见,请在我们新一期的 “你不喜欢 React Native 的哪些方面?” 话题下留言。

持续集成​

Facebook 首先将所有拉取请求及内部更改合并至其私有仓库,然后将所有提交同步回 GitHub。Facebook 的基础设施与常见持续集成服务不同,且非所有开源测试都在 Facebook 内部完成。这导致同步到 GitHub 的提交经常会出现测试失败,修复耗费大量时间。

React Native 团队的 Héctor Ramos 过去两个月一直在改进 Facebook 和 GitHub 上的持续集成系统。现在大部分开源测试都在提交变更至 React Native Facebook 版本前运行,这将保持 GitHub 同步提交时的持续集成稳定。

接下来​

务必关注我们关于 React Native 未来发展的演讲!未来几个月,Facebook React Native 团队成员将出席 Chain React 和 React Native EU 会议。同时,敬请期待即将发布的 0.60 版本。令人振奋 ✨

React Native 在 F8 大会和开源播客中的表现

· 阅读需 3 分钟
Christoph Nakazawa
Christoph Nakazawa
Former Engineer @ Facebook

本周,Eli White 在 F8 2019 大会上做了一个关于 React Native 在 Facebook 安卓和 iOS 应用中的应用的演讲。我们很高兴分享过去两年的工作成果以及我们接下来的计划。

请在Facebook 开发者网站观看视频:

F8 演讲关于 React Native

演讲亮点:​

  • 我们在 2017 和 2018 年主要专注于 React Native 最大的产品——Facebook 的 Marketplace。我们与 Marketplace 团队合作,提升质量并增加产品的吸引力。至此,Marketplace 已成为 Facebook 应用中安卓和 iOS 平台上质量最高的产品之一。
  • Marketplace 的性能也是一大挑战,特别是在中端安卓设备上。过去一年我们将启动时间缩短了超过 50%,未来还会有更多改进!最大的性能提升正在被内置到 React Native 中,并将在今年晚些时候带给社区。
  • 我们有信心使用 React Native 构建出 Facebook 需要的高质量且高性能的应用。这份信心让我们敢于做更大胆的尝试,比如重新设计 React Native 核心。
  • 微软支持并使用 React Native for Windows,让用户能够利用他们的技术专长和代码库渲染到微软的通用 Windows 平台。请关注下周的 Microsoft Build,届时可听他们分享更多。

React Radio 播客谈开源​

Eli 的演讲以介绍我们近期的开源工作收尾。我们在三月时进行了进展更新,最近,Nader Dabit 和 Gant Laborde 邀请 Christoph 参加他们的播客 React Native Radio,聊了聊 React Native 在开源方面的情况。

播客亮点:​

  • 我们谈到了 Facebook 的 React Native 团队如何看待开源,以及我们如何建设一个可持续且能应对 React Native 这样庞大项目规模的社区。
  • 作为 Lean Core 计划的一部分,我们正按计划移除多个模块。许多模块如 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 可以识别可延迟加载的组件。组件层级复杂且多样的应用将会体验到最大的改进。

0.59 模板中的 metro.config.js 文件示例,展示了如何启用 inlineRequires

我们需要社区反馈效果如何,再决定是否默认启用。当你升级到 0.59 后,会看到一个新的 metro.config.js 文件;将选项切换为 true 并给我们反馈吧!更多关于内联 require,请查看性能文档并对你的应用进行基准测试。

🚅 精简核心正在进行中​

React Native 是一个庞大且复杂的项目,代码库也很复杂。这使得代码不易接近贡献者,测试困难,且作为开发依赖显得臃肿。精简核心 是我们为解决这些问题,将代码迁移到独立库以便更好管理的努力。过去几个版本已经开始了这一步伐,让我们认真起来。

你可能会注意到,更多组件已正式弃用。这是好消息,这些功能现在都有了活跃维护的负责人。请注意警告信息并迁移到新的库中,因为这些组件未来版本会被移除。下面表格列出了组件、弃用状态及迁移去处。

未来几个月,还会有更多组件沿着这条路走向更精简的核心。我们正在寻求帮助——欢迎前往精简核心专题参与。

👩🏽‍💻 CLI 改进​

React Native 的命令行工具是开发者进入生态的入口,但长期存在问题且无官方支持。CLI 工具已迁移到新仓库,一支专注的维护团队已做出令人兴奋的改进。

日志格式更好,命令几乎瞬间执行——你会立即感受到差异:

0.58 版本中 CLI 启动较慢 0.59 版本中 CLI 几乎瞬间响应

🚀 升级到 0.59​

我们听到了大家对 React Native 升级流程的反馈,正在采取措施在未来版本中提升体验。升级到 0.59 推荐使用 rn-diff-purge 来确定你当前版本与 0.59 之间的差异,然后手动应用这些更改。升级完成后,便可使用改进后的 react-native upgrade 命令(基于 rn-diff-purge)来升级到 0.60 及后续版本。

🔨 重大变更​

0.59 对 Android 支持进行了整理,遵循 Google 最新推荐,可能导致已有应用出现问题。问题表现为运行时崩溃,并提示“你需要为该 Activity 使用 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 核心团队

React Native 开源更新 — 2019年3月

· 阅读需 6 分钟
Christoph Nakazawa
Christoph Nakazawa
Former Engineer @ Facebook

我们于2018年第四季度公布了我们的 React Native 开源路线图,决定加大对 React Native 开源社区的投入。

在第一个里程碑中,我们重点关注识别和改进社区中最显眼的方面。我们的目标是减少未合并的拉取请求,缩减项目的表面面积,确定主要用户问题,并建立社区管理的指导方针。

在过去两个月里,我们取得了超过预期的进展。详情请继续阅读:

拉取请求​

为了构建一个健康的社区,我们必须快速响应代码贡献。过去几年里,我们不太重视社区贡献的审查,积压了280个拉取请求(2018年12月)。在第一个里程碑里,我们将未处理的拉取请求数量减少到约65个。同时,每天新开的拉取请求平均数量从3.5个增长到了7个,这意味着我们在过去三个月处理了大约 600个拉取请求。

我们合并了 近三分之二 的拉取请求,关闭了三分之一。关闭的拉取请求没有被合并,原因是它们已经过时或者质量较低,或者不必要地增加了项目表面面积。大部分合并的拉取请求修复了错误,提升了跨平台一致性,或者引入了新功能。其中值得一提的贡献包括提升类型安全和支持 AndroidX 的持续工作。

在 Facebook,我们直接运行 React Native 的主分支,因此所有更改都会先经过测试,确保发布版本的质量。在所有合并的拉取请求中,只有6个引发了问题:4个只影响了内部开发,2个是在发布候选版本阶段被发现。

社区中较为显眼的贡献之一是 更新后的“RedBox”屏幕。这是社区如何改善开发者体验的一个良好范例。

精简核心(Lean Core)​

当前 React Native 的表面面积非常广泛,包含许多已经不维护的抽象层,这些在 Facebook 内部使用较少。我们正在努力缩减表面面积,以使 React Native 更加精简,并让社区更好地维护那些 Facebook 内部较少使用的抽象层。

在第一个里程碑中, 我们向社区寻求 Lean Core 项目的帮助。社区反响热烈,我们几乎应接不暇。 看看不到一个月内完成的所有工作!

最让我们兴奋的是,维护者们积极投入,修复了长期存在的问题,增加了测试,并支持了很多长期以来请求的功能。这些模块获得的支持超过了 React Native 以往任何时候,说明这对社区来说是一个巨大进步。示例项目包括自抽取以来收到大量拉取请求的 WebView,以及由社区成员维护的 CLI,如今已收获了急需的改进和修复,详情见 React Native CLI 新家园。

主要用户问题​

2018年12月,我们向社区征询了他们关于 React Native 不满意的地方。我们汇总了反馈,并对每个问题进行了 回复。幸运的是,我们社区面临的许多问题,Facebook 内部同样存在。下一里程碑中,我们计划解决一些主要问题。

其中投票最高的问题之一是升级到 React Native 新版本时的开发体验。遗憾的是,我们在 Facebook 内部并不经历这一问题,因为我们直接使用主分支。值得庆幸的是,社区成员已开始着手改进这一问题:

0.59 版本发布​

没有 React Native 社区,特别是 Mike Grabowski 和 Lorenzo Sciandra 的帮助,我们无法顺利发布版本。我们希望改进发布管理流程,并计划从现在起更加积极参与:

  • 将与社区成员协作,为每个主要版本撰写博客文章。
  • 在升级新版本时,在 CLI 中直接显示重大破坏性变更。
  • 缩短发布所需时间。我们正在探索增加自动化测试并创建更完善的手动测试计划的方案。

许多计划将体现在即将发布的 React Native 0.59 版本 中。0.59 将带来 React Hooks、针对 Android 的新 64 位 JavaScriptCore 版本以及许多性能和功能提升。目前它已经作为候选版本发布,预计两周内稳定。

后续计划​

接下来的两个月里,我们将继续管理拉取请求, 保持进度,同时开始减少未处理的 GitHub 问题数。我们将通过 Lean Core 项目持续缩减 React Native 表面面积。计划解决社区排名前5的主要问题。在完善社区指南后,我们将关注网站和文档。

我们非常高兴能在3月于 Facebook 伦敦接待来自社区的十多位贡献者,共同推进多项工作。感谢你们使用 React Native,希望你们能感受到我们在2019年努力带来的改进。数月后我们将带来新更新,届时也会持续合并你们的拉取请求! ⚛️✌️