index
Turbo
- 使用codegen根据JS/TS接口,在android等目录生成响应的C++、原生接口。
- 注意事项:
- Module实现功能,Package(原生才有)则进行注册Module
- 相当于Module是一个JS文件,Package是一个npm包,整体就是引入一个npm包。
- 自己实现的Package根据传递的name参数(也就是
getEnforcing函数的name参数)来返回对应的Module
- Module的name必须以Native开头
Codegen 支持的 TS 类型(简略表)
| TS 类型 |
是否支持 |
说明 |
|
number, string, boolean |
✅ |
基础类型 |
|
void, Promise<T> |
✅ |
支持异步调用 |
|
{ [key: string]: string } |
✅ |
可用作 object map |
|
Map<K, V> |
❌ |
不支持 |
|
Record<string, string> |
❌ |
和 Map 一样也不支持 |
|
| 自定义 alias + object |
✅ |
可以手动定义 alias 类型再使用 |
|
- Promise:和JS一样,resolve是成功,reject则是拒绝,但是reject有很多签名,
- reject的error是这么一个对象
- message:message参数,如果console.log会得到
{异常类型}: {message},toString也是
- code:code参数
- nativeStackAndroid:传递的异常的
- name:异常类型名
- userInfo:传递的userInfo
实现
1. JS/TS接口
import { TurboModule, TurboModuleRegistry } from "react-native";
export interface Spec extends TurboModule {
hello(): string;
asyncHello(): Promise<string>;
}
export default TurboModuleRegistry.getEnforcing<Spec>(
"NativeDemoTurbo"
) as Spec;
- 这个导出default就是这个Spec接口
import NativeDemoTurbo from "@/specs/NativeDemoTurbo"
NativeDemoTurbo.hello("xxx")
- 生成的原生接口名就是这个文件名+Spec,
getEnforcing传递的name就是BaseReactPackage\#getModule时传递的name
2. package.json配置Codegen
{
"codegenConfig": {
//配置名,影响android\app\build\generated\source\codegen\jni下的目录、文件名
"name": "NativeDemoTurboSpec",
"type": "modules",
//JS Spec代码目录
"jsSrcsDir": "specs",
//对android进行其他配置
"android": {
"javaPackageName": "io.github.liruohrh"
}
}
}
3. 执行Codegen代码生成
cd android && ./gradlew generateCodegenArtifactsFromSchema
android\app\build\generated\source\codegen:有java(原生代码)、jni(C++代码)、schema.json(Module的Schema)
- 不推荐也没必要修改生成的代码,修改自己的实现即可
cd ios && bundle install && bundle exec pod install
4. 在原生实现
- 直接用各自IDE打开android/ios目录,编写Spec的实现Module以及Package
- 推荐新建简单的React Native项目来完成,这样就不需要加载一大堆无用module。