跳到主内容

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

·13 分钟阅读
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 支持以及新的实验性功能。我们还在弃用旧的调试功能,并发布新架构的下一个支柱:无桥接模式(Bridgeless Mode)!

亮点

重大变更

亮点

调试改进

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

Hermes 中的控制台日志历史

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

在 React Native 0.73 中,我们解决了这个问题。Hermes 现在会在后台捕获所有 console.log() 调用,并在首次连接调试器时将其发送到控制台(Console)选项卡 — 这与 Web 浏览器的调试体验保持一致。此新行为适用于 Flipper、连接到 Hermes 的 Chrome DevTools 和实验性的新调试器。

更新的调试文档

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

Overview of the Debugging docs as of 0.73

实验性新调试器

React Native 团队正在开发一种新的 JavaScript 调试器体验,旨在取代 Flipper,其技术预览版已在 React Native 0.73 中提供。新调试器可立即打开,并具有为使用 Hermes 调试 React Native 而定制的精简版 Chrome DevTools UI。

注意

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

The new debugger frontend opened to the "Welcome" pane

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

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

符号链接在 Metro 内部得到了深度表示,这意味着它们可以与 Fast Refresh 等功能配合使用,并且在捆绑过程中产生的性能开销很小。所有桌面平台都支持符号链接,无论是否使用 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 Level 34 (Upside 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 Level 21) 的最后一个版本。React Native 的下一个版本将要求最低 SDK 版本为 23 (Android 6.0)。在此处阅读更多关于即将到来的最小 SDK 版本提升的变更。

新架构更新

我们继续推出 React Native 的新架构,以使其对开源社区中的每个人都可用。

自 React Native 0.68 版本以来,新渲染器 (Fabric) 和新原生模块系统 (TurboModules) 都已提供给用户进行实验和评估。我们感谢社区至今为止提供的反馈。

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

与无桥接模式一起,我们正在发布一个原生模块互操作层(Native Module Interop Layer),它将允许您在无桥接模式下重用旧模块。React Native 0.72 中引入的渲染器互操作层(Renderer Interop Layer)也已调整以与无桥接模式配合使用。

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

已弃用的调试功能

Flipper ↔ React Native 集成

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

不变:Flipper 作为用于原生应用调试的独立产品将继续存在。即使将来它从新的 React Native 项目中移除,开发者如果愿意,仍然能够手动将 Flipper 添加到他们的应用中

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

远程 JavaScript 调试

远程 JavaScript 调试是一种旧式调试模式,它将外部 Web 浏览器 (Chrome) 连接到您的应用并在网页中运行您的 JavaScript 代码,即 http://localhost: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)。
  • 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,React Native 0.73 将在 Expo SDK 50 版本中得到支持。

信息

0.73 现在是 React Native 的最新稳定版本,0.70.x 现已不再受支持。欲了解更多信息,请参阅React Native 的支持策略