React Native 0.72 - 符号链接支持、更好的错误等
今天我们发布 0.72 版本!
此版本为 Metro 增加了备受期待的功能,改进了错误处理,以及其他开发者体验方面的改进。其中大部分工作都是根据您在2022 年社区调查中的反馈优先完成的——感谢所有参与者!
亮点
重大变更
亮点
新的 Metro 功能
符号链接支持 (Beta)
符号链接支持一直是 Metro 中最受请求的功能之一,在 React Native 0.72 中,我们很高兴地宣布对其提供 Beta 支持。
符号链接支持使 React Native 能够透明地与 monorepo 设置和 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 错误输出改进
0.72 版本附带 React Native CLI v11,它改进了 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 中已支持 Hermes 中的以下规范:
- Array、TypedArray 和 String 的
prototype.at支持。请参阅 #823 (ebe2)。 - 实现格式良好的 JSON.stringify (d41d) 以防止格式错误的 Unicode 字符串
- 实现AggregateError (9b25),它表示封装在单个错误中的多个错误。当传递给它的所有 Promise 都拒绝时,这对于来自
Promise.any()的多个错误很有用。
对于 JSC 用户,这些功能已经可用。
移动新架构更新
新架构目前处于实验阶段。为了让更新专注于目标受众,我们将在 0.72 及未来版本中将新架构更新移至专门的工作组。此更改还将允许更频繁的更新,例如在我们夜间版本中发布的工作。
您可以在此处阅读 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 的支持策略。



