数据封送
需要进行架构审查:本文档旨在支持针对 React Native 的“旧”或“遗留”架构的开发。它可能适用也可能不适用于新架构的开发,需要审查并可能需要更新。有关 React Native Windows 中 React Native 架构的信息,请参阅新旧架构。
有关 Windows 上原生开发的最新信息,请参阅原生平台:概述。
本文档和底层平台代码正在开发中。
概述
React Native 应用程序由多个组件和层组成,其中一些边界需要进行数据封送处理。本文档旨在介绍 React Native Windows 中数据封送处理的实现方式。
以下是最小 React Native Windows UWP 应用程序的布局
第一个边界可能是最明显的——JavaScript VM(在本例中为 Chakra)与 React Native Windows 的原生代码之间的边界,其中 JavaScript VM 托管运行应用程序的捆绑 JS 代码。跨越此边界,JS 对象会作为 folly::dynamic
对象封送至原生代码中,反之亦然。
所有这些都发生在 Microsoft.ReactNative
(React Native Windows 代码的编译库)中。在该库中,C++ folly::dynamic 对象是处理 JS 数据的主要机制。
现在,以下是使用外部原生模块的 React Native Windows UWP 应用程序的布局
外部原生模块指的是在独立的 Windows 运行时组件库中定义的模块,以及在主机 UWP 应用程序中定义的模块。
由于我们正在处理 UWP 应用程序,并且需要支持用 C# 和 C++/WinRT 编写的外部原生模块,因此 Microsoft.ReactNative
库是一个 Windows 运行时组件。这意味着它有一个 WinRT ABI 接口,因此,外部原生模块通过 WinRT 边界与 React Native Windows 交互。
在设计 ABI 接口方面投入了大量工作,使其尽可能快速且具有未来可扩展性,尤其是在 JS 数据的封送处理方面。
因此,在 JS 对象内部封送为 folly::dynamic
对象后,我们必须进一步将这些对象跨 WinRT ABI 边界封送。我们通过高性能的 IJSValueReader
和 IJSValueWriter
接口以串行方式完成此操作。这些接口使我们能够以无堆分配、快速、最小化和未来可扩展的方式跨 WinRT 边界(反)序列化数据。
虽然您可以手动使用 IJSValueReader
和 IJSValueWriter
接口,但我们也提供了两个共享项目,C# 的 Microsoft.ReactNative.SharedManaged
和 C++/WinRT 的 Microsoft.ReactNative.Cxx
,它们提供了一个强大的基础架构,用于自动封送简单和复杂的原生静态类型。
端到端数据流如下所示
示例
有关将数据自动封送为静态和动态本机类型的示例,请参阅 microsoft/react-native-windows-samples
中的本机模块示例 中的 DataMarshalingExamples
模块。提供了 C# 和 C++/WinRT 的实现。
有关使用动态 JSValue
类型的更多示例,请参见使用 JSValue
。
有关使用 IJSValueReader
和 IJSValueWriter
手动封送数据的示例,请参见原生模块(高级)。