原生模块 vs Turbo 模块
需要进行架构审查:本文档旨在支持针对 React Native 的“旧”或“遗留”架构的开发。它可能适用也可能不适用于新架构的开发,需要审查并可能需要更新。有关 React Native Windows 中 React Native 架构的信息,请参阅新旧架构。
有关 Windows 上原生开发的最新信息,请参阅原生平台:概述。
如果您使用过 React Native,您可能熟悉原生模块的概念,它允许 JavaScript 和平台原生代码通过 React Native 的“桥接器”进行通信,该桥接器通过 JSON 处理跨平台序列化。
TurboModules 是原生模块的下一个迭代,它提供了一些额外的优势,特别是这些模块使用 JSI(一种用于原生代码的 JavaScript 接口),这允许原生代码和 JavaScript 代码之间进行比桥接器更高效的通信。
如何迁移到 TurboModules
作为 TurboModules 运行的模块将从 TurboModuleRegistry.get('<modulename>')
而不是 NativeModules.<modulename>
在 JS 中可用。因此,您的 JavaScript 必须在切换之前进行更新。理想情况下,在您进行此操作时,您应该将模块切换为使用规范文件。这将使您的模块与 codegen 兼容。
注意:如果原生代码注册了原生模块,
TurboModuleRegistry
将回退到返回原生模块而不是 Turbo 模块。因此,您可以在更新原生代码之前更新 JavaScript。
从 0.71 版本开始,JS/TS 规范文件可以 codegen C++ 规范文件,这些文件可以验证原生实现是否与 JS 中的定义匹配。此外,模块现在可以通过简单地向 AddAttributedModules
调用添加一个额外的参数来作为 TurboModules 运行,而不是作为原生模块运行。
AddAttributedModules(packageBuilder, true);
或者,如果您通过调用 IReactPackageBuilder.AddModule
更手动地注册模块,则可以改为调用 IReactPackageBuilder.AddTurboModule
。
作为原生模块与 TurboModule 运行的其他区别
在 JS 中创建规范后,您应该会看到 JS 类型错误,表明常量应该使用 MyModule.getConstants().myconst
而不是 MyModule.myconst
进行访问。如果您未能更新对 myconst
的访问,当模块作为原生模块运行时,该字段将继续工作,因为原生模块将所有常量提升为模块上的字段。TurboModules 不会发生此行为,因此 myconst
字段将未定义。使用 getConstants().myconst
的调用将同时适用于原生模块和 TurboModules。
网络调试行为
使用远程调试/网络调试时,TurboModules 无法运行。React-Native-Windows 将尝试在这种模式下将 TurboModule 作为原生模块运行,但如果模块直接使用 JSI,则该回退可能无效。