Loading source
Pulling the file list, source metadata, and syntax-aware rendering for this listing.
Source from repo
Official Expo team skills for building, deploying, and debugging Expo apps — fine-tuned for Claude Code.
Files
Skill
Size
Entrypoint
Format
Open file
Syntax-highlighted preview of this file as included in the skill package.
SKILL.md
1---2name: upgrading-expo3description: Guidelines for upgrading Expo SDK versions and fixing dependency issues4version: 1.0.05license: MIT6---78## References910- ./references/react-19.md -- SDK +54: React 19 changes (useContext → use, Context.Provider → Context, forwardRef removal)11- ./references/new-architecture.md -- SDK +53: New Architecture migration guide12- ./references/react-compiler.md -- SDK +54: React Compiler setup and migration guide13- ./references/native-tabs.md -- SDK +55: Native tabs changes (Icon/Label/Badge now accessed via NativeTabs.Trigger.\*)14- ./references/expo-av-to-audio.md -- SDK +55: Migrate audio playback and recording from expo-av to expo-audio15- ./references/expo-av-to-video.md -- SDK +55: Migrate video playback from expo-av to expo-video16- ./references/react-navigation-to-expo-router.md -- SDK +56: Migrate `@react-navigation/*` imports to `expo-router` entry points (codemod + manual mapping)1718## Beta/Preview Releases1920Beta versions use `.preview` suffix (e.g., `55.0.0-preview.2`), published under `@next` tag.2122Check if latest is beta: https://exp.host/--/api/v2/versions (look for `-preview` in `expoVersion`)2324```bash25npx expo install expo@next --fix # install beta26```2728## Step-by-Step Upgrade Process29301. Upgrade Expo and dependencies3132```bash33npx expo install expo@latest34npx expo install --fix35```36372. Run diagnostics: `npx expo-doctor`38393. Clear caches and reinstall4041```bash42npx expo export -p ios --clear43rm -rf node_modules .expo44watchman watch-del-all45```4647## Breaking Changes Checklist4849- Check for removed APIs in release notes50- Update import paths for moved modules51- Review native module changes requiring prebuild52- Test all camera, audio, and video features53- Verify navigation still works correctly5455## Prebuild for Native Changes5657**First check if `ios/` and `android/` directories exist in the project.** If neither directory exists, the project uses Continuous Native Generation (CNG) and native projects are regenerated at build time — skip this section and "Clear caches for bare workflow" entirely.5859If upgrading requires native changes:6061```bash62npx expo prebuild --clean63```6465This regenerates the `ios` and `android` directories. Ensure the project is not a bare workflow app before running this command.6667## Clear caches for bare workflow6869These steps only apply when `ios/` and/or `android/` directories exist in the project:7071- Clear the cocoapods cache for iOS: `cd ios && pod install --repo-update`72- Clear derived data for Xcode: `npx expo run:ios --no-build-cache`73- Clear the Gradle cache for Android: `cd android && ./gradlew clean`7475## Housekeeping7677- Review release notes for the target SDK version at https://expo.dev/changelog78- If using Expo SDK 54 or later, ensure react-native-worklets is installed — this is required for react-native-reanimated to work.79- Enable React Compiler in SDK 54+ by adding `"experiments": { "reactCompiler": true }` to app.json — it's stable and recommended80- Delete sdkVersion from `app.json` to let Expo manage it automatically81- Remove implicit packages from `package.json`: `@babel/core`, `babel-preset-expo`, `expo-constants`.82- If the babel.config.js only contains 'babel-preset-expo', delete the file83- If the metro.config.js only contains expo defaults, delete the file8485## Deprecated Packages8687| Old Package | Replacement |88| -------------------- | ---------------------------------------------------- |89| `expo-av` | `expo-audio` and `expo-video` |90| `expo-permissions` | Individual package permission APIs |91| `@expo/vector-icons` | `expo-symbols` (for SF Symbols) |92| `AsyncStorage` | `expo-sqlite/localStorage/install` |93| `expo-app-loading` | `expo-splash-screen` |94| expo-linear-gradient | experimental_backgroundImage + CSS gradients in View |9596When 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.9798## expo.install.exclude99100Check if package.json has excluded packages:101102```json103{104"expo": { "install": { "exclude": ["react-native-reanimated"] } }105}106```107108Exclusions are often workarounds that may no longer be needed after upgrading. Review each one.109## Removing patches110111Check if there are any outdated patches in the `patches/` directory. Remove them if they are no longer needed.112113## Postcss114115- `autoprefixer` isn't needed in SDK +53. Remove it from dependencies and check `postcss.config.js` or `postcss.config.mjs` to remove it from the plugins list.116- Use `postcss.config.mjs` in SDK +53.117118## Metro119120Remove redundant metro config options:121122- resolver.unstable_enablePackageExports is enabled by default in SDK +53.123- `experimentalImportSupport` is enabled by default in SDK +54.124- `EXPO_USE_FAST_RESOLVER=1` is removed in SDK +54.125- cjs and mjs extensions are supported by default in SDK +50.126- Expo webpack is deprecated, migrate to [Expo Router and Metro web](https://docs.expo.dev/router/migrate/from-expo-webpack/).127128## Hermes engine v1129130Since SDK 55, users can opt-in to use Hermes engine v1 for improved runtime performance. This requires setting `useHermesV1: true` in the `expo-build-properties` config plugin, and may require a specific version of the `hermes-compiler` npm package. Hermes v1 will become a default in some future SDK release.131132## New Architecture133134The new architecture is enabled by default, the app.json field `"newArchEnabled": true` is no longer needed as it's the default. Expo Go only supports the new architecture as of SDK +53.135