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 };

相关文档链接

相关推荐
名字还没想好☜1 小时前
Next.js App Router 数据获取:fetch 缓存、revalidate 与 dynamic 一次讲清
前端
成都渲染101云渲染66665 小时前
如何在3ds Max中实现更快、更高质量的渲染
前端·javascript·人工智能
闲猫7 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
自信的未来9 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
全栈前端老曹9 小时前
【MongoDB】安全与权限管理 —— 用户认证、角色权限、SSL 加密
前端·javascript·数据库·安全·mongodb·nosql·ssl
zhangxingchao10 小时前
AI大模型核心八:从 Agent Skill、长文档 RAG 到知识库更新与训练策略
前端·人工智能·后端
zhangxingchao11 小时前
AI大模型核心七:从 Workflow、RAG、记忆治理到幂等性
前端·人工智能·后端
gyx_这个杀手不太冷静11 小时前
Agent开发进阶指南(第 1 章):AI Agent 到底是什么?
前端·agent·ai编程
小小小小宇12 小时前
模型相关知识
前端
小小小小宇12 小时前
模型相关知识二
前端