React Native 0.73 - 调试改进、稳定的符号链接支持及更多
今天我们发布了 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 的更多信息以及更新的视觉效果。
实验性新调试器
React Native 团队正在开发一种新的 JavaScript 调试器体验,旨在取代 Flipper,其技术预览版已在 React Native 0.73 中提供。新调试器可立即打开,并具有为使用 Hermes 调试 React Native 而定制的精简版 Chrome DevTools UI。
在文档中了解更多关于启用此体验的信息。
Metro 中稳定的符号链接支持
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.kt
和 MainApplication.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.0 和 8.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
权限来支持此功能。
最小 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)。
- 由于我们已从 CLI 中移除了这些默认设置的回退副本,因此 0.72 中更新的
metro.config.js
格式在 0.73 中现为必需。
- 由于我们已从 CLI 中移除了这些默认设置的回退副本,因此 0.72 中更新的
- 从
run-ios
中移除--configuration
选项(由--mode
替代)(#2028)。 - 从
build-android
命令中移除--variant
选项(由--mode
替代)(#2026)。
已弃用 @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 的支持策略。