expo-react-native-restart
v0.1.1
Published
Restart the React Native JavaScript runtime. Supports the new architecture (bridgeless) on iOS and Android.
Downloads
600
Maintainers
Readme
expo-react-native-restart
Expo module that restarts the React Native JS runtime. Supports the new architecture (bridgeless) on both iOS and Android.
Why
react-native-restart is not maintained and does not support the new architecture. expo-updates.reloadAsync() works, but pulls in the full expo-updates stack. This module is a minimal alternative: one function, no extra runtime dependencies beyond expo-modules-core.
Requirements
- React Native 0.74+
expo-modules-coreinstalled in the host project (works in both Expo and bare React Native projects)
Installation
yarn add expo-react-native-restartOn iOS, run pod install after installing the package.
Usage
import { restart } from 'expo-react-native-restart';
await restart();Calling restart() tears down the current JS runtime and recreates the React context. Any in-memory state is lost, and the app re-initializes from the entry point.
What restart() actually does
restart() tears down the JavaScript runtime and rebuilds it from scratch. Know what survives the call and what doesn't before wiring it into your app — otherwise it's easy to reach for restart() expecting a clean slate and get a half-reset instead. Some naive implementations (e.g. calling Activity.recreate() on Android) only rebuild the Android UI shell while leaving the JS runtime fully intact, which looks like a restart but isn't.
| Layer | After restart() |
|---|---|
| JS state (Redux, useState, module-level variables, require cache) | Wiped |
| JS runtime heap (Hermes / JSC) | Destroyed and recreated |
| Native modules / TurboModules | Recreated |
| React component tree | Remounted from the entry point |
| Android Activity / iOS UIViewController | Preserved |
| Native singletons, storage (MMKV, AsyncStorage, files on disk) | Preserved |
| App process (PID) | Preserved — this is not a process restart |
Rule of thumb: anything that lived inside your JS bundle is gone; anything that lived in native code or on disk stays.
How it works
- iOS: calls
RCTTriggerReloadCommandListeners, which is the standard React Native reload path and is compatible with both the bridge and bridgeless runtimes. - Android (new arch / bridgeless): calls
ReactHost.reload(...). - Android (old arch): falls back to
ReactInstanceManager.recreateReactContextInBackground().
License
MIT
