跳到主要内容

React Native 0.72 - 符号链接支持、更好的错误提示及更多

·阅读 8 分钟
Lorenzo Sciandra
Lorenzo Sciandra
微软高级软件工程师
Marek Fořt
Marek Fořt
Shopify 软件工程师
Riccardo Cipolleschi
Riccardo Cipolleschi
Meta 软件工程师
Luna Wei
Luna Wei
Meta 软件工程师

今天我们发布 0.72 版本!

此版本增加了 Metro 急需的功能、改进的错误处理以及其他开发者体验改进。这些工作很大程度上是根据您在 2022 年社区调查中的反馈优先完成的——感谢所有参与者!

亮点

重大变更

亮点

Metro 新功能

符号链接支持一直是 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_enableSymlinksresolver.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 文件更新为与模板版本一致。

信息

请将您的配置文件更新为以下格式。您也可以参照 升级助手

metro.config.js 的这些格式更改将在 0.73 版本中成为强制要求。对于 0.72 版本,如果未更新,我们将记录警告。

这将扩展基础 React Native Metro 配置的控制权转移到您的项目中,并且我们清理了剩余的默认设置。此外,这意味着独立的 Metro CLI 命令(例如 metro get-dependencies)现在将正常工作。

开发者体验改进

不再因无效样式属性而出现红框

在此版本之前,在 StyleSheet 中提供无效样式属性会导致出现红框。这是一个高信号错误,会干扰开发者的工作流程,而它本身是一个相对低风险的错误。

在 0.72 版本中,我们放宽了这一限制,使其静默失败,就像在浏览器中提供无效 CSS 属性一样,并且已经更新了类型,以便某些错误可以在构建时而非运行时捕获。

Hermes 更好的错误可读性

当调用未定义的 callable 时,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,其中包括改进以减少重复、澄清措辞、减少冗长的堆栈跟踪,并在以下命令中添加指向相关文档的深层链接:initrun-androidrun-ios

您可以在 React Native CLI 变更日志中找到其他改进。

Hermes 中更快的编译和 JSON 解析

Hermes 改进了大型对象字面量的编译时间。例如,在一个报告的问题 #852 中,用户将整个数据集写成一个大型对象字面量。通过改进 Hermes 使用的去重算法,编译速度提高了 97%(221c)。这些改进将有助于那些捆绑了许多对象的应用的构建时间。

JSON 解析的多次优化(de9c, 6e2d)也已完成,这将有利于那些严重依赖 JSON 操作的应用程序,例如使用 redux-persist 等库的应用程序。

Hermes 中更多 ECMAScript 支持

Hermes 中对以下规范的支持已在 React Native 0.72 中落地

对于 JSC 用户,这些功能已经可用。

新架构更新进展

新架构目前仍处于实验阶段。为了使更新内容更集中于目标受众,我们将在 0.72 版本及未来的版本中,将新架构的更新移至专门的工作组。这一改变也将允许更频繁的更新,例如我们夜间构建中发布的工作。

您可以在此处阅读新架构的 0.72 更新。订阅工作组的 GitHub 通知,以了解我们新架构的进展。

重大变更

已废弃组件的移除

以下包已从 React Native 0.72 中移除。请迁移到推荐的社区包

包重命名

所有从 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 的支持政策