React Native 0.73 - 调试改进、稳定符号链接支持等
今天我们发布了 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 的信息以及更新的视觉效果。
实验性新调试器
React Native 团队正在开发一种新的 JavaScript 调试器体验,旨在取代 Flipper,并提供技术预览版,从 React Native 0.73 开始可用。新调试器会立即打开,并提供一个为使用 Hermes 调试 React Native 而定制的精简版 Chrome DevTools UI。
了解有关启用此体验的更多信息 在文档中。
Metro 中的稳定符号链接支持
现在默认启用对在 Metro 中解析符号链接的支持。符号链接支持使 React Native 能够在包含目录使用 watchFolders
配置时与单仓设置一起使用。
符号链接在 Metro 的内部结构中得到了深度表示,这意味着它们可以与快速刷新等功能一起使用,并且在捆绑过程中产生的性能开销很小。符号链接在所有桌面平台上都受支持,无论是否使用 Watchman。
单仓解决方法
我们知道在单仓布局中使用 React Native 时仍然存在一些极端情况。我们已经计划了工作来解决其中一些问题,这些问题并没有完全进入 0.73 版本,但我们旨在尽快发布它们。
对于 React Native 模板项目 (npx react-native init
),您需要在项目根目录之外配置任何 watchFolders
,以便 Metro 能够发现它们 (更多信息)。如果您的 react-native
依赖项安装到不同级别的文件夹中,您可能还需要更新文件路径。
对于 Expo 应用,开箱即用地配置了对 Yarn (Classic) 工作区的支持。另请参阅 Expo 文档中的 使用单仓 指南。
Android 上的 Kotlin 模板
我们很高兴地宣布,从 0.73 版本开始,Kotlin 现在是使用 React Native 构建 Android 应用的推荐语言。这遵循 Android 生态系统多年来的发展方向,并允许您使用现代语言编写应用。
我们已更新 Android 上的 React Native 模板,使用 Kotlin 代替 Java。新的 MainActivity.kt
和 MainApplication.kt
文件大小减少了 36%。
升级助手 (Upgrade Helper) 也已更新,以便更轻松地将您的 .java
文件迁移到 .kt
文件。如果您之前修改过项目中的 Java 文件,并且需要支持将其迁移到 Kotlin,您可以使用 Android Studio 的 代码 > 将 Java 文件转换为 Kotlin 文件
实用程序(也可以使用快捷键 Cmd ⌘ + Shift ⇧ + Option ⌥ + K)。
Android 14 支持
我们已更新 React Native 以完全支持 Android 14。从 0.73 版本开始,React Native 开发人员现在可以定位最新的 Android SDK 版本,API 级别 34(倒置蛋糕)。
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 级别 21) 的版本。下一个版本的 React Native 将具有 23 (Android 6.0) 的最低 SDK 版本。在此处阅读有关即将进行的最低 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 的更多信息,请 查看 RFC。
远程 JavaScript 调试
远程 JavaScript 调试是一种遗留调试模式,它将外部 Web 浏览器 (Chrome) 连接到您的应用,并在网页内运行您的 JavaScript 代码,即 https://127.0.0.1:8081/debugger-ui
。此模型可能导致调试期间应用行为不一致,并且与新架构下的原生模块不兼容。
在 0.73 版本中,远程 JavaScript 调试已弃用,并且已从开发人员菜单中删除。现在必须通过 NativeDevSettings
API 手动启用远程调试器。有关如何执行此操作,请参阅 其他调试方法文档。
远程 JavaScript 调试以前是使用 JavaScriptCore (JSC) 的应用的默认调试体验。我们建议改为使用 Safari 开发者工具(直接 JSC 调试),用于 iOS 应用。
我们建议使用 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 结束生命周期)。
- 模板现在使用 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.73 版本中需要 0.72 版本中 更新的
metro.config.js
格式,因为我们已从 CLI 中删除了这些默认值的回退副本。
- 现在在 0.73 版本中需要 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 的支持策略。