File: existing-library.md | Updated: 11/15/2025
Hide navigation
Search
Ctrl K
Home Guides EAS Reference Learn
Archive Expo Snack Discord and Forums Newsletter
Copy page
Learn how to integrate Expo Modules API into an existing React Native library.
Copy page
There are cases where you may want to integrate the Expo Modules API into an existing React Native library. For example, it might be useful to incrementally rewrite your library or to take advantage of Android lifecycle listeners and iOS AppDelegate subscribers to automatically set up the library.
This guide will help you set up your existing React Native library to access Expo Modules API.
Create the expo-module.config.json
file at the root of your project and add an empty object {} inside it. You will fill it in later to enable specific features.
Creating this file is necessary for Expo Autolinking to recognize your library as an Expo module and automatically link your native code.
1
Add the expo-modules-core native dependency
Add expo-modules-core as a dependency in your build.gradle and podspec files:
build.gradle
Copy
// ... dependencies { // ... implementation project(':expo-modules-core') }
*.podspec
Copy
# ... Pod::Spec.new do |s| # ... s.dependency 'ExpoModulesCore' end
2
Add Expo packages to dependencies
Add expo package as a peer dependency in your package.json — we recommend using * as a version range so as not to cause any duplicated packages in user's node_modules directory.
Your library also needs to depend on expo-modules-core but only as a dev dependency — it's already provided in the projects depending on your library by the expo package with the version of core that is compatible with the specific SDK used in the project.
package.json
Copy
{ %%placeholder-start%%... %%placeholder-end%% "devDependencies": { "expo-modules-core": "^X.Y.Z" }, "peerDependencies": { "expo": "*" }, "peerDependenciesMeta": { "expo": { "optional": true } } }
3
Create Kotlin and Swift files from the templates below:
MyModule.kt
Copy
package my.module.package import expo.modules.kotlin.modules.Module import expo.modules.kotlin.modules.ModuleDefinition class MyModule : Module() { override fun definition() = ModuleDefinition { // Definition components go here } }
MyModule.swift
Copy
import ExpoModulesCore public class MyModule: Module { public func definition() -> ModuleDefinition { // Definition components go here } }
Then, add your classes to Android and/or iOS modules in the expo-module.config.json
file. Expo Autolinking will automatically link these classes as native modules in the user's project.
expo-module.config.json
Copy
{ "ios": { "modules": ["MyModule"] }, "android": { "modules": ["my.module.package.MyModule"] } }
If you already have an example app in your workspace, ensure that the module is linked correctly.
pod install to link the new class.These module classes are now accessible from the JavaScript code using the requireNativeModule function from the expo-modules-core package. We recommend creating a separate file that exports the native module for simplicity.
MyModule.ts
Copy
import { requireNativeModule } from 'expo-modules-core'; export default requireNativeModule('MyModule');
Now that the class is set up and linked, you can start to implement its functionality. See the native module API reference page and links to examples from simple to moderately complex real-world modules to understand how to use the API.