upgrading-expo
Original:🇺🇸 English
Not Translated
Guidelines for upgrading Expo SDK versions and fixing dependency issues
1installs
Added on
NPX Install
npx skill4agent add jstarfilms/vibecode-protocol-suite upgrading-expoSKILL.md Content
References
- ./references/new-architecture.md -- SDK +53: New Architecture migration guide
- ./references/react-19.md -- SDK +54: React 19 changes (useContext → use, Context.Provider → Context, forwardRef removal)
- ./references/react-compiler.md -- SDK +54: React Compiler setup and migration guide
- ./references/native-tabs.md -- SDK +55: Native tabs changes (Icon/Label/Badge now accessed via NativeTabs.Trigger.*)
- ./references/expo-av-to-audio.md -- Migrate audio playback and recording from expo-av to expo-audio
- ./references/expo-av-to-video.md -- Migrate video playback from expo-av to expo-video
Beta/Preview Releases
Beta versions use suffix (e.g., ), published under tag.
.preview55.0.0-preview.2@nextbash
npx expo install expo@next --fix # install betaStep-by-Step Upgrade Process
- Upgrade Expo and dependencies
bash
npx expo install expo@latest
npx expo install --fix-
Run diagnostics:
npx expo-doctor -
Clear caches and reinstall
bash
npx expo export -p ios --clear
rm -rf node_modules .expo
watchman watch-del-allBreaking Changes Checklist
- Check for removed APIs in release notes
- Update import paths for moved modules
- Review native module changes requiring prebuild
- Test all camera, audio, and video features
- Verify navigation still works correctly
Prebuild for Native Changes
If upgrading requires native changes:
bash
npx expo prebuild --cleanThis regenerates the and directories. Ensure the project is not a bare workflow app before running this command.
iosandroidClear caches for bare workflow
- Clear the cocoapods cache for iOS:
cd ios && pod install --repo-update - Clear derived data for Xcode:
npx expo run:ios --no-build-cache - Clear the Gradle cache for Android:
cd android && ./gradlew clean
Housekeeping
- Review release notes for the target SDK version at https://expo.dev/changelog
- If using Expo SDK 54 or later, ensure react-native-worklets is installed — this is required for react-native-reanimated to work.
- Enable React Compiler in SDK 54+ by adding to app.json — it's stable and recommended
"experiments": { "reactCompiler": true } - Delete sdkVersion from to let Expo manage it automatically
app.json - Remove implicit packages from :
package.json,@babel/core,babel-preset-expo.expo-constants - If the babel.config.js only contains 'babel-preset-expo', delete the file
- If the metro.config.js only contains expo defaults, delete the file
Deprecated Packages
| Old Package | Replacement |
|---|---|
| |
| Individual package permission APIs |
| |
| |
| |
| expo-linear-gradient | experimental_backgroundImage + CSS gradients in View |
When migrating deprecated packages, update all code usage before removing the old package. For expo-av, consult the migration references to convert Audio.Sound to useAudioPlayer, Audio.Recording to useAudioRecorder, and Video components to VideoView with useVideoPlayer.
expo.install.exclude
Check if package.json has excluded packages:
json
{
"expo": { "install": { "exclude": ["react-native-reanimated"] } }
}Exclusions are often workarounds that may no longer be needed after upgrading. Review each one.
Removing patches
Check if there are any outdated patches in the directory. Remove them if they are no longer needed.
patches/Postcss
- isn't needed in SDK +53. Remove it from dependencies and check
autoprefixerorpostcss.config.jsto remove it from the plugins list.postcss.config.mjs - Use in SDK +53.
postcss.config.mjs
Metro
Remove redundant metro config options:
- resolver.unstable_enablePackageExports is enabled by default in SDK +53.
- is enabled by default in SDK +54.
experimentalImportSupport - is removed in SDK +54.
EXPO_USE_FAST_RESOLVER=1 - cjs and mjs extensions are supported by default in SDK +50.
- Expo webpack is deprecated, migrate to Expo Router and Metro web.
New Architecture
The new architecture is enabled by default, the app.json field is no longer needed as it's the default. Expo Go only supports the new architecture as of SDK +53.
"newArchEnabled": true