Когда нужны нативные модули
Нативные модули необходимы когда:
Архитектура бриджа
React Native использует бридж для связи JavaScript и нативного кода:
▸Новая архитектура (Turbo Modules)
Turbo Modules заменяют старый бридж на Codegen и ленивую загрузку модулей.
Создание нативного модуля (Android)
▸Kotlin модуль
1// android/app/src/main/java/com/app/BatteryModule.kt2package com.app34import android.content.Context5import android.os.BatteryManager6import com.facebook.react.bridge.ReactApplicationContext7import com.facebook.react.bridge.ReactContextBaseJavaModule8import com.facebook.react.bridge.ReactMethod9import com.facebook.react.bridge.Promise1011class BatteryModule(reactContext: ReactApplicationContext) :12 ReactContextBaseJavaModule(reactContext) {1314 override fun getName(): String = "BatteryModule"1516 @ReactMethod17 fun getBatteryLevel(promise: Promise) {18 val batteryManager = reactApplicationContext19 .getSystemService(Context.BATTERY_SERVICE) as BatteryManager20 val level = batteryManager.getIntProperty(21 BatteryManager.BATTERY_PROPERTY_CAPACITY22 )23 promise.resolve(level.toDouble())24 }25}
▸Регистрация модуля
1// android/app/src/main/java/com/app/BatteryPackage.kt2package com.app34import com.facebook.react.ReactPackage5import com.facebook.react.bridge.NativeModule6import com.facebook.react.bridge.ReactApplicationContext7import com.facebook.react.uimanager.ViewManager89class BatteryPackage : ReactPackage {10 override fun createNativeModules(11 reactContext: ReactApplicationContext12 ): List<NativeModule> {13 return listOf(BatteryModule(reactContext))14 }1516 override fun createViewManagers(17 reactContext: ReactApplicationContext18 ): List<ViewManager<*, *>> {19 return emptyList()20 }21}
Создание нативного модуля (iOS)
▸Swift модуль
1// ios/BatteryModule.swift2import Foundation3import React45@objc(BatteryModule)6class BatteryModule: NSObject {78 @objc static func requiresMainQueueSetup() -> Bool {9 return false10 }1112 @objc func getBatteryLevel(13 _ resolve: @escaping RCTPromiseResolveBlock,14 rejecter reject: @escaping RCTPromiseRejectBlock15 ) {16 UIDevice.current.isBatteryMonitoringEnabled = true17 let level = UIDevice.current.batteryLevel18 if level < 0 {19 reject("ERROR", "Battery info unavailable", nil)20 } else {21 resolve NSNumber(value: level * 100)22 }23 }24}
▸Мост для Objective-C
1// ios/BatteryModule.m2#import <React/RCTBridgeModule.h>34@interface RCT_EXTERN_MODULE(BatteryModule, NSObject)56RCT_EXTERN_METHOD(getBatteryLevel:7 (RCTPromiseResolveBlock)resolve8 rejecter:(RCTPromiseRejectBlock)reject)910@end
Использование в JavaScript
1import { NativeModules } from 'react-native';2const { BatteryModule } = NativeModules;34async function checkBattery() {5 try {6 const level = await BatteryModule.getBatteryLevel();7 console.log('Battery:', level + '%');8 } catch (error) {9 console.error('Battery error:', error);10 }11}
Создание нативного UI-компонента
▸Android
1class MapView(reactContext: ReactApplicationContext) :2 SimpleViewManager<MapView>() {34 override fun getName(): String = "MapView"56 override fun createViewInstance(context: ThemedReactContext): MapView {7 return MapView(context)8 }910 @ReactProp(name = "zoom")11 fun setZoom(view: MapView, zoom: Int) {12 view.setZoom(zoom.toFloat())13 }14}
Turbo Modules
Turbo Modules — это новая архитектура, которая улучшает производительность за счёт:
▸Определение интерфейса
1// NativeBattery.ts2import type { TurboModule } from 'react-native';3import { TurboModuleRegistry } from 'react-native';45export interface Spec extends TurboModule {6 getBatteryLevel(): Promise<number>;7}89export default TurboModuleRegistry.getEnforcing<Spec>('BatteryModule');
Заключение
Нативные модули — это мощный инструмент для расширения возможностей React Native. Новая архитектура с Turbo Modules и Fabric делает создание нативных модулей более удобным и производительным. Для большинства случаев достаточно существующих библиотек, но custom modules необходимы для уникальных функций.