2. 关键参数说明

createWorkerRNInstanceConfig 是配置 Worker 线程的核心函数,其参数 rnInstanceName 可用于实现与主线程配置的一致性,以下是详细说明:

参数/函数 类型/作用 关键说明
createWorkerRNInstanceConfig 回调函数,接收 rnInstanceName 并返回 WorkerRNInstanceConfig 对象 用于动态生成 Worker 线程配置,rnInstanceName 与主线程对应的 RN 实例名称一致,可通过该参数实现“按实例差异化配置”。
rnInstanceName string,表示当前 Worker 关联的 RN 实例名称 1. 与主线程中 RNInstanceConfig 对应的实例名一致(如 “main”、“moduleA” 等);
2. 可用于区分多实例场景,确保 Worker 配置与主线程对应实例的配置逻辑一致。
thirdPartyPackagesFactory (ctx: RNPackageContext) => RNPackage[] 必传,注册 React Native 自定义组件/模块的工厂函数,Worker 线程需通过此加载第三方 RN 能力。
httpClient HttpClient(可选) 仅 Worker 线程生效,可通过 rnInstanceName 生成与主线程对应实例匹配的网络配置(如不同实例使用不同拦截器)。
caPathProvider (url: string) => string(可选) 仅 Worker 线程生效,可通过 rnInstanceName 生成与主线程对应实例匹配的证书规则(如不同实例使用不同证书路径)。
3. 利用 rnInstanceName 实现线程配置一致性

在多实例场景中(如应用包含多个 RN 实例),rnInstanceName 是保证 Worker 线程与主线程配置逻辑一致的关键,具体价值如下:

场景:多实例应用的差异化配置

假设主线程中存在两个 RN 实例:

  • 实例1:rnInstanceName = "payment"(支付模块,需严格的证书校验)
  • 实例2:rnInstanceName = "news"(新闻模块,使用默认CA证书)

通过 rnInstanceName 可在 Worker 中实现对应配置:

createWorkerRNInstanceConfig: (rnInstanceName) => {
  return { 
    thirdPartyPackagesFactory: createRNPackages,
    // 支付实例使用专用证书,新闻实例使用默认CA证书
    caPathProvider: (url) => {
      if (rnInstanceName === "payment") {
        return "/data/haps/payment_cert.cer"; // 与主线程支付实例配置一致
      }
      return ""; // 新闻实例使用默认,与主线程一致
    },
    // 支付实例添加加密拦截器,新闻实例无需加密
    httpClient: rnInstanceName === "payment" ? paymentHttpClient : defaultHttpClient
  }
}
核心价值
  • 配置对齐:通过 rnInstanceName 确保 Worker 线程的 httpClientcaPathProvider 与主线程对应实例的配置逻辑一致(如相同的实例名使用相同的证书规则)。
  • 多实例隔离:在多 RN 实例场景中,避免不同实例的网络配置相互干扰(如支付实例和普通实例的证书规则严格区分)。
  • 逻辑复用:可基于 rnInstanceName 封装通用配置工厂函数,同时服务于主线程和 Worker 线程,减少代码冗余。
4. 线程间配置独立性说明(核心)

HttpClientcaPathProvider 的配置在 主线程Worker 线程 中完全独立,但 rnInstanceName 可确保两者的配置逻辑一致

配置项 主线程配置位置 Worker 线程配置位置 关键规则
HttpClient RNInstanceConfig(按实例名配置) WorkerRNInstanceConfig(通过 rnInstanceName 匹配配置) 1. 配置内容独立,但可通过 rnInstanceName 保证“相同实例名使用相同逻辑”;
2. Worker 仅使用自身配置,与主线程无依赖。
caPathProvider RNInstanceConfig(按实例名配置) WorkerRNInstanceConfig(通过 rnInstanceName 匹配配置) 1. 证书规则独立,但可通过 rnInstanceName 保证“相同实例名使用相同规则”;
2. Worker 仅使用自身配置,与主线程无依赖。

通过 rnInstanceName 实现的差异化配置,既能保证 Worker 线程与主线程的逻辑一致性,又能维持线程间的配置独立性,是多实例场景下的最佳实践。

使用TurboModule

参照 环境搭建 文档的方法生成 bundle 后,即可在您的 App 中使用 TurboModule 了,下面是一个使用的例子:

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 *
 * @format
 * @flow strict-local
 */
import React from 'react';
import {useState} from 'react';
import type {Node} from 'react';
import {
  SafeAreaView,
  StatusBar,
  Text,
  Button,
} from 'react-native';
import { RTNCalculator } from 'rtn-calculator';

const App: () => Node = () => {
  const [result, setResult] = useState<number | null>(null);
  return (
    <SafeAreaView>
      <StatusBar barStyle={'dark-content'} />
      <Text style={{marginLeft: 20, marginTop: 20}}>
        3+7={result ?? '??'}
      </Text>
      <Button
        title="Compute"
        onPress={async () => {
          const value = await RTNCalculator.add(3, 7);
          setResult(value);
        }}
      />
    </SafeAreaView>
  );
};
export default App;

在使用React Native进行跨平台移动应用开发时,确保线程配置的一致性对于维护应用的性能和稳定性至关重要。rnInstanceName 是React Native中的一个特性,它可以帮助开发者在多线程环境中追踪和优化应用的性能。通过为不同的组件或操作指定不同的实例名称,开发者可以更好地理解应用的资源使用情况,尤其是在涉及到多线程操作时。

  1. 理解rnInstanceName

rnInstanceName 主要用于在JavaScript中为React Native的桥接调用(例如调用原生模块的方法)指定一个名称。这有助于在React Native的开发者菜单(Developer Menu)中的Performance Monitor中更容易地识别和监控这些调用。这对于性能分析和问题诊断特别有用。

  1. 如何使用rnInstanceName

a. 在原生模块中设置

如果你在原生模块中(例如在Objective-C或Java中)调用JavaScript代码,你可以使用rnInstanceName来标识这个调用。例如,在Objective-C中:

[RCTBridge.currentBridge.moduleForClass:[RCTEventEmitter class] invokeMethod:@"_registerForBridgeNotifications" withObject:@[self]];

你可以这样设置一个特定的名称:

[RCTBridge.currentBridge.moduleForClass:[RCTEventEmitter class] invokeMethod:@"_registerForBridgeNotifications" withObject:@[self] withInstanceName:@"CustomModuleName"];

b. 在JavaScript中调用原生模块

在JavaScript中,当你调用原生模块的方法时,可以通过设置rnInstanceName来帮助追踪:

NativeModules.MyModule.myMethod(param, ErrorUtils.setGlobalHandler(() => {
  console.warn('Error in MyModule');
}));

你可以通过包装调用并传递一个额外的参数来设置rnInstanceName

NativeModules.MyModule.myMethod(param, { rnInstanceName: 'CustomMethodName' }, ErrorUtils.setGlobalHandler(() => {
  console.warn('Error in MyModule');
}));
  1. 线程配置一致性

要确保线程配置的一致性,你可以:

  • 明确指定线程:在原生模块的实现中,明确指定哪些操作应该在哪个线程上执行。例如,使用GCD(Grand Central Dispatch)在iOS中或使用HandlerThread在Android中。

  • 使用rnInstanceName监控:通过为关键操作设置唯一的rnInstanceName,你可以在开发者菜单的Performance Monitor中看到这些操作的执行情况,从而确保它们按预期在不同的线程上运行。

  • 测试和验证:使用React Native的开发者菜单中的Performance Monitor工具来测试和验证你的线程配置。确保关键操作不会因为错误的线程使用而导致性能瓶颈或错误。

  1. 结论

通过合理利用rnInstanceName来标识和监控你的React Native应用中的关键操作,你可以更好地管理和优化多线程环境下的应用性能。确保每个操作都在正确的线程上执行,这对于维护应用的响应性和稳定性至关重要。通过上述方法,你可以有效地实现线程配置的一致性,进而提升应用的性能和用户体验。


打包

接下来通过打包命令npn run harmony将reactNative的代码打包成为bundle,这样可以进行在开源鸿蒙OpenHarmony中进行使用。

在这里插入图片描述

打包之后再将打包后的鸿蒙OpenHarmony文件拷贝到鸿蒙的DevEco-Studio工程目录去:

在这里插入图片描述

最后运行效果图如下显示:

在这里插入图片描述

欢迎大家加入开源鸿蒙跨平台开发者社区,一起共建开源鸿蒙跨平台生态。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐