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

What's the difference between bridging a module with C++ or with JSI in React Native?

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

在这一点上我想知道,但是如果已经可以将 JS 与 C++ 集成,那么 JSI 引入了什么是新的?为什么它应该比当前解决方案带来性能改进?

对于我的知识匮乏,我提前表示歉意,但我确实找不到答案。

Native 和 JS 之间的当前 React Native Bridge 架构异步工作并且仅在 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