跳至主内容

React Native 0.76 - 默认启用新架构、React Native DevTools 及更多更新

· 1 分钟阅读
Blake Friedman
Blake Friedman
Software Engineer @ Meta
Riccardo Cipolleschi
Riccardo Cipolleschi
Software Engineer @ Meta
Frank Calise
Frank Calise
Software Engineer @ Infinite Red
Gabriel Donadel Dall'Agnol
Gabriel Donadel Dall'Agnol
Software Engineer @ Expo
非官方测试版翻译

本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →

今天我们激动地宣布 React Native 0.76 正式发布!

这是 React Native 发展的重要里程碑——我们不仅默认启用了新架构(New Architecture),还推出了 React Native DevTools。这凝聚了我们团队六年的不懈努力,以及开发者社区的大力支持。

重点更新

重大变更

重点详解

React Native 新架构默认启用

自 React Native 0.76 起,新架构将在新项目中默认启用。新架构是对 React Native 内部机制的重构,旨在帮助开发者用 React 构建高质量的原生应用。

我们在此郑重宣布:新架构已具备生产环境使用条件。

这是 React Native 演进史上的里程碑,欢迎阅读专题博客了解新架构的详细内容及其对未来发展的影响:新架构正式发布

React Native DevTools

React Native DevTools 前端界面

我们正式发布 React Native DevTools 的首个稳定版本——全新的默认调试解决方案。

我们致力于提供跨平台调试 React 应用的可靠、易用、统一工具链。React Native DevTools 践行这一理念,提供与浏览器工具深度整合的调试体验,核心特性包括:

  • 熟悉的 Web 开发工具链 - 基于 Chrome DevTools 的全功能调试器,支持断点、变量监控、单步调试、调用栈检查和强大的 JavaScript 控制台。这些核心功能现可稳定运行并支持热重载。

  • 增强的集成式 React DevTools - 内置组件检查器(Components Inspector)和分析器(Profiler)无缝协作,组件高亮更快速可靠。

  • 用户体验优化 - 新增「调试暂停中」(Paused in Debugger)覆盖层,清晰提示应用暂停状态;LogBox 警告信息将以摘要形式显示,并在 DevTools 连接时自动隐藏。

  • 修复重连行为 — JavaScript 断点现在能在重载、断开重连时可靠工作。DevTools 甚至能在原生重建后重新连接到同一应用。

  • 即时启动 — React Native DevTools 默认零配置即可使用。通过应用内开发菜单或 j 快捷键打开,CLI 服务器现已支持多模拟器/设备同时调试。

React Native DevTools 与以往调试方案有根本区别,也与 0.73 版首次推出的实验性调试器不同。它采用我们耗时一年重建的全新后端调试架构,这意味着与旧版工具的兼容性有所变化,但您将获得端到端更可靠的体验。我们将基于此架构持续构建新功能,例如性能面板和网络面板。

逐步淘汰 Metro 日志

下个版本中,我们将移除 Metro 转发的日志以对齐现代浏览器工具链,并淘汰旧版调试集成。请改用 React Native DevTools 功能完备的控制台面板进行日志记录。详见常见问题解答

相关链接

更快的 Metro 解析

我们对 Metro 解析器进行了多项性能优化,这个负责从导入路径查找模块的组件速度提升约 15 倍。这显著提升了 Metro 整体性能,其中热构建速度提升约 4 倍。

Box Shadow 与 Filter 样式属性

0.76 版新增两个仅限新架构的样式属性:boxShadowfilter。这两个属性在网页开发中已存在,团队尽可能遵循规范以保持属性行为可预测、易上手(例外情况请见限制与规范偏差说明)。因此您可查阅网页文档了解完整用法,但需注意下文指出的重要差异。

boxShadow

boxShadow 为元素添加阴影,可控制阴影位置、颜色、尺寸和模糊度。查看 MDN 文档了解各参数详情及实时调试示例。下图展示部分阴影效果:

新增 boxShadow 样式属性

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 平台不可用

  • 不支持 inset(内阴影效果)

  • 不支持 spread(阴影扩散距离)

  • 在无背景色的 View 组件上无法生效

  • 作为独立属性存在,因此无法复用 Web 语法

限制与规范差异

  • 默认阴影颜色为黑色(而非继承父元素颜色)

  • Android 普通阴影需 Android 9+ 支持

  • Android 内阴影需 Android 10+ 支持

filter

filter 可为元素添加图形滤镜效果,包含调整亮度、饱和度和色调等色彩滤镜,以及添加模糊和阴影的非色彩滤镜。完整滤镜函数列表请参考 MDN 文档,您可通过交互示例亲自体验。下图展示了应用多种滤镜的热狗图片效果。

Filters demonstration
From left to right: no filter, saturate filter, blur filter, invert filter

boxShadow 类似,filter 属性既支持字符串格式(模拟 CSS 语法),也支持由可嵌入变量的 JS 对象构成的数组。例如,字符串 ‘saturate(0.5) grayscale(0.25)’ 与数组 [{saturate: 0.5}, {grayscale: 0.25}] 会产生相同的滤镜效果。

filter 中的 dropShadow 值与 boxShadow 存在细微差异:最核心的区别在于 dropShadow 采用 Alpha 遮罩机制——仅当像素的 Alpha 分量非零时才会投射阴影。而 boxShadow 则会在元素的边框盒(border box)周围投射阴影,即使元素内部为空。此外,dropShadow 不支持扩散距离参数,也无法设置为内阴影(inset)效果。

限制与规范差异

  • iOS filter 仅支持亮度和不透明度

  • iOS filter 不作用于元素边界外的阴影、轮廓等图形元素

  • Android 的 blurdrop-shadowAndroid 12+ 支持

  • filter 会隐式启用 overflow: hidden,因此具有 filter 的元素的子元素在定位超出父容器边界时将被裁剪

重大变更

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

正如我们在 0.75 版本中提到的,我们的愿景是让 React Native 成为框架无关的框架。因此,我们完成了移除 @react-native-community/cli 这一直接依赖项的工作。

解耦 React Native 与 CLI 能加速双方独立迭代进程,并明确划分项目职责边界。

若您的工作流依赖 CLI,请务必在 package.json显式添加依赖

//…
“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%),应用中位启动时间将减少约 15 毫秒(约 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 的专题文章。

其他破坏性变更

  • 动画(Animation)

    • 停止在循环动画中向 React 发送状态更新。这曾导致循环动画出现不必要的重新渲染。
  • 开发者工具(devtools):

    • 在新架构下移除检查器面板(Inspector Panel)的性能和网络标签页。(RFC
  • 文本引擎(text engine)

    • 在 TextLayoutManager 中始终使用 AttributedStringBox 替代 AttributedString

Android 平台变更

  • 渲染(rendering):
    • 视图背景不再直接使用 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 版本的最终终止支持更新。