跳至主要内容

带有“release”标签的 19 篇文章

查看所有标签

宣布 React Native 0.65

·阅读时长 3 分钟
Luna Wei
Luna Wei
Meta 软件工程师

今天,我们发布了 React Native 0.65 版本,其中包含 Hermes 的新版本、可访问性改进、包升级等。

Hermes 0.8 中的新功能

Hermes 是 Facebook 为 React Native 优化的开源 JavaScript 虚拟机,通过降低内存使用率、减少下载大小和缩短应用变得可用或“交互时间”(TTI)来提高性能。

您可以在此处找到完整的Hermes 变更日志

按照此处的步骤选择加入您的应用到 Hermes(如果您尚未这样做),以利用这些新功能和优势!

可访问性修复和新增功能

去年Facebook 做出了全球无障碍意识日承诺,以改进 React Native 中的可访问性。0.65 分享了此承诺和其他可访问性成果!一些值得注意的更改包括

  • 允许为 iOS 指定高对比度亮色和暗色值。有关更多详细信息,请参阅文档
  • 在 Android 上添加了getRecommendedTimeoutMillis API。这会公开用户在 Android 的可访问性选项中设置的首选默认超时值,适用于可能需要额外时间来查看或访问控件等的使用者。
  • 常规修复,以确保 TalkBack/VoiceOver 正确宣布组件的 UI 状态,例如 disabledunselected

您可以在此处关注或参与我们的未解决的可访问性问题

值得注意的依赖项版本更新和注意事项

  • react-native-codegen 版本 0.0.7 现在需要作为 package.json 中的 devDependency
  • JCenter 现已停止使用,并且现在处于只读状态。我们已删除 JCenter 作为 Maven 存储库,并更新了依赖项以使用 MavenCentral 和 Jitpack。
  • 将 OkHttp 从 v3 升级到 v4.9.1。有关更改的更多详细信息,请参阅升级到 OkHttp 4
  • 升级到 Flipper 0.93 以支持 Xcode 12.5。请参阅此处的 Flipper 变更日志
  • Android Gradle 插件 7 支持
  • Apple Silicon 需要链接器解决方法。请参阅@mikehardy 关于此的说明

感谢您!

此版本包含来自61 位贡献者1100 多次提交。感谢所有为该版本做出贡献和提供支持的人!您可以在此处找到完整的变更日志

宣布 React Native 0.64,并在 iOS 上使用 Hermes

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

今天,我们发布了 React Native 0.64,它支持在 iOS 上使用 Hermes。

iOS 上的 Hermes 选择加入

Hermes 是一个为运行 React Native 优化的开源 JavaScript 引擎。它通过降低内存使用率、减少下载大小和缩短应用变得可用或“交互时间”(TTI)来提高性能。

在此版本中,我们很高兴地宣布您现在也可以使用 Hermes 在 iOS 上构建。要在 iOS 上启用 Hermes,请在您的 Podfile 中将 hermes_enabled 设置为 true,然后运行 pod install

use_react_native!(
:path => config[:reactNativePath],
# to enable hermes on iOS, change `false` to `true` and then install pods
:hermes_enabled => true
)

请注意,iOS 上的 Hermes 支持仍处于早期阶段。我们将其作为选择加入功能,因为我们正在运行进一步的基准测试。我们鼓励您在自己的应用程序上尝试它,并告诉我们它的工作情况!

内联 Require 默认启用

内联 Require 是一个 Metro 配置选项,它通过延迟执行 JavaScript 模块(直到使用它们,而不是在启动时)来缩短启动时间。

此功能已存在并被推荐使用数年,作为一种选择加入的配置选项,在我们文档的性能部分中列出。我们现在为新应用程序默认启用此选项,以帮助用户无需额外配置即可拥有快速的 React Native 应用程序。

内联 Requires 是一种 Babel 转换,它获取模块导入并将其转换为内联。例如,内联 Requires 将此模块导入调用从文件顶部转换为其使用位置。

之前

import {MyFunction} from 'my-module';

const MyComponent = props => {
const result = MyFunction();

return <Text>{result}</Text>;
};

之后

const MyComponent = props => {
const result = require('my-module').MyFunction();

return <Text>{result}</Text>;
};

有关内联 Requires 的更多信息,请参阅性能文档

使用 Chrome 查看 Hermes 追踪

在过去的一年里,Facebook 赞助了Major League Hacking 奖学金项目,支持对 React Native 的贡献。Jessie NguyenSaphal Patro 添加了使用 Chrome DevTools 上的“性能”选项卡来可视化应用程序在使用 Hermes 时执行情况的功能。

有关更多信息,请查看新的文档页面

支持代理的 Hermes

我们在 Hermes 中添加了代理支持,从而能够与 react-native-firebase 和 mobx 等流行的社区项目兼容。如果您一直在使用这些软件包,您现在可以将项目迁移到 Hermes。

我们计划在即将发布的版本中将 Hermes 设为 Android 的默认 JavaScript 引擎,因此我们正在努力解决人们在使用 Hermes 时遇到的剩余问题。如果仍有阻止您的应用程序采用 Hermes 的问题,请在Hermes GitHub 存储库上提交问题。

React 17

React 17 不包含面向开发人员的新功能或重大的重大更改。对于 React Native 应用程序,主要更改是新的 JSX 转换,使文件不再需要导入 React 即可使用 JSX。

有关 React 17 的更多信息,请访问React 博客

主要依赖项版本更改

  • 放弃了 Android API 级别 16-20。Facebook 应用始终会放弃对使用率足够低的 Android 版本的支持。由于 Facebook 应用不再支持这些版本,并且是 React Native 的主要测试平台,因此 React Native 也将放弃支持。
  • 需要 Xcode 12 和 CocoaPods 1.10
  • 最低 Node 支持从 10 提升到 Node 12
  • Flipper 升级到 0.75.1

致谢

感谢数百位贡献者帮助实现了 0.64!0.64 版本变更日志包含此版本中包含的所有更改。

宣布 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 中完全重新设计的 redbox、yellowbox 和日志记录体验。在 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 操作:直接从工具栏重新加载应用并触发 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

作为我们 精简核心工作 的一部分,以及为了使 Apple TV 与 React Native Windows 和 React Native macOS 等其他平台保持一致,我们已开始从核心代码中删除 Apple TV 特定的代码。

将来,React Native 对 Apple TV 的支持将由 react-native-community/react-native-tvos 以及相应的 react-native-tvos NPM 包维护。这是主存储库的完整分支,仅包含支持 Apple TV 所需的更改。

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

更多升级支持

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

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

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

其他改进

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

重大更改

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

弃用

  • AccessibilityInfo.fetch 之前已弃用,但在此版本中,我们 添加了一个警告
  • 现在需要 设置 useNativeDriver 以支持将来切换默认值。
  • Animated 组件的 ref 现在是内部组件,并且 弃用getNode

致谢

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

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

宣布 React Native 0.61,并推出快速刷新

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

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

快速刷新

当我们询问 React Native 社区关于 常见痛点 时,最主要的答案之一是“热重载”功能已损坏。它对函数组件不可靠,经常无法更新屏幕,并且对拼写错误和错误没有弹性。我们听说大多数人将其关闭,因为它太不可靠了。

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

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

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

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

以下是一些快速刷新提示

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

请在 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 版本的变更日志

宣布 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-oakes讨论和提案

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

默认使用 CocoaPods

CocoaPods 现在是 React Native 的 iOS 项目的一部分。如果您还没有这样做,请确保从现在开始使用xcworkspace文件打开 iOS 平台代码(提示:尝试从根项目目录使用xed ios)。此外,内部包的podspec已更改以使其与 Xcode 项目兼容,这将有助于故障排除和调试。预计您需要对您的Podfile进行一些简单的更改,作为升级到 0.60 版本的一部分,以带来这种令人兴奋的支持。请注意,我们了解到与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 用户使用 Brownfield 应用或复杂的自定义项来查看版本之间的变化。查看更新的升级文档并立即尝试使用它进行升级!

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

致库维护者的一则说明

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

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

致谢

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

发布 React Native 0.59

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

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

🎣 Hook 来了

React Hook 是此版本的一部分,它允许您跨组件重用有状态逻辑。Hook 非常热门,但如果您还没有听说过,请查看以下一些很棒的资源

请务必在您的应用中尝试一下。我们希望您能像我们一样对重用感到兴奋。

📱 更新的 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 核心团队

发布 0.56

·阅读时间:5 分钟
Lorenzo Sciandra
核心维护者 & Drivetribe 的 React Native 开发者

期待已久的 React Native 0.56 版本现已推出 🎉。这篇博文重点介绍了此新版本中引入的一些 更改。我们还希望借此机会解释自 3 月以来我们一直在忙些什么。

破坏性更改的困境,或者,“何时发布?”

贡献者指南 解释了所有对 React Native 的更改所经历的集成过程。该项目由 许多不同的工具 组成,需要协调和持续的支持才能使一切正常运行。再加上积极的开源社区回馈项目,您就会对整个项目的规模有一个概念。

随着 React Native 令人印象深刻的采用,必须非常谨慎地进行破坏性更改,并且该过程并不像我们希望的那样顺利。决定跳过 4 月和 5 月的版本,以允许核心团队集成和测试一组新的破坏性更改。专门的社区沟通 渠道在此过程中一直被使用,以确保 2018 年 6 月 (0.56.0) 版本尽可能轻松地被那些耐心等待稳定版本的人采用。

0.56.0 是完美的吗?不,就像那里存在的每一款软件一样:但我们到达了一个点,在“等待更多稳定性”与“测试导致成功的结果,因此我们可以继续推进”之间进行了权衡,我们认为我们已准备好发布它。此外,我们知道 一些 问题 没有 在最终的 0.56.0 版本中解决。大多数开发人员在升级到 0.56.0 时应该不会遇到任何问题。对于那些被上述问题阻碍的开发人员,我们希望在我们的讨论中看到您,并且我们期待与您一起解决这些问题。

您可能会将 0.56.0 视为通往更稳定框架的基础构建块:可能需要一两周的广泛采用才能消除所有边缘情况,但这将导致 2018 年 7 月 (0.57.0) 版本变得更好。

我们想借此机会感谢 所有 67 位贡献者,他们在总共 818 次提交 (!) 中付出了努力,这将有助于使您的应用变得更好 👏。

现在,让我们言归正传……

重大变化

Babel 7

您可能知道,允许我们使用 JavaScript 最新和最棒功能的转译器工具 Babel 即将发布 v7 版本。由于此新版本带来了一些重要的更改,因此我们认为现在是升级的好时机,允许 Metro 利用其改进

如果您在升级过程中遇到麻烦,请参阅 与之相关的文档部分

现代化 Android 支持

在 Android 上,许多周围的工具都发生了变化。我们已更新到 Gradle 3.5Android SDK 26Fresco 到 1.9.0 和 OkHttp 到 3.10.0,甚至 NDK API 目标到 API 16。这些更改应该不会有任何问题,并且可以加快构建速度。更重要的是,它将帮助开发人员遵守 下个月生效的新 Play 商店要求

关于这一点,我们想特别感谢 Dulmandakh 为使其成为可能而提交的众多 PR 👏。

在这个方向上,还需要采取一些额外的步骤,您可以关注未来的计划和讨论,了解如何在 专用问题 (以及 JSC 的一个辅助问题)中更新 Android 支持。

新的 Node、Xcode、React 和 Flow——我的天哪!

Node 8 现在是 React Native 的标准版本。实际上,它已经过测试,但随着 Node 6 进入维护模式,我们已全面转向 Node 8。React 也更新到了 16.4 版本,其中包含大量修复。

我们停止支持 iOS 8,并将 iOS 9 设为可支持的最旧 iOS 版本。我们预计这不会造成问题,因为任何可以运行 iOS 8 的设备都可以升级到 iOS 9。此更改使我们能够移除用于解决运行 iOS 8 的旧设备问题的、很少使用的代码。

持续集成工具链已更新 为使用 Xcode 9.4,确保所有 iOS 测试都在 Apple 提供的最新开发工具上运行。

我们已升级到 Flow 0.75 以使用新的错误格式 许多开发者都喜欢的格式。我们还为更多组件创建了类型。如果您尚未在项目中强制执行静态类型检查,请考虑使用 Flow 在编码时而不是在运行时识别问题。

以及其他许多事情...

例如,YellowBox 已 被替换为一个新的实现,使调试工作变得更好。

有关完整的发布说明,请参阅完整的 变更日志。并记住关注 升级指南,以避免升级到此新版本时出现问题。


最后说明:从本周开始,React Native 核心团队将恢复每月举行会议。我们会确保让大家了解会议内容,并在未来的会议中收集大家的反馈意见。

祝大家编码愉快!

LorenzoRyan 和整个 React Native 核心团队

附注:与往常一样,我们想提醒大家,React Native 仍处于 0.x 版本,因为仍有许多更改正在进行中——因此,在升级时请记住,可能会出现某些崩溃或错误。在遇到问题或提交 PR 时,请互相帮助——并记住遵守 行为准则:屏幕的另一端总是有一个人。