React Native Module 注册流程

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

整体流程:

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

一、Android Native Module 注册流程

以 Android 为例:

1. 创建 Native Module

例如:

typescript 复制代码
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);
    }
}

关键:

scss 复制代码
getName()

决定 JS 调用名字:

复制代码
NativeModules.MyModule

2. 创建 Module Package

RN 通过 Package 管理 Native Module。

typescript 复制代码
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();
    }
}

这里完成:

yaml 复制代码
Package
  |
  └── MyModule实例

3. 注册 Package

加入:

复制代码
MainApplication.java

里面:

csharp 复制代码
@Override
protected List<ReactPackage> getPackages() {

    List<ReactPackage> packages =
        new PackageList(this)
        .getPackages();


    packages.add(
        new MyPackage()
    );


    return packages;
}

流程:

yaml 复制代码
MainApplication
        |
        |
        ↓
ReactNativeHost
        |
        ↓
Package列表

4. React Native 初始化时加载

App启动:

yaml 复制代码
ReactInstanceManager
        |
        |
        ↓
createReactContext()
        |
        ↓
NativeModuleRegistryBuilder
        |
        ↓
遍历 ReactPackage
        |
        ↓
createNativeModules()
        |
        ↓
注册 Module

最终形成:

css 复制代码
NativeModuleRegistry

{
   MyModule : MyModule实例
}

5. JS调用

JS:

javascript 复制代码
import {
 NativeModules
} from 'react-native';


NativeModules.MyModule.hello(
    "Tom"
);

调用链:

yaml 复制代码
JS
 |
 |
Bridge
 |
 |
NativeModuleRegistry
 |
 |
MyModule.hello()

二、iOS Native Module 注册流程

类似。

1. 创建 Module

Objective-C:

less 复制代码
@interface MyModule : NSObject
<
RCTBridgeModule
>

@end


@implementation MyModule


RCT_EXPORT_MODULE();


RCT_EXPORT_METHOD(
 hello:(NSString *)name
)
{
 NSLog(@"Hello %@", name);
}


@end

关键:

scss 复制代码
RCT_EXPORT_MODULE()

自动注册。


2. Bridge扫描

启动:

yaml 复制代码
RCTBridge
 |
 |
 ↓
Load Native Modules
 |
 |
 ↓
扫描 RCT_EXPORT_MODULE
 |
 |
 ↓
生成 Module Registry

三、新架构(New Architecture)

React Native 0.68+ 引入:

复制代码
JSI
Fabric
TurboModule
Codegen

流程变化:

旧架构:

scss 复制代码
JS
 |
Bridge(JSON)
 |
Native Module

新架构:

复制代码
JS
 |
JSI
 |
TurboModule
 |
C++ Binding
 |
Native

TurboModule注册流程

例如:

JS定义:

php 复制代码
interface Spec
extends TurboModule {

  hello(name:string):void;

}

Codegen生成:

复制代码
NativeMyModuleSpec.java

NativeMyModuleSpec.h

然后:

yaml 复制代码
TurboModuleManager
        |
        |
        ↓
Module Provider
        |
        ↓
MyModule实例

四、完整生命周期总结

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

五、关键类关系(Android)

yaml 复制代码
ReactApplication
        |
        ↓
ReactNativeHost
        |
        ↓
ReactInstanceManager
        |
        ↓
ReactContext
        |
        ↓
NativeModuleRegistry
        |
        ↓
NativeModule

六、开发中常见问题

JS 找不到 Module

错误:

java 复制代码
Native module cannot be null

检查:

  1. getName() 是否一致
kotlin 复制代码
return "MyModule";

JS:

复制代码
NativeModules.MyModule
  1. Package 是否加入:
csharp 复制代码
packages.add(new MyPackage());
  1. 是否重新编译 Android:
arduino 复制代码
npx react-native run-android

方法没暴露

必须:

typescript 复制代码
@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 这一条链。

相关推荐
inquisiter16 分钟前
KernelGpt的部分尝试
java·前端·apache
the局外人38 分钟前
用 TRAE 把 Markdown文档 搬到微信公众号
前端
Autumn_ing39 分钟前
AI原型设计工具怎么选?可编辑原型与可运行前端适合什么场景
前端·小程序·产品经理·代码·codex·墨刀ai客户端·ai原型
夕阳_醉了1 小时前
前端通用组件开发全指南|从 0 到 1 打造稳定可复用的业务组件
前端
Amos_Web1 小时前
Rspack 源码解析(三十):SourceMapDevToolPlugin 如何生成并关联 source map
前端
console.log('npc')1 小时前
从0到1实现任务评价统计功能:React + TypeScript 实战指南(小白注释版)
前端·react.js·typescript
IT_陈寒2 小时前
为什么你应该学习React?
前端·人工智能·后端
ZoeLandia2 小时前
React04:事件处理与受控表单
开发语言·前端·react.js·typescript
亿元程序员2 小时前
用AI做了一款微信小游戏,却发现上传不了
前端
Ai-_Man2 小时前
我需要批量导出Poe左边栏所有对话,而不是一条具体的对话内容,你们AI导出鸭可以吗?
开发语言·前端·javascript·人工智能·小程序