React Native 新、旧架构集成原生模块方式

React Native新旧架构支持信息

ReactNative版本 最低支持Android版本 最低支持Ios版本 支持架构 备注
0.75及以下 sdk23(安卓6.0及以下) Ios 13.4 旧架构
0.76及以上 sdk24(安卓7.0及以上) Ios 15.4 新架构 到现在写文章的0.82版本

新、旧架构性能对比的文章挺多的就不多介绍了,性能优先肯定选新。

新架构集成原生模块

1、Expo原生模块

1.1 生成Expo方式的 app原生模块,运行下面命令,会在项目根目录下创建如下图所示目录:

bash 复制代码
# 创建Expo方式的 app原生模块
npx create-expo-module@latest --local

1.2 安装Expo模块

默认的Expo项目是没有安卓和Ios目录的,此时需要运行下面命令:

bash 复制代码
# 生成ios和安卓目录
npx expo prebuild --clean

如果已经prebuild出安卓和ios目录的,ios需要下面命令安装到pods内:

bash 复制代码
npx pod-install

1.3 此时ios打开expoapp.xcworkspace可以看到Development Pods内安装进来的模块,可以在这里进行修改,运行到手机或模拟器

2、社区cli搭建的项目方式

集成模块方式有几种,比如:Turbo ModuleNitro Module,可以使用官网推荐的社区模块模版,性能最好的是Nitro Module方式。

bash 复制代码
# 创建最新的模块lib
npx create-react-native-library@latest react-native-awesome-module

旧架构

1、创建旧架构的原生模块,选择 Legacy Native module

bash 复制代码
# 创建旧架构的模块lib,选择 `Legacy Native module `
npx create-react-native-library@0.49.8 test-mod

创建完成以后,会在项目根目录创建一个modules/你的模块目录,ios同上面Expo安装模块步骤一样。

2、旧架构如果想偷懒,甚至可以直接在AndroidIos目录内,直接创建对应的原生模块代码,暴露出来给RN使用,新时代了 原生模块代码可以使用AI生成,这样就不需要使用create-react-native-library库来创建模块了,下面是示例代码

ts 复制代码
import { NativeModules, Platform } from 'react-native';

const LINKING_ERROR =
  `The package 'TestNative' doesn't seem to be linked. Make sure: \n\n` +
  Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) +
  '- You rebuilt the app after installing the package\n' +
  '- You are not using Expo Go\n';

// 定义设备信息接口
export interface DeviceInfo {
  model: string;
  systemVersion: string;
  name: string;
  systemName: string;
}

// 定义原生模块接口
interface ITestNative {
  hello(input: string): Promise<string>;
  multiply(a: number, b: number): Promise<number>;
  getDeviceInfo(): DeviceInfo;
  delayedMessage(message: string, delay: number): Promise<string>;
  getCurrentTimestamp(): Promise<number>;
  formatDate(timestamp: number, format?: string): Promise<string>;
}

const TestNative: ITestNative = NativeModules.TestNative
  ? NativeModules.TestNative
  : new Proxy(
      {},
      {
        get() {
          throw new Error(LINKING_ERROR);
        },
      }
    ) as ITestNative;

/**
 * 调用iOS原生方法,返回问候语
 * @param input 输入字符串
 * @returns Promise<string> 返回格式化的问候语
 */
export function hello(input: string): Promise<string> {
  return TestNative.hello(input);
}

/**
 * 两个数字相乘
 * @param a 第一个数字
 * @param b 第二个数字
 * @returns Promise<number> 返回相乘结果
 */
export function multiply(a: number, b: number): Promise<number> {
  return TestNative.multiply(a, b);
}

/**
 * 获取设备信息(同步方法)
 * @returns 设备信息对象
 */
export function getDeviceInfo(): DeviceInfo {
  return TestNative.getDeviceInfo();
}

/**
 * 延迟发送消息
 * @param message 消息内容
 * @param delay 延迟时间(秒)
 * @returns Promise<string> 返回延迟后的消息
 */
export function delayedMessage(message: string, delay: number): Promise<string> {
  return TestNative.delayedMessage(message, delay);
}

/**
 * 获取当前时间戳
 * @returns Promise<number> 返回Unix时间戳
 */
export function getCurrentTimestamp(): Promise<number> {
  return TestNative.getCurrentTimestamp();
}

/**
 * 格式化日期
 * @param timestamp Unix时间戳
 * @param format 日期格式(可选,默认:'yyyy-MM-dd HH:mm:ss')
 * @returns Promise<string> 返回格式化后的日期字符串
 * 
 * @example
 * ```typescript
 * // 使用默认格式
 * const date1 = await formatDate(Date.now() / 1000);
 * // 输出: "2024-11-14 15:30:45"
 * 
 * // 使用自定义格式
 * const date2 = await formatDate(Date.now() / 1000, 'MM/dd/yyyy');
 * // 输出: "11/14/2024"
 * ```
 */
export function formatDate(timestamp: number, format?: string): Promise<string> {
  return TestNative.formatDate(timestamp, format);
}

// 导出原生模块供高级用户直接使用
export { TestNative };

相关文档链接

相关推荐
1024小神2 小时前
swift中VNDetectBarcodesRequest VNImageRequestHandler 是什么?有什么作用?VN是什么意思
前端
加个鸡腿儿2 小时前
React项目实战 | 修复Table可展开行,点击一个全部展开
前端·react.js·编程语言
在泡泡里2 小时前
前端规范【五】biomejs自动化工具-ultracite
前端
_野猪佩奇_牛马版2 小时前
node/py实现 qwen多轮对话
前端
残冬醉离殇2 小时前
函数柯里化(curry)是什么?🤔
前端·javascript
1024小神2 小时前
在 Vision 框架中,request.results 是什么类型的数据
前端
亮子AI2 小时前
【CSS】cursor: auto, default, none 有什么区别?
前端·css
晴殇i2 小时前
代码隔离革命:用 JavaScript Realm 安全运行不可信代码
前端·javascript
Mr.Jessy2 小时前
Web APIs 学习第六天:BOM、location对象与本地存储
开发语言·前端·javascript·学习·web api·bom