当前位置: 首页 > news >正文

React Native Module 注册流程

React Native 的Native Module 注册流程,指的是 JavaScript 层如何调用 Android/iOS 原生代码(Java/Kotlin/Obj-C/Swift)的过程。

整体流程:

JavaScript | | NativeModules.xxx ↓ React Native Bridge | ↓ Module Registry | ↓ Native Module Provider | ↓ Java/Kotlin/Obj-C Module实例 | ↓ 执行原生方法

一、Android Native Module 注册流程

以 Android 为例:

1. 创建 Native Module

例如:

public class MyModule extends ReactContextBaseJavaModule { public MyModule(ReactApplicationContext context) { super(context); } @Override public String getName() { return "MyModule"; } @ReactMethod public void hello(String name) { Log.d("RN", "Hello " + name); } }

关键:

getName()

决定 JS 调用名字:

NativeModules.MyModule

2. 创建 Module Package

RN 通过 Package 管理 Native Module。

public class MyPackage implements ReactPackage { @Override public List<NativeModule> createNativeModules( ReactApplicationContext context ) { List<NativeModule> modules = new ArrayList<>(); modules.add( new MyModule(context) ); return modules; } @Override public List<ViewManager> createViewManagers( ReactApplicationContext context ) { return Collections.emptyList(); } }

这里完成:

Package | └── MyModule实例

3. 注册 Package

加入:

MainApplication.java

里面:

@Override protected List<ReactPackage> getPackages() { List<ReactPackage> packages = new PackageList(this) .getPackages(); packages.add( new MyPackage() ); return packages; }

流程:

MainApplication | | ↓ ReactNativeHost | ↓ Package列表

4. React Native 初始化时加载

App启动:

ReactInstanceManager | | ↓ createReactContext() | ↓ NativeModuleRegistryBuilder | ↓ 遍历 ReactPackage | ↓ createNativeModules() | ↓ 注册 Module

最终形成:

NativeModuleRegistry { MyModule : MyModule实例 }

5. JS调用

JS:

import { NativeModules } from 'react-native'; NativeModules.MyModule.hello( "Tom" );

调用链:

JS | | Bridge | | NativeModuleRegistry | | MyModule.hello()

二、iOS Native Module 注册流程

类似。

1. 创建 Module

Objective-C:

@interface MyModule : NSObject < RCTBridgeModule > @end @implementation MyModule RCT_EXPORT_MODULE(); RCT_EXPORT_METHOD( hello:(NSString *)name ) { NSLog(@"Hello %@", name); } @end

关键:

RCT_EXPORT_MODULE()

自动注册。


2. Bridge扫描

启动:

RCTBridge | | ↓ Load Native Modules | | ↓ 扫描 RCT_EXPORT_MODULE | | ↓ 生成 Module Registry

三、新架构(New Architecture)

React Native 0.68+ 引入:

JSI Fabric TurboModule Codegen

流程变化:

旧架构:

JS | Bridge(JSON) | Native Module

新架构:

JS | JSI | TurboModule | C++ Binding | Native

TurboModule注册流程

例如:

JS定义:

interface Spec extends TurboModule { hello(name:string):void; }

Codegen生成:

NativeMyModuleSpec.java NativeMyModuleSpec.h

然后:

TurboModuleManager | | ↓ Module Provider | ↓ MyModule实例

四、完整生命周期总结

App启动 | | 初始化 ReactContext | | 加载 ReactPackage | | createNativeModules() | | 生成 NativeModuleRegistry | | Bridge/TurboModule 注册 | | JS NativeModules访问 | | 调用 Native 方法 | | 返回结果

五、关键类关系(Android)

ReactApplication | ↓ ReactNativeHost | ↓ ReactInstanceManager | ↓ ReactContext | ↓ NativeModuleRegistry | ↓ NativeModule

六、开发中常见问题

JS 找不到 Module

错误:

Native module cannot be null

检查:

  1. getName()是否一致

return "MyModule";

JS:

NativeModules.MyModule
  1. Package 是否加入:

packages.add(new MyPackage());
  1. 是否重新编译 Android:

npx react-native run-android

方法没暴露

必须:

@ReactMethod public void test() { }

否则 JS 看不到。


简单理解:

React Native Module 注册 = Native代码创建 Module → Package 提供 Module → Host 注册 Package → ReactContext启动时生成 Registry → JS通过Bridge/JSI找到并调用。

如果你是在做React Native 底层源码分析,重点应该看:
ReactInstanceManager → NativeModuleRegistryBuilder → ReactPackage → NativeModuleRegistry这一条链。

http://www.jsqmd.com/news/1297713/

相关文章:

  • 2026年7月台车挡头/四川台车高分子堵头板厂家推荐分析_四川皓德斯新材料科技有限公司 - 品牌宣传支持者
  • 17-定时任务(Cron)-设置自动化工作流
  • 完全二叉树判断:从BFS层序遍历到堆结构应用的算法精解
  • [具身智能-698]:步进电机的细分可以减小单个脉冲对应的旋转角度,提升角度分辨率;同时改变旋转一圈所需脉冲总数。脉冲输出频率不变时,细分越高,转动一圈所需时间越长;细分无法改变电机转动一圈的最小时间
  • Aspose Java 25.10破解实战:解决META-INF签名与Javassist版本冲突
  • DNS解析原理与BIND9服务器配置实战指南
  • 【数据集】老龄化数据集-世界/中国/省/市/县(2000-2025年)
  • 深度复盘:低频高决策场景下,推荐系统的冷启动与多目标优化实践
  • Cocos2d-x粒子编辑器:可视化创作与性能优化实战
  • SSH连不上?密钥指纹变更,可能是主机指纹变了!附解决方法
  • Logisim-Evolution 终极指南:从入门到FPGA硬件仿真的完整数字逻辑设计教程
  • C#小数格式化:保留两位小数并补零的完整指南
  • 和平精英地铁逃生拼装人偶第一弹:完整收集攻略与实战技巧
  • Stable Diffusion背后的数学真相(附PyTorch可复现推导链)
  • 2026 年新发布:上虞靠谱的无缝钢管切割加工供货厂家深度解析与优选指南,切出来的管件为何精度差?看完这个操作再也不踩坑了 - 行业推荐官[官方】--
  • Unserialize Again
  • 如何快速实现Atom编辑器中文汉化:完整简体中文菜单解决方案
  • Godot Orchestrator可视化脚本实战:构建灵活NPC对话系统
  • GPT-5.6 Sol性能优化实测:代码生成与内存管理效率提升指南
  • Replit模型选择器:云原生AI开发与开源模型快速部署指南
  • AI生成内容检测与降AI工具核心技术解析
  • 高效内网穿透实战:轻松实现本地服务公开
  • 遥感图像处理入门:从数据获取到分类实战
  • Webswing:零代码改造,将Swing桌面应用无缝迁移至浏览器
  • 游戏开发者日志解析:从武器设计到技术实现全流程
  • 如何快速配置LAN Share:跨平台局域网文件传输完整指南
  • SAP ABAP SELECT语法深度解析:从基础到HANA性能优化实战
  • 大功率步进电机驱动系统设计:从MOSFET选型到控制算法优化
  • 【仅限本周开放】AI工作流诊断报告:输入你的岗位JD,获取定制化降本增效路径(附Gartner认证模板)
  • 火狐浏览器翻译插件全攻略:从云端到本地,打造沉浸式双语阅读体验