跳到主要内容

React Native 0.76 - 默认新架构、React Native DevTools 等

·12 分钟阅读
Blake Friedman
Blake Friedman
Meta 软件工程师
Riccardo Cipolleschi
Riccardo Cipolleschi
Meta 软件工程师
Frank Calise
Frank Calise
软件工程师 @ Infinite Red
Gabriel Donadel Dall'Agnol
Gabriel Donadel Dall'Agnol
Expo 软件工程师

今天我们很高兴发布 React Native 0.76!

这是 React Native 的一个重要里程碑,因为我们默认启用了新架构,并引入了 React Native DevTools。这是我们团队六年辛勤工作的结晶,也离不开我们卓越的开发者社区的支持。

亮点

重大变更

亮点

React Native 默认启用新架构

从 React Native 0.76 开始,新架构将在您的项目中默认启用。新架构是对 React Native 内部的重写,旨在使应用程序开发者能够使用 React 开发高质量的原生应用程序。

今天,我们很高兴地宣布新架构已准备好投入生产使用。

这一变化是 React Native 发展过程中的一个里程碑,我们邀请您阅读这篇专门的博文,以了解新架构包含哪些内容以及它将如何塑造 React Native 的未来:新架构已到来

React Native DevTools

React Native DevTools front-end

我们正在发布 React Native DevTools 的第一个稳定版本,这是我们新的默认调试体验。

我们希望您用于调试跨平台 React 的工具是可靠的、熟悉的、简单的且一致的。React Native DevTools 遵循这些原则——浏览器兼容的开发者工具,与 React Native 深度集成。主要功能包括:

  • 熟悉的、与 Web 对齐的工具 — 基于 Chrome DevTools 的全功能调试器,具有可靠的断点、监视值、单步调试、堆栈检查以及丰富的 JavaScript 控制台。这些核心功能现在可以可靠地在重新加载时工作。
  • 改进且集成的 React DevTools — 内置的 React Components Inspector 和 Profiler 无缝协作,组件高亮显示更快、更可靠。
  • 改进的用户体验 — 看到新的在调试器中暂停叠加层,当您的应用程序在断点处暂停时会清晰显示。LogBox 中的警告现在显示为摘要,并在附加 DevTools 时隐藏。
  • 修复了重连行为 — JavaScript 断点现在在重新加载时以及 DevTools 断开和重新连接时都能可靠地工作。即使在原生重建后,DevTools 也能重新连接到同一应用程序。
  • 即时启动 — React Native DevTools 默认可用,无需任何配置。从应用内开发者菜单打开,或通过 j 在 CLI 服务器中调试,该服务器现在支持多个模拟器和设备。

React Native DevTools 与我们之前的调试选项根本不同,也不同于 0.73 版本中首次发布的实验性调试器体验。它切换到一个新的后端调试堆栈,我们已经重建了一年多。这意味着与之前工具的兼容性已发生变化,您也应该期待一个端到端更可靠的体验。我们打算在此新堆栈的基础上构建,以便将来能够可靠地实现更多功能,例如性能和网络面板。

逐步淘汰 Metro 中的日志

在我们的下一个版本中,我们将删除 Metro 中的转发日志,以使其与现代浏览器工具保持一致,并移除旧的调试集成。请改用 React Native DevTools 中功能齐全的 Console 面板进行日志记录。请参阅我们的常见问题解答了解更多信息。

链接

更快的 Metro 解析

我们已经对 Metro 的解析器(负责从导入路径查找模块的组件)进行了一些性能改进,使其速度提高了约 15 倍。这提高了 Metro 的整体性能,尤其是在热启动构建时,我们看到性能提高了约 4 倍。

Box Shadow 和 Filter 样式属性

我们在 0.76 版本中添加了两个仅限新架构的样式属性 — boxShadowfilter。这两个属性都存在于 Web 端,并且团队在可能的情况下遵循规范,以便这些属性具有可预测性、熟悉性,并最终更容易采用(请参阅限制和规范偏差部分以了解例外情况)。因此,您可以查找 Web 文档以完全理解它们的工作原理,但有一些重要的区别如下所述。

boxShadow

boxShadow 为元素添加阴影,能够控制阴影的位置、颜色、大小和模糊度。请查看MDN 文档,全面了解这些参数,并附带一个 Fiddle 供您亲自尝试。以下是一些您可以创建的阴影示例。

New boxShadow style prop

boxShadow 可以接受字符串,模仿 CSS 语法,或者接受可以嵌入变量的 JS 对象。例如,字符串 ‘5 5 5 0 rgba(255, 0, 0, 0.5)’ 和对象 {offsetX: 5, offsetY: 5, blurRadius: 5, spreadDistance: 0, color: ‘rgba(255, 0, 0, 0.5)’} 会产生相同的 box shadow。

之前的阴影功能存在一些缺点,现在由 boxShadow 解决了。

  • 在 Android 上无效
  • 无法使用内嵌
  • 没有扩展
  • 如果 View 没有背景颜色,则无法在 View 上使用
  • 这是一个独立的属性,因此无法共享相同的 Web 语法

限制与规范偏差

  • 默认阴影颜色为黑色,而不是父级颜色
  • Android 普通阴影支持 Android 9+
  • Android 内嵌阴影支持 Android 10+

filter

filter 为元素添加图形滤镜。它包含颜色滤镜,用于修改亮度、饱和度和色相,以及非颜色滤镜,用于添加模糊和阴影。请查看MDN 文档,全面了解每个单独的滤镜函数,并附带一个 Fiddle 供您尝试。以下是一张应用了各种滤镜的热狗图片。

Filters demonstration
从左到右:无滤镜,saturate 滤镜,blur 滤镜,invert 滤镜

boxShadow 一样,filter 可以接受模仿 CSS 语法的字符串,或者嵌入变量的 JS 对象数组。例如,字符串 ‘saturate(0.5) grayscale(0.25)’ 和数组 [{saturate: 0.5}, {grayscale: 0.25}] 会产生相同的滤镜。filter 有一个 dropShadow 值,与 boxShadow 略有不同。最大的区别在于 dropShadow 是一个 alpha 蒙版 — 因此只有当像素具有非零 alpha 分量时才会投射阴影。而 boxShadow 则会在元素的边框框周围投射阴影,即使其中没有任何内容。此外,dropShadow 没有扩展距离参数,也不能是内嵌的(阴影投射到元素内部)。

限制和规范偏差

  • iOS filter 只支持亮度和不透明度
  • iOS filter 不会应用于阴影、轮廓或其他超出元素边界的图形元素
  • Android blurdrop-shadow 只支持 Android 12+
  • filter 暗示 overflow: hidden,因此具有 filter 的元素的子元素如果定位在父元素边界之外,将会被剪裁。

重大变更

移除了对 @react-native-community/cli 的依赖

正如在 0.75 版本中分享过的,我们的愿景是让 React Native 独立于框架。因此,我们完成了移除 @react-native-community/cli 作为 React Native 直接依赖的工作。

将 React Native 与 CLI 解耦,使我们能够通过独立发布这些项目来加快速度,并更好地划分两个项目的职责。

如果您在日常工作流中依赖 CLI,请确保在您的 package.json 中明确添加 CLI 的依赖

//…
“devDependencies”: {
// …
+ “@react-native-community/cli”: “15.0.0”,
+ "@react-native-community/cli-platform-android": “15.0.0”,
+ "@react-native-community/cli-platform-ios": “15.0.0”,
},

通过原生库合并,Android 应用尺寸减小约 3.8MB

React Native 0.76 将提供更少的原生库,因为我们将许多原生代码合并到一个名为 libreactnative.so 的库中。

这一变化带来了应用尺寸的减小,以及 Android 应用启动性能的提升。根据我们的基准测试,我们发现应用尺寸将减小约 3.8MB(总尺寸的 20%),中位应用启动时间将减小约 15ms(约 8%)(来源)。

另一方面,这对应用程序和库开发者来说都是一个破坏性更改。

应用程序开发者需要更新其应用程序的 onCreate,如下所示:

+import com.facebook.react.soloader.OpenSourceMergedSoMapping
import com.facebook.soloader.SoLoader

class MainApplication : Application(), ReactApplication {

override fun onCreate() {
super.onCreate()
+ SoLoader.init(this, OpenSourceMergedSoMapping)
- SoLoader.init(this, false)
}
}

此更改对于正确加载 libreactnative.so 是必要的,并且包含在 upgrade-helper 中

库作者不受此更改影响,除非您有自定义 C++ 代码。

有关此更改的技术深入分析以及给库作者的建议,您可以在专门的帖子中了解更多。

最低 iOS 和 Android SDK 要求更新

我们已更新了最低平台和 SDK 版本

  • iOS - 从 13.4 到 15.1
  • Android - 从 SDK 23 到 SDK 24(Android 7)

此更改已在今年早些时候 0.75 版本发布时宣布。有关更多背景信息,请参阅AndroidiOS 的专门帖子。

其他重大变更

  • 动画
    • 停止向 React 发送循环动画的状态更新。这导致了循环动画不必要的重新渲染。
  • devtools
    • 移除 Inspector Panel 的性能 + 网络选项卡(在新架构下)。(RFC
  • 文本引擎
    • 在 TextLayoutManager 中始终使用 AttributedStringBox 而不是 AttributedString

Android

  • 渲染
    • View 背景不再直接是 ReactViewBackgroundDrawableCSSBackgroundDrawable

iOS

  • turbomodule
    • 移除了用于自动链接纯 Cxx 模块的 RCT_EXPORT_CXX_MODULE_EXPERIMENTAL 宏。

致谢

React Native 0.76 包含来自 156 位贡献者的超过 1070 个提交。感谢大家辛勤的付出!

感谢所有为本版本发布文章撰写文档的额外作者

升级到 0.76

除了升级文档外,请使用 React Native Upgrade Helper 查看现有项目在 React Native 版本之间的代码更改。

如果您使用 Expo,React Native 0.76 将在 Expo SDK 52 中得到支持。

如果您需要使用 CLI 创建一个新项目,您可以运行此命令

npx @react-native-community/cli@latest init MyProject --version latest
信息

0.76 现在是 React Native 的最新稳定版本,0.73.x 已进入不受支持状态。有关更多信息,请参阅 React Native 的支持策略。我们计划在不久的将来发布 0.73 的最终生命周期更新。