React Native 0.72 - 符号链接支持、更好的错误等
今天我们发布 0.72 版本!
此版本增加了 Metro 急需的功能、更好的错误处理以及其他开发者体验改进。这些工作大部分都是根据您在 2022 年社区调查中的反馈优先完成的——感谢所有参与者!
亮点
破坏性变更
亮点
Metro 新特性
符号链接支持(Beta)
符号链接支持仍然是 Metro 中最受期待的功能之一,在 React Native 0.72 中,我们很高兴地宣布对其提供 Beta 支持。
符号链接支持使 React Native 能够透明地与 monorepo 设置和 pnpm 协同工作,从而无需变通方法。请参阅启用 Beta 特性以在您的应用程序中使用。
目前它处于 Beta 阶段,旨在收集针对不同工作流的开发者体验反馈,更多详情请参阅此处。我们计划在 0.73 中默认启用符号链接。
Package Exports 支持(Beta)
Package Exports 是 package.json 中 "main"
字段的现代替代方案,为 npm 包定义其公共 API 并面向 React Native 提供了新功能。
通过在 Metro 配置中启用 Package Exports 支持,您的应用将与更广泛的 JavaScript 生态系统兼容,包括通过新的 “react-native” 社区条件。请参阅启用 Beta 特性以在您的应用中使用。
请参阅 React Native 中的 Package Exports 支持以了解此功能的更多信息以及我们稳定推出的计划。
启用 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) 也已落地,这有利于那些大量依赖 JSON 操作的应用程序,例如使用 redux-persist 的应用程序。
Hermes 中更多的 ECMAScript 支持
Hermes 中对以下规范的支持已在 React Native 0.72 中落地:
- Array、TypedArray 和 String 的
prototype.at
支持。请参阅 #823 (ebe2)。 - 实现 well-formed JSON.stringify (d41d) 以防止格式错误的 Unicode 字符串
- 实现 AggregateError (9b25) 表示多个错误封装在一个错误中。这对于
Promise.any()
等多个错误很有用,当传递给它的所有 Promise 都被拒绝时。
对于 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 中阅读导致这些更改的动机。
致谢
此版本的大部分内容都直接来自社区的反馈。从关于嘈杂的红框的报告,到Package Exports 的错误,再到新架构的基准测试——所有这些反馈都非常宝贵,我们感谢您花时间分享反馈。
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 的支持策略。