Overview
Expo modules offer several advantages:- Type safety: Automatic type conversions between JS and native
- Modern syntax: Swift and Kotlin instead of Objective-C and Java
- Auto-generated bindings: No manual bridge code
- Shared module API: Similar API across iOS and Android
- Built-in features: Events, views, lifecycle methods
Creating a Module
Project Structure
Initialize Module
Configuration
expo-module.config.json
package.json
iOS Module (Swift)
Basic Module
ios/MyModule.swift
Constants
Events
View Manager
ios/MyCustomView.swift
Lifecycle Methods
Android Module (Kotlin)
Basic Module
android/src/main/java/expo/modules/mymodule/MyModule.kt
Constants
Events
View Manager
android/src/main/java/expo/modules/mymodule/MyCustomView.kt
android/src/main/java/expo/modules/mymodule/MyModule.kt
Lifecycle Methods
JavaScript Interface
TypeScript Definitions
src/index.ts
React Component
src/MyCustomView.tsx
Type Conversions
Expo Modules API automatically converts types:| JavaScript | Swift | Kotlin |
|---|---|---|
| string | String | String |
| number | Int, Double | Int, Double |
| boolean | Bool | Boolean |
| Array | [Any] | List<Any> |
| Object | [String: Any] | Map<String, Any> |
| null | nil | null |
Testing Native Modules
Swift Tests
ios/Tests/MyModuleTests.swift
Kotlin Tests
android/src/test/java/expo/modules/mymodule/MyModuleTest.kt
Best Practices
1. Error Handling
2. Thread Safety
3. Memory Management
Next Steps
Prebuild
Generate native projects
Build Properties
Configure native builds
Debugging
Debug native code
Creating Builds
Build with native modules