xref: /expo/docs/pages/modules/get-started.mdx (revision d7ef8399)
1---
2title: 'Expo Modules API: Get started'
3sidebar_title: Get started
4description: Learn about getting started with Expo modules API.
5---
6
7import { BookOpen02Icon, Grid01Icon } from '@expo/styleguide-icons';
8
9import { BoxLink } from '~/ui/components/BoxLink';
10import { Step } from '~/ui/components/Step';
11import { Terminal } from '~/ui/components/Snippet';
12
13**There are two ways to get started with the Expo Modules API:** you can either initialize a new module from scratch or add the Expo Modules API to an existing module. This guide will walk you through creating a new module from scratch, and the [Integrating in an existing library guide](/modules/existing-library) covers the latter case.
14
15The two recommended flows to create a new module with Expo Modules API:
16
17- Add a new module to an existing Expo application, and use it to test and develop your module.
18- Create a new module in isolation with a generated example project if you want to reuse it in multiple projects or publish it to npm.
19
20Both of these flows are covered in the next sections.
21
22## Adding a new module to an existing application
23
24<Step label="1">
25
26### Creating the local Expo module
27
28Navigate to your project directory (the one that contains the **package.json** file) and run the following command, which is the recommended way to create a local Expo module:
29
30<Terminal cmd={[`$ npx create-expo-module@latest --local`]} />
31
32It's best to provide a meaningful module name. However, you can accept the default suggestions for the rest of the questions.
33
34</Step>
35
36<Step label="2">
37
38### Using the module
39
40If you have an **ios** directory in your project that you created using `expo prebuild`, you must reinstall the pods:
41
42<Terminal cmd={[`$ pod install --project-directory=ios`]} />
43
44> **Note:**
45> If you're using a development client, you need to rebuild your development client any time you want to use new native code.
46
47> **Warning:**
48> If you override the `paths` property in `tsconfig.json` or are using Expo SDK version below `48.0.11`, you need to include the following wildcard in [the paths config](https://www.typescriptlang.org/tsconfig#paths).
49>
50> ```
51> "paths": {
52>   "*": ["./modules/*"]
53> }
54> ```
55
56Now, import the module in your application:
57
58```js
59import { hello } from 'my-module';
60```
61
62To run your app locally, run the `prebuild` command and then compile the app:
63
64<Terminal
65  cmdCopy="npx expo prebuild --clean && npx expo run:ios"
66  cmd={[
67    '# Re-generate the native project directories from scratch',
68    '$ npx expo prebuild --clean',
69    '# Run the example app on Android',
70    '$ npx expo run:android',
71    '# Run the example app on iOS',
72    '$ npx expo run:ios',
73  ]}
74/>
75
76Congratulations! You have created a local Expo module. You can now start working on it.
77
78</Step>
79
80<Step label="3">
81
82### Editing the module
83
84#### Android
85
86If you have an `android` directory in your project that you created using `expo prebuild`, you can open the directory in Android Studio.
87
88You can always just edit the files in the `modules/my-module/android/src/main/java/expo/modules/mymodule/` directory directly in your favorite text editor.
89
90Change the `hello` method to return a different string. For example, you can change it to return "Hello world! ����".
91
92Rebuild the app or build a new development client and you should see your change.
93
94#### iOS
95
96Open the files in **modules/my-module/ios/** directory in your favorite code editor to edit them. Alternatively, if you have an **ios** directory in your project that was created using `expo prebuild`, you can use Xcode to edit them.
97
98Now, change the `hello` method to return a different string. For example, you can change it to return "Hello world! ����".
99
100Rebuild the app or build a new development client and you should see your change. Remember you need to either run `npx expo prebuild` each time you make a native change or you reinstall the pods using `pod install --project-directory="example/ios"` (which should be way faster).
101
102</Step>
103
104> **Note**
105>
106> There are also other flows for working on an Expo module in parallel with your application.
107> For example, you can use a monorepo or publish to npm, as described in [How to use a standalone Expo module in your project](/modules/use-standalone-expo-module-in-your-project) guide.
108
109## Creating a new module with an example project
110
111<Step label="1">
112
113### Creating the Expo module
114
115To create a new Expo module from scratch, run the `create-expo-module` script as shown below.
116The script will ask you a few questions and then generate the native Expo module along with the example app for Android and iOS that uses your new module.
117
118<Terminal cmd={[`$ npx create-expo-module my-module`]} />
119
120</Step>
121
122<Step label="2">
123
124### Running the example project
125
126Navigate to the module directory and then open the Android and/or iOS example project by running the following commands:
127
128<Terminal cmd={[`$ cd my-module`, `$ npm run open:android`, `$ npm run open:ios`]} />
129
130Now, you can run the example project on your device or simulator/emulator. When the project compiles and runs, you will see "Hello world! ��" on the screen.
131
132> **Note:** If you're using Windows, you can open the example project by opening the **android** directory in Android Studio, but you cannot open the iOS project files.
133
134</Step>
135
136<Step label="3">
137
138### Making a change
139
140#### Android
141
142Open up **MyModuleModule.kt** in Android Studio (<kbd>⌘ Cmd</kbd> + <kbd>O</kbd> or <kbd>Ctrl</kbd> + <kbd>O</kbd> and search for **MyModuleModule.kt**). Change the `hello` method to return a different string. For example, you can change it to return `"Hello world! ����"`. Rebuild the app and you should see your change.
143
144#### iOS
145
146Open up **MyModuleModule.swift** in Xcode (<kbd>⌘ Cmd</kbd> + <kbd>O</kbd> or <kbd>Ctrl</kbd> + <kbd>O</kbd> and search for **MyModuleModule.swift**). Change the `hello` method to return a different string. For example, you can change it to return `"Hello world! ����"`.
147
148If you added new native files, you need to reinstall the pods using `pod install --project-directory="example/ios"`.
149
150Rebuild the app and you should see your change.
151
152</Step>
153## Next steps
154
155Now that you've learned how to initialize a module and make simple changes to it, you can continue to a tutorial or dive right into the API reference.
156
157<BoxLink
158  title="Creating your first native module"
159  description="Create a simple, but complete, native module to interact with Android and iOS preferences APIs."
160  href="/modules/native-module-tutorial"
161  Icon={BookOpen02Icon}
162/>
163
164<BoxLink
165  title="Module API Reference"
166  description="Outline for the Expo Module API and common patterns like sending events from native code to JavaScript."
167  href="/modules/module-api"
168  Icon={Grid01Icon}
169/>
170