react-native-native-modules

SKILL.md

React Native Native Modules Skill

Learn to build native modules for iOS and Android using Turbo Modules, JSI, and the new architecture.

Prerequisites

  • React Native intermediate knowledge
  • Basic iOS (Swift/Objective-C) or Android (Kotlin/Java)
  • Understanding of async/sync patterns

Learning Objectives

After completing this skill, you will be able to:

  • Create native modules for iOS and Android
  • Implement Turbo Modules with Codegen
  • Bridge third-party SDKs
  • Handle native events
  • Debug native code issues

Topics Covered

1. Turbo Module Spec

// specs/NativeCalculator.ts
import type { TurboModule } from 'react-native';
import { TurboModuleRegistry } from 'react-native';

export interface Spec extends TurboModule {
  add(a: number, b: number): number;           // Sync
  multiply(a: number, b: number): Promise<number>; // Async
}

export default TurboModuleRegistry.getEnforcing<Spec>('Calculator');

2. iOS Implementation (Swift)

@objc(Calculator)
class Calculator: NSObject {
  @objc static func requiresMainQueueSetup() -> Bool { false }

  @objc func add(_ a: Double, b: Double) -> Double {
    return a + b
  }

  @objc func multiply(_ a: Double, b: Double,
    resolve: @escaping RCTPromiseResolveBlock,
    reject: @escaping RCTPromiseRejectBlock) {
    resolve(a * b)
  }
}

3. Android Implementation (Kotlin)

@ReactModule(name = "Calculator")
class CalculatorModule(reactContext: ReactApplicationContext) :
    ReactContextBaseJavaModule(reactContext) {

  override fun getName() = "Calculator"

  @ReactMethod(isBlockingSynchronousMethod = true)
  fun add(a: Double, b: Double): Double = a + b

  @ReactMethod
  fun multiply(a: Double, b: Double, promise: Promise) {
    promise.resolve(a * b)
  }
}

4. Native Events

import { NativeEventEmitter, NativeModules } from 'react-native';

const { MyModule } = NativeModules;
const emitter = new NativeEventEmitter(MyModule);

// Subscribe
const subscription = emitter.addListener('onProgress', (data) => {
  console.log('Progress:', data.percent);
});

// Cleanup
subscription.remove();

5. When to Use Native Modules

Scenario Solution
Access native APIs Native module
Performance-critical JSI/Turbo Module
Third-party SDK Bridge wrapper
UI component Fabric component

Quick Start Example

// JavaScript usage
import NativeCalculator from './specs/NativeCalculator';

// Sync call (blocks JS thread briefly)
const sum = NativeCalculator.add(5, 3);
console.log('Sum:', sum); // 8

// Async call (non-blocking)
const product = await NativeCalculator.multiply(5, 3);
console.log('Product:', product); // 15

Common Errors & Solutions

Error Cause Solution
"Module not found" Not linked Run pod install
Crash on sync Main thread Use async or background
Type mismatch Codegen issue Regenerate specs

Validation Checklist

  • Module loads on both platforms
  • Sync methods don't block UI
  • Async methods resolve correctly
  • Events fire and cleanup properly

Usage

Skill("react-native-native-modules")

Bonded Agent: 04-react-native-native

Weekly Installs
10
Installed on
claude-code7
opencode6
codex6
antigravity6
gemini-cli6
trae4