React Native 的新版别 0.70.0 总算发布了,本次 0.70 版别对架构进行了多项晋级调整,例如:

  • 针对 Codegen 进行了新的共同装备支撑
  • Hermes 成为了默许的引擎
  • Android 平台上完好的 CMake 支撑
  • 新架构文档更新

新架构的文档

自从 0.68 发布之后,在过去的几个月里官方一直在努力为文档的 new-architecture 部分添加更多的内容,现在的文档包括了迁移指南、示例教程等相关内容,而新架构首要包括有:

  • JavaScript Interface(JSI)
  • Fabric
  • Turbo Modules
  • CodeGen

假如你还不知道新架构有什么,欢迎查阅: React Native 的全新架构更新

Hermes 作为默许引擎

React Native 0.70 是第一个默许启用 Hermes 的版别,Hermes 是 Meta 的内部 JS 引擎。

从去年 10 月开发,官方就宣告开端准备让 Hermes 成为一切 React Native 运用的默许引擎

Hermes 是专为资源受限的设备而设计,并针对发动、运用巨细和内存耗费进行了优化,Hermes 和其他 JS 引擎之间的一个关键区别是:它能够提早将 JavaScript 源代码编译为字节码

这个预编译的字节码捆绑在二进制文件中,使解说器不必在运用发动期间执行这个贵重的步骤。

而今天,Hermes 将作为默许引擎随 React Native 0.70 一同发布,这意味着从 v0.70 开端的一切新项目都将默许启用 Hermes。

这儿请留意,开发者其实无需等候 React Native 0.70 才运用 Hermes ,完全能够自行启用该才能: reactnative.dev/docs/hermes… 。

别的,从 2020 年开端 React Native 就在硬件上针对 Android 和 iOS 运转了相关的基准测试,首要是经过 Mattermost 测量了三个不同指标:TTI、二进制巨细和内存耗费。

Android

React Native 0.70 版本发布,Hermes 终于成为默认 Engine
React Native 0.70 版本发布,Hermes 终于成为默认 Engine

iOS

React Native 0.70 版本发布,Hermes 终于成为默认 Engine

TTI 比照

集成问题

本次发布还处理了一个长期存在的问题,该问题首要是兼容性相关,在发布新的 React Native 版别时经常呈现:React Native 经过 CocoaPods 和 npm 分发的预构建二进制文件依赖于 Hermes,这使得 API 或 ABI 会呈现不兼容

为了处理这个问题,从 React Native 0.69 开端,Hermes 会与 React Native 的每个版别一同构建,这样做确保了 Hermes 与每个版别的 React Native 完全兼容。

进行中

跟着 Hermes 不断发展 ,现在官方的目标是:改善开发人员体会,并确保没有人因为 Hermes 对 JavaScript 支撑不够完好而防止运用 Hermes,更具体地说:

  • 开发人员能够直接从 Chrome devtools UI 运转采样分析器。
  • 添加对 BigInt 的支撑,这是来自社区的长期恳求,它可能会阻止一些开发人员运用 Hermes,因为它不能被 polyfill。
  • 添加对 WeakRef 的支撑。

共同的 Codegen 装备

在 0.70 中,官方引入了一种共同的方法来界说 iOS 和 Android 的 Codegen 标准,以前开发者必须将 Android 装备放在独自的 build.gradle 文件中,现在你能够直接在 package.json 中界说它:

  "codegenConfig": {
    "name": "CustomAnimationView",
    "type": "components",
    "jsSrcsDir": "./src",
    "android": {
      "javaPackageName": "com.custom.animation"
    }
  }

这一改进为库保护者将他们的代码库迁移到新架构供给了更共同的体会

libraries 新架构

运用 0.70之后,New Architecture 上的用户无需在其 Android.mk 或 CMake 文件上进行任何额定装备即可主动链接库

Autolinking 是 React Native 开发体会的关键才能之一,它允许开发者运用命令包括外部库 yarn add,而无需处理 CocoaPods 或 Gradle 设置。

新架构要求开发者调整 auto-linking 功能,以支撑运用 Codegen 并将 native 库代码公开给运用开发人员。

虽然 auto-linking 之前在 iOS 上的 New Architecture 库运转杰出,但对 Android 却不是这样,而在 0.70 中官方缩小了这一差距,开发者现在能够持续经过 yarn add 将库添加到项目中。

Android Full CMake

从 0.70 开端,用户能够直接运用 CMake 来装备他们的 Native 构建,虽然咱们不期望开发者直接编写 C++ 代码,但仍然需要供给原生编译的进口。

从现在开端,开发者能够运用 CMakeLists.txt 文件而不是 Android.mk 文件来处理项目中与 Android/Native 相关的任何内容,本次更改使得新架构上的运用和库用户都会变得更方便,因为:

  • 运用中创立的 CMake 文件要小得多(只需要 3 行代码,而 Android.mk 文件需要 50 多行代码 。
  • Codegen 现在会同时生成 Android.mkCMakeLists.txt,因此假如库运用咱们为新架构库供给的默许设置,会主动完结适配。
  • 上面提到的主动链接将适用于 CMake 和 Android.mk 文件。
  • 尽管现在能够自由运用 Android.mk 和 CMake 文件,但未来推荐的处理方案还是 CMake 文件(因为 CMake 有更好的文档、工具和生态系统)。

0.70 的亮点

如上所述,此版别中还有一些重要的改进,包括:

  • Catalyst 支撑实时修正,在 Podfile 中设置 mac_catalyst_enabledtrue 能够启用(有关详细信息可见 upgrade-helper )。
  • 将 Metro 晋级到 0.72.0,这将启用新的 React JSX 转换:reactjs.org/blog/2020/0…。
  • reactnativeutilsjni 因为它是从相同的 reactnativejni 源构建的,因此删去它能够节省约 220 KB 左右空间。(github.com/facebook/re…

breaking-changes

还有一些 breaking-changes 变化:

  • 从 react-native 包中删去了 jest/preprocessor ( 0301cb285b by @motiz88 )
  • 删去非标准Promise.prototype.done(@motiz88的018d5cf985 )

另请留意,Metro 的版别已提升至 0.72,其中包括 5 个重大更改:

  • [Breaking] Enable React 17 new JSX transform (#848 by @danilobuerger)
  • ‌[Breaking] Add watcher.additionalExts option, enable inclusion of .cjs and .mjs files by default (c1c6d9c)
  • [Breaking] .json files will no longer be implicitly resolved if removed from resolver.sourceExts (a3dc30a)
  • [Breaking] With a default config, any .jsx files will now be resolved before .json, .ts, .tsx (1b47931)
  • [Breaking] Enable strict CLI validation when metro is passed an invalid subcommand or argument (19c4f7e)
  • [Feature] Add start alias for serve CLI command (19c4f7e)

晋级

此本 0.70 还晋级了一些依赖项:

  • 将 RN CLI 晋级到 v9.0.0
  • 将 Android Gradle 插件晋级到 7.2.1
  • 将 Gradle 晋级到 7.5.1
  • Bump RCT-Folly 到 2021-07-22
  • 将 Metro 提升至 0.72
  • 将 SoLoader 提升至 0.10.4

更多详细信息能够在 changelog 中查看。

最后

假如你还没晋级到 Hermes 或者 0.70 版别, 能够参考 React Native 的全新架构更新 全面了解下有什么特性,相信从 0.70 开端 RN 的整体稳定性和迭代会更加顺利,感觉这也是现在的干流,为了更好的体会和保护:RN 的 JS 引擎换成自研的 Hermes ,Flutter 正从通用 Skia 切换全新自研 impeller

就是不知道 RN 什么时候发布 1.0 。

参考链接

  • reactnative.dev/blog/2022/0…
  • reactnative.dev/blog/2022/0…
  • github.com/facebook/me…