This library contains the core unimodule infrastructure and a collection of unimodules and interfaces that are commonly depended on by other unimodules. You only need to install react-native-unimodules
once and then you will be able to use most of the packages from the Expo SDK, like expo-camera, expo-media-library and many more, in any React Native project.
The easiest way to use the library is to initialize a project with it already installed: npx create-react-native-app my-app
.
You can also use
expo-cli
to do this - runnpm i -g expo-cli
and thenexpo init --template bare-minimum
orexpo init --template expo-template-bare-typescript
if you prefer TypeScript.
If you have an existing project you'd like to install it into, please read the following instructions.
This project requires that you use CocoaPods on iOS, to set it up see this gist, or relevant parts of the this guide. React Native >= 0.60 ships with Cocoapods support by default, so this should be easy if you're already on that version.
npm install react-native-unimodules
Now you need to configure the library for iOS and/or Android.
- Open
ios/Podfile
in your editor and make it look like this one on react-native <= 0.59 or like this one on react-native >= 0.60. - Run
pod install
again - Update your
AppDelegate.h
andAppDelegate.m
according to to look like these.- If you use
react-native-navigation
, you will need to use itsbridgeManagerDelegate
option like in this gist.
- If you use
Need to customize node_modules path?
If you need to customize the path to node_modules, for example because you are using yarn workspaces, then you can pass in a param for this: use_unimodules!(modules_paths: ['./path/to/node_modules'])
Need to exclude some unimodules that are being automatically linked?
If you need to exclude some of the unimodules that you are not using but they got installed by your other dependencies (like expo
), then you can pass in exclude
param for this. For example, if you want to exclude expo-face-detector
, you may want to use this: use_unimodules!(exclude: ['expo-face-detector'])
In android/settings.gradle
- At the top add
apply from: '../node_modules/react-native-unimodules/gradle.groovy'
- Then call
includeUnimodulesProjects()
on the next line.
In android/app/build.gradle
- Add
apply from: '../../node_modules/react-native-unimodules/gradle.groovy'
anywhere before thedependencies {}
block. - Add
addUnimodulesDependencies()
insidedependencies {}
block. - We recommend you use Java 1.8, you can set this like this.
In android/build.gradle
- Update
minSdkVersion
to21
.
In MainApplication.java
Make the changes outlined in the diff that correspondes to your react-native version.
Need to customize node_modules path?
If you need to customize the path to node_modules, for example because you are using yarn workspaces, then you can pass in a param modulesPaths
for both of these functions: includeUnimodulesProjects([modulesPaths: ['./path/to/node_modules']])
, addUnimodulesDependencies([modulesPaths: ['./path/to/node_modules']])
Need to exclude some unimodules that are being automatically linked?
If you need to exclude some of the unimodules that you are not using but they got installed by your other dependencies (like expo
), then you can pass in exclude
param for this. For example, if you want to exclude expo-face-detector
, you may want to use this: addUnimodulesDependencies([exclude: ['expo-face-detector']])
Need to customize configuration of unimodule dependencies?
You can also customize the configuration of the unimodules dependencies (the default is implementation
, if you're using Gradle older than 3.0, you will need to set configuration: "compile"
in addUnimodulesDependencies
, like: addUnimodulesDependencies([configuration: "compile"])
)
It's possible that you will not have to use any of the code provided by this package directly, it may be used only by other Unimodules that you install.
But it's likely that you will want to use something like FileSystem or Permissions, and to do that you can import the following modules like so:
import { Asset, Constants, FileSystem, Permissions } from 'react-native-unimodules';
You can import them directly from the specific Unimodule package if you like, but your linter may complain about importing a transitive dependency.
import * as Permissions from 'expo-permissions';