跳到主要内容

React Native 0.73 - 调试改进、稳定符号链接支持及更多

·10 分钟阅读
Marek Fořt
Marek Fořt
Shopify 软件工程师
Thibault Malbranche
Thibault Malbranche
Brigad 首席移动工程师
Hur Ali
Hur Ali
Callstack 软件工程师
Luna Wei
Luna Wei
Meta 软件工程师
Alex Hunt
Alex Hunt
Meta 软件工程师

今天我们发布 React Native 0.73!此版本增加了 Hermes 调试改进、稳定的符号链接支持、Android 14 支持和新的实验性功能。我们还弃用了一些旧的调试功能,并发布了新架构的下一个支柱:无桥模式!

亮点

重大变更

亮点

调试改进

React Native 和 Hermes 团队致力于改进 React Native 中的调试体验。在 0.73 版本中,我们很高兴分享在这项持续投入中的一些初步进展。

Hermes 中的控制台日志历史记录

console.log() 是开发者快速调试 JavaScript 代码的一种非常流行的方式。在以前的版本中,React Native 应用中的控制台日志在连接调试器之前不会被记录。这使得很难观察应用加载早期发生的日志。

在 React Native 0.73 中,我们解决了这个问题。Hermes 现在在后台捕获所有 console.log() 调用,当首次连接调试器时,这些调用将被发送到控制台选项卡,这与 Web 浏览器中的调试体验相匹配。这种新行为适用于 Flipper、连接到 Hermes 的 Chrome DevTools 以及实验性的新调试器。

更新的调试文档

我们刷新了文档的 调试 部分,现在包括关于如何连接所有受支持调试器的最新信息、关于 React DevTools 的更多信息以及刷新的视觉效果。

Overview of the Debugging docs as of 0.73

实验性新调试器

React Native 团队正在开发一种新的 JavaScript 调试器体验,旨在取代 Flipper,从 React Native 0.73 开始提供技术预览。新调试器立即打开,并具有精简的 Chrome DevTools UI,该 UI 针对使用 Hermes 调试 React Native 进行了定制。

注意

新的调试器是实验性的,并且存在一些 已知问题,我们正在积极努力在未来的 React Native 版本中解决这些问题。如果您正在尝试使用它,请使用 相同的讨论线程 来报告反馈。

The new debugger frontend opened to the "Welcome" pane

文档 中了解更多关于启用此体验的信息。

Metro 中解析符号链接的支持现在默认启用。当包含目录配置了 watchFolders 时,符号链接支持使 React Native 能够与 monorepo 设置一起工作。

符号链接在 Metro 的内部结构中得到了深入的表示,这意味着它们可以与诸如 快速刷新 之类的功能一起工作,并且在捆绑期间几乎不会产生性能开销。所有桌面平台都支持符号链接,无论是否使用 Watchman。

信息

Monorepo 解决方法

我们意识到在使用 Monorepo 布局中的 React Native 时仍然存在边缘情况。我们计划进行一些工作来解决其中的一些问题,这些问题并没有完全进入 0.73 版本,但我们的目标是尽快发布。

对于 React Native 模板项目 (npx react-native init),您需要配置项目根目录之外的任何 watchFolders,以便 Metro 发现它们 (更多信息)。如果您的 react-native 依赖项安装到不同级别的文件夹中,您可能还需要更新文件路径。

对于 Expo 应用,Yarn (Classic) 工作区的支持已开箱即用。另请参阅 Expo 文档中的 使用 Monorepos 指南。

Android 上的 Kotlin 模板

我们很高兴地宣布,从 0.73 版本开始,Kotlin 现在是使用 React Native 构建的 Android 应用的推荐语言。这遵循了 Android 生态系统多年来的发展方向,并允许您使用现代语言编写应用程序。

我们已更新 React Native 在 Android 上的模板,以使用 Kotlin 而不是 Java。新的 MainActivity.ktMainApplication.kt 文件尺寸缩小了 36%。

升级助手 也已更新,以简化将 .java 文件迁移到 .kt 文件的过程。如果您之前修改过项目中的 Java 文件,并且需要支持将其迁移到 Kotlin,则可以使用 Android Studio 的 Code > Convert Java file to Kotlin File 实用程序(也可以使用快捷键 Cmd ⌘ + Shift ⇧ + Option ⌥ + K 访问)。

Android 14 支持

我们已更新 React Native 以完全支持 Android 14。从 0.73 版本开始,React Native 开发者现在可以定位最新的 Android SDK 版本,API 级别 34Upside Down Cake)。

Java 17 和 Android Gradle 插件升级

为了支持 Android 14,我们已将用于构建 Android 应用的 Android Gradle 插件 (AGP) 版本从 7.4.x 更新到 8.1.x

AGP 的这个主要版本升级带来了一系列重大变更,这些变更可在 Google 的发行说明中找到 (8.0.08.1.0)。

最重要的是,Java 17 现在是构建 Android 应用的必要条件。您可以通过运行以下命令将 Java 版本更新到 17

brew install --cask zulu@17

并通过更新 入门指南 中记录的 JAVA_HOME

如果您是库开发者,您的库应该可以在 React Native 0.73 上工作,而无需进行更改。今年早些时候,我们发布了一份说明,澄清了 AGP 升级对您作为库作者的意义。

授予对照片和视频的部分访问权限

选定的照片访问权限 允许 Android 14 用户授予应用对其媒体库中特定项目的访问权限,而不是访问所有媒体。在 0.73 版本中,React Native 应用现在通过在 PermissionsAndroid API 中使用 READ_MEDIA_VISUAL_USER_SELECTED 权限来支持此功能。

Selected Photos Access in Android 14

最低 SDK 版本提升

React Native 0.73 将是最后一个支持 Android 5.0(API 级别 21)的版本。下一个版本的 React Native 的最低 SDK 版本将为 23(Android 6.0)。在此处阅读有关即将到来的最低 SDK 版本提升的更多信息 here

新架构更新

我们将继续推广 React Native 的新架构,使其可供开源社区中的每个人使用。

自 React Native 0.68 以来,新渲染器 (Fabric) 和新原生模块系统 (TurboModules) 都可供用户试用和评估。我们要感谢社区迄今为止收到的反馈。

今天,我们发布了新架构的另一部分:无桥模式。到目前为止,当您在应用中启用新架构时,桥接器仍然可用,以支持与旧组件和模块的向后兼容性。但是,我们的愿景是完全淘汰桥接器。从 React Native 0.73 开始,您可以启用无桥模式,这将完全禁用桥接器的创建。

与无桥模式一起,我们正在发布一个原生模块互操作层,它允许您在无桥模式下重用旧模块。渲染器互操作层 在 React Native 0.72 中引入的也已调整为与无桥模式一起工作。

与新架构的其余部分一样,无桥模式最初是实验性的。我们邀请感兴趣的用户启用它,并在 新架构工作组 中报告您遇到的任何问题和不兼容性。

已弃用的调试功能

Flipper ↔ React Native 集成

我们正在逐步放弃 Flipper 作为 React Native 应用的默认调试工具。在 0.73 版本中,这首先从弃用 React Native 附带的本机 Flipper 集成(连接 Flipper 核心插件的引导代码)开始。我们将在下一个版本中删除此集成和依赖项,这意味着 Flipper 的某些部分(如网络插件)将停止工作。

未更改:Flipper 作为本机应用调试的独立产品将继续存在。即使在未来从新的 React Native 项目中删除后,开发者仍然可以 手动将 Flipper 添加到他们的应用(如果他们愿意)。

有关我们为何放弃 Flipper 的更多信息,请查看 RFC

远程 JavaScript 调试

远程 JavaScript 调试是一种旧的调试模式,它将外部 Web 浏览器 (Chrome) 连接到您的应用,并在网页中运行您的 JavaScript 代码,即 https://127.0.0.1:8081/debugger-ui。这种模型可能会导致调试时应用行为不一致,并且与新架构下的本机模块不兼容。

在 0.73 版本中,远程 JavaScript 调试已被弃用,并已从开发菜单中删除。现在必须通过 NativeDevSettings API 手动启用远程调试器。有关如何执行此操作的信息,请参阅 其他调试方法文档

信息

远程 JavaScript 调试以前是使用 JavaScriptCore (JSC) 的应用的默认调试体验。我们建议对于 iOS 应用使用 Safari 开发者工具(直接 JSC 调试) 代替。

我们建议使用 Hermes 以获得所有平台上一致的调试体验。

重大变更

Babel 包重命名

我们已将两个与 Babel 相关的包从 Metro 中移出,并移至 React Native 的存储库和版本控制方案中,这使我们能够简化维护和升级。这些包的新版本支持 0.73 版本中的新架构功能,这意味着必须更新这些依赖项。

升级时,请遵循 升级助手,以确保您已更新这些依赖项。某些包已重命名

旧包名称新包名称
metro-react-native-babel-preset@react-native/babel-preset
metro-react-native-babel-transformer@react-native/metro-babel-transformer
信息

@react-native/babel-preset 现在包含 @react-native/babel-plugin-codegen,不再需要在 Babel 配置文件中单独指定它。

其他重大变更

以下是 0.73 版本中的一些主要重大变更。有关重大变更的完整列表,请参阅 完整变更日志

  • 将最低 Node.js 要求提高到 18.x (#37709)(另请参阅 Node.js 16 EOL)。
  • 模板现在使用 TypeScript 5.0 (#36862)。
    • React Native 类型继续在 TypeScript 4.8 上工作。
  • Android:Java 17 现在是构建 Android 应用的必要条件(见上文)。
  • Android:将 Fresco 主要版本升级到 3.0 (#38275)。
  • iOS:将最低 iOS 版本提高到 13.4 (#36795)。
  • iOS:通过 Xcode 运行构建时,Metro 将不再自动启动 (#38242)。

对于库作者

  • Android:升级到 AGP 8.1.1 (讨论)

React Native CLI 变更

突出显示的重大变更

  • 更改 build-android 命令中的默认任务前缀。从现在开始,当您运行 build-android 时,将运行 bundle 任务而不是 assemble (#1913)。
  • 删除 Metro 配置默认值的回退流程 (#1972)。
    • 来自 0.72 版本的 更新的 metro.config.js 格式 现在在 0.73 版本中是必需的,因为我们已从 CLI 中删除了这些默认值的回退副本。
  • run-ios 中删除 --configuration 选项(替换为 --mode)(#2028)。
  • build-android 命令中删除 --variant 选项(替换为 --mode)(#2026)。

请参阅 v12.0.0 的完整变更日志.

已弃用 @types/react-native

正如 对 TypeScript 的一流支持 中提到的,自 0.71 版本以来,我们已随 react-native 发布了 TypeScript 类型,现在我们正在弃用 0.73 版本的 @types/react-native

我们将不再为现有版本发布任何未来的补丁。建议迁移离开 @types/react-native。请参阅 如何迁移 的说明。

致谢

React Native 0.73 包含来自 68 位贡献者的超过 2259 次提交。感谢你们的所有辛勤工作!

升级到 0.73

除了 升级文档 之外,请使用 React Native 升级助手 查看现有项目的 React Native 版本之间的代码更改。您还可以使用 npx react-native@latest init MyProject 创建一个新项目。

如果您使用 Expo,Expo SDK 50 版本将支持 React Native 0.73。

信息

0.73 现在是 React Native 的最新稳定版本,0.70.x 现在变为不受支持。有关更多信息,请参阅 React Native 的支持策略