React Native 0.72 - 符号链接支持、更佳错误处理等
今天我们发布了 0.72!
此版本添加了 Metro 的热门功能请求、更好的错误处理以及其他开发人员体验改进。其中很多工作都是根据您在 2022 年社区调查 中提供的反馈优先考虑的——感谢所有参与者!
亮点
重大更改
亮点
新的 Metro 功能
符号链接支持(Beta 版)
符号链接支持一直是 Metro 中最受请求的功能之一,在 React Native 0.72 中,我们很高兴地宣布对其提供 Beta 版支持。
符号链接支持使 React Native 能够透明地与单仓库设置和 pnpm 协同工作,无需使用变通方法。请参阅 启用 Beta 版功能 以在您的应用中使用。
它目前处于 Beta 版,以便收集有关不同工作流程的开发人员体验的反馈,请参阅更多详细信息 此处。我们计划在 0.73 中默认启用符号链接。
包导出支持(Beta 版)
包导出 是 package.json "main"
字段的现代替代方案,并为 npm 包提供了新的功能,以定义其公共 API 并定位 React Native。
通过在您的 Metro 配置中启用包导出支持,您的应用将与更广泛的 JavaScript 生态系统兼容,包括通过新的 “react-native”社区条件。请参阅 启用 Beta 版功能 以在您的应用中使用。
请参阅 React Native 中的包导出支持,以了解有关此功能以及我们稳定发布计划的更多信息。
启用 Beta 版功能
要在您的项目中启用这些功能,请更新应用的 metro.config.js
文件,并设置 resolver.unstable_enableSymlinks
或 resolver.unstable_enablePackageExports
选项。
const config = {
// ...
resolver: {
unstable_enableSymlinks: true,
unstable_enablePackageExports: true,
},
};
新的 metro.config.js
设置
在 React Native 0.72 中,我们更改了 React Native CLI 中 Metro 的配置加载设置。请更新项目的 metro.config.js
文件以匹配 模板版本。
这将扩展基本 React Native Metro 配置的控制权移到您的项目中,并且我们已清理了剩余的默认值。此外,这意味着独立的 Metro CLI 命令(例如 metro get-dependencies
)现在可以工作了。
开发人员体验改进
无效样式属性不再出现红色框
在此版本之前,在 StyleSheet 中提供无效的样式属性会导致出现红色框。对于相对低风险的错误,这是一个会中断开发人员工作流程的高信号错误。
在 0.72 中,我们已放宽了此预期,使其像在浏览器中提供无效的 CSS 属性一样静默失败,并且已更新类型,以便一些错误可以在构建时而不是运行时被捕获。
改进 Hermes 的错误可读性
在调用未定义的可调用对象时,Hermes 添加了更好的错误消息。
var x = undefined; x();
// Before: undefined is not a function
// After: x is not a function (it is undefined)
此外,LogBox 堆栈跟踪现在会过滤掉与应用用户无关的内部 Hermes 字节码帧。
改进 React Native CLI 的错误输出
React Native CLI v11(包含在 0.72 版本中)带来了一些改进,包括减少重复代码、澄清措辞、缩短冗长的堆栈跟踪,并在以下命令中添加指向相关文档的深度链接:init
、run-android
和 run-ios
。
您可以在 React Native CLI 变更日志 中找到其他改进。
Hermes 中更快的编译和 JSON 解析
Hermes 提高了大型对象字面量的编译速度。例如,在一个报告的问题 #852 中,用户将整个数据集写成了一个大型对象字面量。通过改进 Hermes 使用的去重算法,编译速度提高了 97% (221c)。这些改进将有利于捆绑大量对象的应用的构建时间。
JSON 解析也进行了多项优化 (de9c,6e2d),这将有利于使用像 redux-persist 这样依赖大量 JSON 操作的库的应用。
Hermes 中更多的 ECMAScript 支持
React Native 0.72 中已加入对以下规范的支持
prototype.at
支持 数组、类型化数组 和 字符串。请参阅 #823 (ebe2)。- 实现 格式良好的 JSON.stringify (d41d) 以防止格式错误的 Unicode 字符串
- 实现 AggregateError (9b25),它表示包装在一个错误中的多个错误。对于多个错误很有用,例如来自
Promise.any()
,当传递给它的所有 Promise 都被拒绝时。
对于使用 JSC 的用户,这些功能已可用。
新架构更新的迁移
新架构目前处于实验阶段。为了使更新专注于其目标受众,我们在 0.72 及后续版本中将新架构更新迁移到专门的 工作组。此更改还将允许更频繁地更新,例如在我们的 nightly 版本中发布的工作。
您可以 此处 阅读 0.72 版本的新架构更新。订阅工作组的 GitHub 通知,以随时了解我们在新架构上的进展。
重大变更
已弃用组件的移除
以下软件包已从 React Native 0.72 中移除。请迁移到推荐的社区软件包
- Slider 已被 @react-native-community/slider 取代
- DatePickerIOS 已被 @react-native-community/datetimepicker 取代
- ProgressViewIOS 已被 @react-native-community/progress-view 取代
软件包重命名
从 react-native
核心存储库发布的所有软件包现在位于 react-native/packages
下,并以 @react-native npm 范围 发布,以确保明确的所有权。
react-native 软件包没有任何更改。
旧软件包名称 | 新软件包名称 |
---|---|
@react-native-community/eslint-config | @react-native/eslint-config |
@react-native-community/eslint-plugin | @react-native/eslint-plugin |
@react-native/polyfills | @react-native/js-polyfills |
@react-native/normalize-color | @react-native/normalize-colors |
@react-native/assets | @react-native/assets-registry |
react-native-codegen | @react-native/codegen |
react-native-gradle-plugin | @react-native/gradle-plugin |
如果您没有直接依赖于重命名的软件包,则此更改不会影响您。否则,在升级到 React Native 0.72 时,请将任何重命名的依赖项更新到其 ~0.72 版本。
您可以在 专门的 RFC 中 阅读导致这些更改的动机。
致谢
此版本的许多内容来自社区的直接反馈。从关于 嘈杂的红色边框、软件包导出错误、新架构基准测试 的报告——所有这些反馈都非常宝贵,我们感谢您抽出时间分享反馈。
0.72 包含来自 66 位贡献者的 1100 多次提交。感谢您所有的辛勤工作!
升级到 0.72
查看 升级助手 中所需的更改列表,或阅读 升级文档,了解如何更新您的现有项目,或使用 npx react-native@latest init MyProject
创建新项目。
如果您使用 Expo,React Native 版本 0.72 将在 Expo SDK 49 版本中获得支持。
0.72 现在是 React Native 的最新稳定版本,0.69.x 版本现在不再受支持。有关更多信息,请参阅 React Native 的支持策略。