React Native 0.76 - 默认新架构、React Native DevTools 等
今天我们很高兴发布 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 的第一个稳定版本,这是我们新的默认调试体验。
我们希望您在所有平台上调试 React 所使用的工具是可靠、熟悉、简单和具有凝聚力的。React Native DevTools 秉承这些原则——与 React Native 深度集成的浏览器对齐的开发工具。主要功能包括:
- 熟悉、与 Web 对齐的工具 — 基于 Chrome DevTools 的功能齐全的调试器,具有可靠的断点、监视值、单步调试、堆栈检查和丰富的 JavaScript 控制台。这些核心功能现在在重新加载后也能可靠地工作。
- 改进和集成的 React DevTools — 内置的 React 组件检查器和分析器无缝工作,组件高亮更快、更可靠。
- 改进的用户体验 — 查看新的调试器暂停叠加层,清楚地显示应用程序在断点处暂停。LogBox 中的警告现在以摘要形式显示,并在 DevTools 附加时隐藏。
- 修复了重新连接行为 — JavaScript 断点现在在重新加载以及 DevTools 断开连接和重新附加时可靠地工作。DevTools 甚至可以在原生重建后重新连接到同一个应用程序。
- 即时启动 — React Native DevTools 默认开箱即用,无需配置。从应用内开发菜单或通过在 CLI 服务器中按 j 打开它进行调试,现在支持多个模拟器和设备。
React Native DevTools 与我们之前的调试选项有着根本性的不同,包括与 0.73 中首次发布的实验性调试器体验不同。它切换到一个我们在过去一年中重建的新后端调试堆栈。这意味着与以前的工具的兼容性已改变,您也应该期待更可靠的端到端体验。我们打算在此新堆栈的基础上构建,以便未来可靠地实现更多功能,例如性能和网络面板。
逐步淘汰 Metro 中的日志
在我们的下一个版本中,我们将删除 Metro 中转发的日志,以与现代浏览器工具对齐,并删除旧的调试集成。取而代之的是,使用 React Native DevTools 功能齐全的控制台面板进行日志记录。有关更多信息,请参阅我们的常见问题。
链接
更快的 Metro 解析
我们已经对 Metro 的解析器(负责从导入路径查找模块的组件)进行了多项性能改进,使其速度提高了约 15 倍。这提高了 Metro 的整体性能,特别是对于热构建,我们看到速度提高了约 4 倍。
Box Shadow 和 Filter 样式属性
我们在 0.76 中添加了两个仅适用于新架构的样式属性 — `boxShadow` 和 `filter`。这两个属性都存在于 Web 上,团队尽可能地遵循规范,以便这些属性可预测、熟悉,并且最终更容易采用(请参阅限制和规范偏差部分中的例外)。因此,您可以查阅 Web 文档以完全理解它们的工作原理,但下面注明了一些重要的差异。
boxShadow
boxShadow 为元素添加阴影,能够控制阴影的位置、颜色、大小和模糊度。查看 MDN 文档以获取每个参数的完整概述,以及一个供您亲自尝试的 JSFiddle。下面是一些您可以创建的阴影示例。

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)’} 将产生相同的盒阴影。
以前的阴影功能存在一些缺点,现在已由 boxShadow 解决:
限制和规范偏差
- 默认阴影颜色是黑色,而不是父元素的颜色
- Android 上的普通阴影仅在 Android 9+ 上支持
- Android 上的内嵌阴影仅在 Android 10+ 上支持
filter
filter 为元素添加某些图形滤镜。有各种颜色滤镜,可让您修改亮度、饱和度、色相等,以及非颜色滤镜,可让您添加模糊和阴影。请查看 MDN 文档以获取每个单独滤镜函数的完整概述,以及一个供您亲自尝试的 fiddle。下面是一张应用了各种滤镜的热狗图片。

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仅支持亮度 (brightness) 和不透明度 (opacity) - iOS
filter不会应用于阴影、轮廓或元素边界之外的任何其他图形元素 - Android 的
blur和drop-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”,
},
由于原生库合并,安卓应用体积缩小了约 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 所必需的,并且已包含在升级助手中。
库作者不会受此更改影响,除非您有自定义 C++ 代码。
有关此更改的技术深入探讨以及对库作者的建议,您可以在专门的帖子中阅读更多内容。
iOS 和 Android 最低 SDK 要求更新
我们已更新了最低平台和 SDK 版本
此更改已在 0.75 发布时在今年早些时候宣布。有关更多背景信息,请参阅 Android 和 iOS 的专门帖子。
其他重大变更
- 动画
- 停止在循环动画中向 React 发送状态更新。这导致了循环动画不必要的重新渲染。
- 开发者工具
- 移除新架构下 Inspector 面板的性能和网络选项卡。(RFC)
- 文本引擎
- 在 TextLayoutManager 中始终使用 AttributedStringBox 而不是 AttributedString
Android
- 渲染
- View 的背景不再直接是
ReactViewBackgroundDrawable或CSSBackgroundDrawable
- View 的背景不再直接是
iOS
- 涡轮模块
- 移除了用于自动链接纯 Cxx 模块的
RCT_EXPORT_CXX_MODULE_EXPERIMENTAL宏。
- 移除了用于自动链接纯 Cxx 模块的
致谢
React Native 0.76 包含来自 156 位贡献者的 超过 1070 次提交。感谢大家的辛勤工作!
感谢所有为本版本发布文章撰写文档的额外作者
- Joe Vilches 和 Nick Gerleman 的 box-shadow 和 filter 样式属性。
- Alex Hunt 的 React Native DevTools。
- Nicola Corti 的 Android 单一库发布。
升级到 0.76
请使用 React Native 升级助手来查看现有项目在 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 的最终停产更新。



