在 React Native 中使用 C++ 或 JSI 桥接模块有什么区别?

Enz*_*ano 13 c++ react-native react-native-bridge react-native-jsi

在 React Native 中,可以通过多种方式从 Android 和 iOS 引入本机功能。我一直认为所有可能的方式都受到 Java/Kotlin 和 Objective-C/Swift 等平台相关语言的限制。然而,我注意到即使从 C++ 中仍然可以桥接本机功能(不使用 JSI)。具体来说,我注意到从react-native-builder-bob可以轻松启动一个使用C++ 桥接本机模块的包。

此时我想知道,如果已经可以将 JS 与 C++ 集成,那么 JSI 会引入什么新内容呢?为什么它应该比当前解决方案带来性能改进?

我提前为我的知识匮乏表示歉意,但我真的找不到答案。

iUr*_*rii 25

目前React Native BridgeNative 和 JS 之间的架构是异步工作的,并且仅以 JSON 格式传输数据。

它会产生以下问题:

异步调用

  • 许多线程并跨越它们:JS、Shadow、Main、Native...
  • JS 和主线程不直接通信(UI 渲染速度慢)

JSON

  • JS 和 Native 线程之间没有数据共享
  • JSON 序列化导致数据传输缓慢(瓶颈)

您可以桥接任何本机代码 Java/Konlin、ObjC/Swift、C++ 等,但您总是会遇到上述问题。

React Native JSI为 JS 运行时引擎提供 API,并直接向 JS 公开本机函数和对象 - 根本没有桥梁。

它具有以下优点:

  • 从 JS 线程到 Native 的同步调用,反之亦然
  • 使用直接调用 UI 主线程进行快速渲染
  • 线程间数据共享

您必须仅使用 C++ 才能使用 JSI,因为 JS 运行时具有 C++ API,但可以在 JSI 和现有 Java 或 Swift 代码之间创建 C++ 层。

JSI 是未来新的 React Native 架构的基础,其中包括:Fabric、TurboModules、CodeGen。了解更多:https ://github.com/react-native-community/discussions-and-proposals/issues/91