跳到主要内容

React Native 0.76 - 默认启用新架构、React Native 开发者工具等

· 阅读需 12 分钟
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

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

这是 React Native 的一个重要里程碑,因为我们默认启用了新架构,并推出了 React Native 开发者工具。这是我们团队经过 6 年努力工作,再加上我们出色的开发者社区支持的成果。

亮点

重大变更

亮点

默认启用 React Native 新架构

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

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

这一变更是 React Native 发展的一个重要里程碑,欢迎您阅读专门的博客文章,了解新架构的内容以及它将如何塑造 React Native 的未来:新架构来了

React Native 开发者工具

React Native 开发者工具前端界面

我们发布了 React Native 开发者工具的第一个稳定版本,这是我们的默认调试体验。

我们希望您在所有平台调试 React 时使用的工具是可靠、熟悉、简单且统一的。React Native 开发者工具正是基于这些原则打造——与浏览器开发者工具保持一致,且深度集成到 React Native 中。主要功能包括:

  • 熟悉、网页风格的工具 — 基于 Chrome DevTools 的全功能调试器,支持可靠的断点、变量观察、逐步调试、调用堆栈查看以及强大的 JavaScript 控制台。这些核心功能现在在重新加载后仍能稳定工作。
  • 改进且集成的 React 开发者工具 — 内置的 React 组件检查器和性能分析工具运行更顺畅,组件高亮更快速可靠。
  • 优化的用户体验 — 新增 调试器暂停 覆盖层,清晰显示应用何时停在断点。LogBox 中的警告以摘要形式显示,附加开发者工具时则隐藏。
  • 修复的重连表现 — JavaScript 断点在重载和断开重连开发者工具后仍可稳定工作。开发者工具甚至能在原生重建后重新连接同一应用。
  • 即开即用 — React Native 开发者工具默认启用,无需配置。您可以从应用内开发者菜单打开,或通过 j 键在 CLI 服务器中调试,该服务器现支持多台模拟器和设备。

React Native 开发者工具与我们之前的调试选项根本不同,也不同于在 0.73 版本中首发的实验性调试器。它切换到了我们过去一年重构的新后端调试堆栈。这意味着与先前工具的兼容性发生了变化,同时您也将获得端到端更加可靠的体验。我们计划基于此新堆栈稳定实现更多功能,如性能和网络面板。

逐步移除 Metro 中的日志转发

在下一版本中,我们将移除 Metro 中的日志转发,以与现代浏览器工具对齐,并移除旧的调试集成。取而代之的是请使用 React Native 开发者工具中的全功能控制台面板查看日志。更多信息请参见我们的常见问题

相关链接

更快的 Metro 解析

我们对 Metro 的解析器做了多项性能优化,该组件负责根据导入路径查找模块,使解析速度提升了约 15 倍。这提升了 Metro 的整体性能,特别是在增量构建(warm build)时,速度提高了约 4 倍。

盒阴影和滤镜样式属性

我们在 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 改善:

  • 安卓不支持
  • 不能是 内阴影
  • 不支持 扩散距离
  • 如果 View 无背景色,阴影无效
  • 是独立属性,无法共享网页通用语法

限制与规范偏差

  • 默认阴影颜色为黑色,而非继承自父组件颜色
  • 安卓普通阴影仅支持 Android 9 及以上
  • 安卓内阴影仅支持 Android 10 及以上

filter

filter 为元素添加特定图形滤镜,包含可修改亮度、饱和度、色调等的颜色滤镜,以及可添加模糊和阴影等非颜色滤镜。请查看 MDN 文档 获取各滤镜函数的详细说明及试用示例。下图演示了不同滤镜的效果。

滤镜演示
从左到右:无滤镜,saturate 滤镜,blur 滤镜,invert 滤镜

boxShadow 类似,filter 可接受字符串(模仿 CSS 语法)或数组形式的 JS 对象。例如,字符串 'saturate(0.5) grayscale(0.25)' 与数组 [{saturate: 0.5}, {grayscale: 0.25}] 产生相同效果。

filter 中的 dropShadowboxShadow 略有不同。最大的区别在于 dropShadow 作为 alpha 掩模,只有当像素的 alpha 通道非零时才会投影阴影,而 boxShadow 会环绕元素边界盒,即便内部没有绘制任何内容。此外,dropShadow 不支持扩散距离参数且不能为内阴影。

限制与规范偏差

  • iOS 端 filter 仅支持亮度和不透明度
  • iOS 端 filter 不作用于阴影、轮廓或元素边界外的其他图形
  • 安卓端的 blurdrop-shadow 仅支持 Android 12 及以上
  • filter 隐含 overflow: hidden,因此使用该属性的元素,超出父边界的子元素会被裁剪

重大变更

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

此前在 0.75 版本中已说明,我们期望 React Native 框架无关。因此,我们完成了将 @react-native-community/cli 从 React Native 的直接依赖中移除的工作。

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%),应用启动中位时间减少约 15ms(约 8%)(来源)。

不过,这对应用和库开发者来说是一个破坏性变更。

应用开发者需要如下更新其 ApplicationonCreate 方法:

+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 的最低版本:

  • iOS — 从 13.4 升级至 15.1
  • Android — 从 SDK 23 升级至 SDK 24(Android 7)

该变更在年初 0.75 发布时已预告。更多背景请查阅专门文章:AndroidiOS

其他破坏性变更

  • 动画
    • 停止在循环动画中向 React 发送状态更新,避免了循环动画中的不必要重渲染。
  • 开发者工具
    • 针对新架构移除检查器面板的性能和网络标签页。(RFC)
  • 文本引擎
    • 在 TextLayoutManager 中始终使用 AttributedStringBox 替代 AttributedString。

Android

  • 渲染
    • 视图背景不再直接为 ReactViewBackgroundDrawableCSSBackgroundDrawable

iOS

  • TurboModule
    • 移除了用于自动链接纯 C++ 模块的 RCT_EXPORT_CXX_MODULE_EXPERIMENTAL 宏。

致谢

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

特别感谢在本次发布文档撰写中贡献内容的作者们:

升级到 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 的最终终止更新。