跳到主要内容

React Native 0.81 - 支持 Android 16、更快的 iOS 构建等

·10 分钟阅读
Moti Zilberman
Moti Zilberman
Meta 软件工程师
Vitali Zaidman
Vitali Zaidman
Meta 软件工程师
Gabriel Donadel Dall'Agnol
Gabriel Donadel Dall'Agnol
Expo 软件工程师
Christian Falch
Christian Falch
Expo 软件工程师

今天我们很高兴发布 React Native 0.81!

此版本支持 Android 16(API level 36),并包含各种其他稳定性改进和错误修复,以及对使用预编译加速 iOS 构建的实验性支持。

亮点

亮点

Android 16 支持

使用 React Native 0.81 构建的 Android 应用现在将默认目标为 Android 16(API 级别 36)。

正如 Google 此前宣布的,Android 16 要求应用以全屏方式显示,不支持选择退出

为了支持这一点,我们如前所述弃用 <SafeAreaView> 组件,转而使用替代方案。请参阅下文,它们将提供更好的全屏支持。

我们还添加了一个新的 gradle 属性 edgeToEdgeEnabled,让您可以选择是否在所有支持的 Android 版本(16 及以上)上启用全屏显示。

预测性返回手势现在默认启用,适用于目标为 Android 16 的应用。在大多数用例中,BackHandler API 应继续像以前一样工作。但是,如果您的应用依赖于自定义原生代码进行返回处理(例如覆盖 onBackPressed() 方法),您可能需要手动迁移代码或暂时选择退出。升级后请彻底测试您的应用的返回导航。

Google 现在要求应用支持自适应布局在大屏幕设备上,无论方向或尺寸限制如何。虽然您现在可以选择退出,但建议在 Android 17 之前测试并更新您的应用,以实现大屏幕上的响应式 UI。

从 2025 年 11 月 1 日起,所有提交到 Google Play 的应用必须满足原生二进制文件 16 KB 页面大小的要求。这适用于新应用和目标为 Android 15+ 设备的更新。React Native 已符合 16KB 页面大小。请确保您的所有原生代码和第三方库也符合要求。

有关 Android 16 更改和迁移步骤的更多详细信息,请参阅 discussions-and-proposals 仓库中的这篇文章

SafeAreaView 弃用

内置的 <SafeAreaView> 组件最初旨在为屏幕的“安全区域”(远离相机刘海、圆角等)中的内容提供有限的、仅限 iOS 的支持。它与 Android 上的全屏渲染不兼容,并且不允许除了填充之外的自定义。因此,许多应用选择使用更具可移植性和灵活性的解决方案,例如 react-native-safe-area-context

在 React Native 0.81 中,旧版 <SafeAreaView> 组件已弃用,如果您的应用使用它,您将在 React Native DevTools 中看到警告。

它将在 React Native 的未来版本中移除。我们建议您迁移到 react-native-safe-area-context 或类似的库,以确保您的应用在所有平台上都能达到最佳显示效果。

社区维护的 JavaScriptCore 支持

正如我们去年宣布的,对 JavaScriptCore (JSC) 引擎的支持已移至一个社区维护的包,该包与 React Native 本身分开发布。在 React Native 0.81 中,我们正在移除内置的 JavaScriptCore 版本。所有需要 JavaScriptCore 的应用现在都应该使用社区包才能升级到 0.81。阅读安装说明以获取详细信息。

此更改不影响使用 Hermes 的应用。

实验性预编译 iOS 构建

React Native 0.81 引入了预编译的 iOS 构建,在 React Native 作为主要依赖的项目中,编译时间最多可缩短 10 倍。这是 Expo 和 Meta 之间协作的结果,并扩展了我们之前在 React Native 0.80 中发布的工作

此功能仍处于实验阶段,但我们希望在未来的版本中为所有应用启用它。如果您想在自己的应用中尝试预编译构建,您可以在运行 pod install 时通过指定以下环境变量来启用它们

RCT_USE_RN_DEP=1 RCT_USE_PREBUILT_RNCORE=1 bundle exec pod install

请在此 GitHub 讨论中提供反馈。

我们已经意识到两个限制,并正在努力解决

  • 在预编译构建中,您无法调试和单步调试 React Native 的内部。在使用预编译版本的 React Native 时,您仍然可以调试您自己的原生代码。
  • Xcode 26 Beta 不支持预编译,因为 IDE 使用Swift 显式模块构建所有目标。要与 Xcode 26 一起使用预编译构建,请在您的 Xcode 项目中将 SWIFT_ENABLE_EXPLICIT_MODULES 标志设置为 NO。我们将在即将发布的补丁版本中解决此问题。

您可以在 Expo 的完整博客文章预编译 React Native for iOS:0.81 中将实现更快的构建中阅读有关此功能的更多信息。

破坏性变更

Node.js 最低版本提升至 20

React Native 现在需要 Node.js 20.19.4 版本(撰写本文时最新的维护 LTS 版本)或更高版本。升级到 React Native 0.81 时,您可能需要在开发或 CI 环境中升级 Node.js。

Xcode 最低版本提升至 16.1

React Native 现在需要 Xcode 16.1 或更高版本来构建 iOS 项目。升级到 React Native 0.81 时,您可能需要在开发或 CI 环境中升级 Xcode。

Metro:更好地支持社区 CLI 项目中的高级配置

如果 React Native Community CLI 项目的 metro.config.js 文件中指定了 resolveRequestgetModulesRunBeforeMainModule 选项,Metro 现在会尊重它们。以前,设置它们将不起作用。如果您的 metro.config.js 文件中包含这些选项的自定义值,您可能需要删除它们以恢复以前的行为。

改进了未捕获 JavaScript 错误的报告

React Native DevTools 现在显示未捕获 JavaScript 错误的原始消息和堆栈跟踪,以及错误的原因(如果有),以及组件抛出的错误的所有者堆栈。这使得错误更容易调试和修复。

Example error including a cause and Owner Stack

如果您正在将 JavaScript 错误记录到后端或第三方错误报告服务,这可能会影响您升级到 React Native 0.81 后看到的日志(例如:您可能会看到更多以前通过 console.error 报告的已抛出错误),您可能需要相应地更新一些后端逻辑。

RN_SERIALIZABLE_STATE 和 C++ 标志。

在此版本的 React Native 中,我们引入了一个名为 RN_SERIALIZABLE_STATE 的新宏,以支持新架构中组件的可序列化状态。

如果您是库作者并且拥有自定义 CMakeLists.txt 文件,您将需要在 CMakeLists.txt 文件中指定此宏,否则您的 C++ 代码可能无法编译。

为了支持这一点,我们引入了一个新的 CMake 函数 target_compile_reactnative_options,它将负责为您设置此宏和所有必要的 C++ 标志。您可以在 CMakeLists 文件中这样调用它

target_compile_reactnative_options(myLibraryName PRIVATE)

您可以查看react-native-screens 如何设置此宏的示例

此更改仅影响更高级和复杂的库。如果您的库使用 codegen 并且您没有自定义 CMake 文件,则此更改不会影响您。

其他破坏性变更

此列表包含一系列我们认为可能对您的产品代码产生轻微影响并值得注意的其他重大更改

Android

  • 我们将几个类设置为内部类。这些类不属于公共 API,不应被访问。我们已通知受影响的库或提交了补丁。
    • com.facebook.react.fabric.mounting.MountingManager
    • com.facebook.react.views.text.TextLayoutManager
  • 我们将 textAlignVertical 原生属性TextAttribute.h 移动到 ParagraphAttribute.h
    • 属性 textAlignVertical 仅影响最顶层的文本视图(段落视图)。然而,它仍然存在于文本属性中。为了更好地反映这种平台限制,它被移到了段落属性中。
    • 此更改影响 <Text> 组件的 JS API。
    • 您只有在实现与 C++ Text API 交互的 Fabric 组件时才会受到此更改的影响。
    • 如果您受到此更改的影响,您可以在代码中将 TextAttributes.h 替换为 ParagraphAttribute.h

请参阅0.81 的 CHANGELOG 中的完整重大更改列表。

致谢

React Native 0.81 包含来自 110 位贡献者的 1110 多个提交。感谢你们的辛勤工作!

我们要特别感谢那些在此版本中做出重大贡献的社区成员

升级到 0.81

除了升级文档之外,请使用 React Native 升级助手来查看现有项目在 React Native 版本之间的代码更改。

要创建新项目

npx @react-native-community/cli@latest init MyProject --version latest

如果您使用 Expo,React Native 0.81 将在即将发布的 Expo SDK 54 中作为默认的 React Native 版本支持。

信息

0.81 现在是 React Native 的最新稳定版本,0.78.x 将不再受支持。有关更多信息,请参阅React Native 的支持政策