跳至主内容

React Native 0.80 - React 19.1、JS API 变更、冻结旧架构等多项更新

· 1 分钟阅读
Jorge Cohen
Jorge Cohen
Engineering Manager @ Meta
Fabrizio Cucci
Fabrizio Cucci
Software Engineer @ Meta
Gabriel Donadel Dall'Agnol
Gabriel Donadel Dall'Agnol
Software Engineer @ Expo
Christian Falch
Christian Falch
Software Engineer @ Expo
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

今天我们激动地宣布 React Native 0.80 正式发布!

本次更新将 React Native 内置的 React 版本升级至最新的稳定版:19.1.0。

我们还为 JavaScript API 带来了一系列稳定性改进:深度导入现在会触发警告,同时我们推出了全新的可选严格 TypeScript API,提供更精准安全的类型定义。

此外,React Native 的旧架构现已正式冻结,您将开始看到相关 API 的警告提示,这些 API 将在旧架构完全弃用后停止工作。

重点更新

重点详解

JavaScript 深度导入弃用说明

本次更新中,我们正着力优化并稳定 React Native 的公共 JavaScript API。首要举措是明确界定哪些 API 可供应用和框架导入。为此,我们正式弃用 React Native 的深度导入(参见 RFC),并通过 ESLint 和 JS 控制台引入警告机制。

这些警告仅针对项目源代码中的导入操作,您可以选择关闭警告提示。但请注意,我们计划在后续版本中彻底移除深度导入功能,建议您尽快改用根目录导入方式。

// Before - import from subpath
import {Alert} from 'react-native/Libraries/Alert/Alert';

// After - import from `react-native`
import {Alert} from 'react-native';

部分 API 未在根目录导出,未来将无法通过深度导入访问。这是有意为之的设计,旨在缩减 React Native API 的整体暴露范围。我们开设了专门的反馈讨论区收集用户问题,并将与社区共同敲定最终导出的 API 清单(至少涵盖未来两个 React Native 版本周期)。期待您的宝贵意见!

您可以在我们的专题文章中了解更多关于此更改的信息:迈向稳定的 JavaScript API

可选严格 TypeScript API

伴随上述公共 API 导出方式的重构,我们在 0.80 版本中还为 react-native 包推出了一套全新的 TypeScript 类型定义,称为严格 TypeScript API。

启用严格 TypeScript API 可预览 React Native 未来稳定的 JavaScript API。这些新类型具备以下特性:

  1. 直接由源代码生成 - 提升覆盖范围与准确性,为您提供更强的兼容性保障。

  2. 严格限定于 React Native 索引文件 - 更精确定义公共 API 边界,确保内部文件变更不会破坏 API 兼容性。

我们将其与现有类型一同发布,这意味着您可以在准备就绪时选择迁移。此外,如果您使用的是标准 React Native API,大多数应用无需任何更改即可通过验证。我们强烈建议早期采用者和新创建的应用通过修改 tsconfig.json 文件来启用此功能。

当社区准备就绪后,Strict TypeScript API 将成为我们未来的默认 API——其启用时间将与深度导入的移除保持同步。

您可以在我们的专题文章中了解更多关于此更改的信息:迈向稳定的 JavaScript API

旧架构冻结与警告

0.76 版本起,React Native 的新架构已成为默认选择,我们已见证多个项目与工具从中获得显著收益的成功案例

我们近期宣布将旧架构正式视为冻结状态。我们将不再为旧架构开发新的错误修复或功能,并在版本发布流程中停止对旧架构的测试。

为保障迁移平稳性,若您在新架构中遇到错误或功能回退问题,仍可选择暂时禁用新架构。

但同时在 React Native 中维护两种架构存在巨大挑战,这会影响运行时性能、应用体积以及代码库的维护成本。

因此我们最终将在未来某个时间点彻底淘汰旧架构。

在 0.80 版本中,我们新增了一系列警告机制——当您使用新架构不兼容的 API 时,这些警告将在 React Native DevTools 中显示。

建议您不要忽略这些警告,并考虑将应用和库迁移至新架构,为未来做好准备。

旧架构警告

您可以通过我们在 App.js 大会的演讲《后旧架构时代:新架构的未来》深入了解这些变更

React 19.1.0

此版本 React Native 搭载了最新的 React 稳定版:19.1.0

您可在 React 发布说明 中查阅该版本的所有新特性与错误修复。

警告

React 19.1.0 的重要特性是所有者堆栈(owner stacks)的实现与优化。这项开发环境专用功能可帮助您精确定位引发错误的组件。

但请注意:若您使用 @babel/plugin-transform-function-name Babel 插件(React Native Babel 预设默认启用),所有者堆栈在 React Native 中可能无法正常工作。我们将在后续 React Native 版本中修复此问题。

实验性功能 - React Native iOS 依赖项预构建

如果您开发过 React Native iOS 应用,可能注意到首次原生构建耗时较长:在老旧机器上可能需要数分钟甚至更久。这是因为需要完整编译 React Native iOS 代码及其所有依赖项。

过去几周,我们正尝试为 iOS 预构建部分 React Native 核心代码(类似 Android 方案),以缩短首次运行 React Native 应用的构建时间。

React Native 0.80 是首个支持将部分 iOS 依赖项作为预构建内容发布的版本,这将有效减少构建时间。

在 React Native 的发布流程中,我们构建了一个名为 ReactNativeDependencies.xcframework 的 XCFramework,它预编译了 React Native 所依赖的所有第三方库。

我们实验并测试了这个 iOS 预编译方案能节省多少时间。在 M4 芯片设备上的基准测试中,使用预编译构建比源码构建速度提升了约 12%。

根据经验,我们发现许多用户提交的 bug 报告都与 React Native 的第三方依赖构建问题有关(例如 #39568)。 预编译第三方依赖让我们提前为您完成这些库的构建,从而彻底避免这类构建问题。

请注意:我们并非预编译整个 React Native,仅预编译 Meta 未直接控制的库(如 Folly 和 GLog)。

在未来的版本中,我们还将预编译 React Native 核心框架的其他部分。

如何使用

该功能仍处于实验阶段,默认未启用。

如需启用,可在安装 Pod 时添加 RCT_USE_RN_DEP 环境变量:

RCT_USE_RN_DEP=1 bundle exec pod install

若需为所有开发成员启用,可修改 Podfile 文件:

if linkage != nil
Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green
use_frameworks! :linkage => linkage.to_sym
end

+ENV['RCT_USE_RN_DEP'] = '1'

target 'HelloWorld' do
config = use_native_modules!

遇到任何预编译相关问题,请在此讨论区反馈。我们将全力排查,确保预编译方案对您的应用透明无感。

其他变更

Android - IPO 优化减小 APK 体积

此版本显著减小了所有基于 React Native 构建的 Android 应用体积。从 0.80 开始,我们为 React Native 和 Hermes 构建启用了过程间优化

此项优化使所有 Android 应用的安装包体积减小约 1MB。

Android APK 体积对比

只需将 React Native 升级至 0.80 版本,无需额外修改即可获得此优化收益。

新应用启动页重设计

若您未使用 Expo 但采用社区 CLI 和模板,此版本已将新应用启动页迁移至独立包并进行了视觉焕新。这减少了使用社区模板创建新应用时的初始样板代码,同时在大屏设备上提供更佳体验。

新应用启动页设计

关于 JSC 社区支持的说明

React Native 0.80 是最后一个提供官方 JSC 支持的版本。后续 JSC 支持将通过社区维护的 @react-native-community/javascriptcore 包提供。

若您此前未关注相关公告,可在此处查看详情

重大变更

主包新增 "exports" 字段

作为 JS 稳定 API 改进的一部分,我们在 react-nativepackage.json 中引入了 "exports" 字段

在 0.80 版本中,此映射默认仍会暴露所有 JavaScript 子路径,因此不会造成重大破坏性变更。同时,这可能会微妙影响 react-native 包内模块的解析方式:

  • 在 Metro 环境下,平台特定扩展将不再针对 "exports" 匹配项自动展开。我们已提供多个垫片模块来解决此问题(#50426)。

  • 在 Jest 环境下,模拟深层导入的功能可能发生变化,可能需要更新测试用例。

其他破坏性变更

以下列出可能对产品代码产生轻微影响的其他破坏性变更,值得注意:

JavaScript 相关

  • 我们将 eslint-plugin-react-hooks 从 v4.6.0 升级至 v5.2.0(完整变更日志见此)。react-hooks 的 lint 规则可能产生新的错误提示,需要修复或忽略

Android 相关

  • 本次发布将 React Native 内置的 Kotlin 版本升级至 2.1.20。Kotlin 2.1 引入了预览版语言特性,可用于模块/组件开发。详见官方发布说明

  • 我们移除了 StandardCharsets 类(自 0.73 起已弃用)。请改用 java.nio.charset.StandardCharsets 类。

  • 我们将多个类标记为内部类(非公开 API,禁止访问)。已通知受影响库或提交补丁:

    • com.facebook.react.fabric.StateWrapperImpl
    • com.facebook.react.modules.core.ChoreographerCompat
    • com.facebook.react.modules.common.ModuleDataCleaner
  • 多个类从 Java 迁移至 Kotlin。如使用这些类,需调整参数的可空性和类型:

    • com.facebook.react.devsupport 包下所有类
    • com.facebook.react.bridge.ColorPropConverter
    • com.facebook.react.views.textinput.ReactEditText
    • com.facebook.react.views.textinput.ReactTextInputManager

iOS 相关

  • 从 RCTUtils.h 中移除 RCTFloorPixelValue 字段 - RCTFloorPixelValue 方法在 React Native 中未使用,现已完全删除。

更多小型破坏性变更详见 0.80 版变更日志

致谢

React Native 0.80 包含来自 127 位贡献者的 1167 次提交。感谢所有人的辛勤付出!

特别鸣谢在本版本中做出重大贡献的社区成员:

同时感谢为本版本说明文档撰文的作者:

  • Riccardo Cipolleschi 编写 React Native iOS 依赖预构建相关内容

  • Alex Hunt 负责深层导入弃用、严格 TypeScript API 及新应用屏幕重设计部分

  • 感谢 Nicola Corti 在旧架构冻结和警告方面的工作。

升级到 0.80 版本

对于现有项目,除了升级文档外,请使用 React Native Upgrade Helper 查看 React Native 各版本间的代码变更。

要创建新项目:

如果您使用 Expo,React Native 0.80 将在 Expo SDK 的 canary 版本中获得支持。关于如何在 Expo 中使用 React Native 0.80 的说明可参阅这篇专门的博客文章

信息

0.80 现已成为 React Native 的最新稳定版本,0.77.x 版本将不再受支持。更多信息请参阅 React Native 的支持政策。我们计划在近期发布 0.77 的最终终止支持更新。