Progreso total de migración
35%
✓
✓
3
4
5
6
7
8
6
Paquetes deprecados
4
Configs a limpiar
3
Mejoras de rendimiento
Paso a paso — Plan de migración
Paso 1 — Diagnóstico inicial
✓ COMPLETADO
# Ejecutar diagnóstico
npx expo-doctor
# Output detectado en FitTrack Pro:
✗ expo-av is deprecated
✗ expo-app-loading is deprecated
✗ @expo/vector-icons — use expo-symbols
✗ Old Architecture (bridge) detected
✗ autoprefixer in postcss not needed SDK 53+
✗ unstable_enablePackageExports redundant
Paso 2 — Actualizar Expo y dependencias
✓ COMPLETADO
# 1. Actualizar a SDK 55
npx expo install expo@latest
# 2. Fijar versiones compatibles
npx expo install --fix
# Resultado en package.json:
"expo": "^55.0.0"
"react-native": "0.77.0"
"react": "19.0.0"
Paso 3 — Migrar expo-av → expo-video + expo-audio
⏳ EN PROGRESO — Alta prioridad
FitTrack Pro usa expo-av para: (1) reproducir vídeos de rutinas de entreno, (2) grabar voz para notas de workout. Ambos flujos requieren migración completa antes de SDK 55.
❌ ANTES (expo-av)
import { Video } from 'expo-av';
// WorkoutVideoPlayer.tsx
<Video
source={{ uri: videoUrl }}
useNativeControls
resizeMode="contain"
isLooping
/>
✅ DESPUÉS (expo-video)
import { VideoView, useVideoPlayer }
from 'expo-video';
// WorkoutVideoPlayer.tsx
const player = useVideoPlayer(videoUrl, p => {
p.loop = true;
});
<VideoView player={player}
nativeControls allowsFullscreen />
❌ ANTES — Grabar audio
import { Audio } from 'expo-av';
const rec = new Audio.Recording();
await rec.prepareToRecordAsync(
Audio.RecordingOptionsPresets.HIGH_QUALITY
);
await rec.startAsync();
✅ DESPUÉS — useAudioRecorder
import { useAudioRecorder,
AudioQuality } from 'expo-audio';
const recorder = useAudioRecorder({
android: { quality: AudioQuality.HIGH },
ios: { quality: AudioQuality.High },
});
recorder.record();
Paquetes deprecados en FitTrack Pro
| Paquete actual | Reemplazar por | Prioridad | Estado | Nota |
|---|---|---|---|---|
| expo-av | expo-video + expo-audio | Urgente | ⏳ En progreso | Vídeos entreno + grabación de notas |
| expo-app-loading | expo-splash-screen | Urgente | ⬜ Pendiente | Reemplazar SplashScreen.preventAutoHideAsync() |
| @expo/vector-icons | expo-symbols | Normal | ⬜ Pendiente | SF Symbols nativo en iOS — mejor rendimiento |
| AsyncStorage | expo-sqlite/localStorage | Baja | ⬜ Pendiente | Migrar preferencias usuario y caché local |
| expo-linear-gradient | backgroundImage CSS en View | Baja | ⬜ Pendiente | Gradientes header dashboard fitness |
| autoprefixer (PostCSS) | Eliminar | Baja | ⬜ Pendiente | No necesario en SDK 53+ |
Paso 4 — Limpiar configuración
Pendiente
-
Borrar
sdkVersionde app.json — Expo lo gestiona automáticamente -
Eliminar
babel.config.js(solo contiene babel-preset-expo) -
Quitar de metro.config.js:
unstable_enablePackageExports(default SDK 53+) -
Revisar exclusión de react-native-reanimated en
expo.install.exclude— puede ser innecesaria -
Añadir a package.json:
react-native-worklets(requerido por reanimated SDK 54+)
# app.json — habilitar React Compiler
"experiments": {
"reactCompiler": true
}
# newArchEnabled ya NO hace falta
// "newArchEnabled": true ← borrar
Paso 5 — Prebuild y limpieza de caché
Pendiente — Bare workflow (tiene /ios y /android)
FitTrack Pro tiene directorios /ios y /android — aplicar todos los pasos de bare workflow.
# Regenerar carpetas nativas
npx expo prebuild --clean
# Limpiar caché general
rm -rf node_modules .expo
watchman watch-del-all
npx expo export -p ios --clear
# iOS — renovar pods
cd ios && pod install --repo-update
npx expo run:ios --no-build-cache
# Android — limpiar Gradle
cd android && ./gradlew clean
Paso 6 — New Architecture + Hermes v1
Pendiente — Boost de rendimiento
-
New Architecture activa por defecto en SDK 53+ — no requiere configuración extra
-
Habilitar Hermes v1 en
expo-build-propertiespara mejor rendimiento runtime -
Revisar módulos nativos custom de FitTrack Pro con Old Architecture API
# app.json — Hermes v1 (opt-in SDK 55)
{
"plugins": [
["expo-build-properties", {
"ios": { "useHermesV1": true },
"android": { "useHermesV1": true }
}]
]
}
Paso 7 — Testing pre-producción
Pendiente
-
Distribuir build iOS a QA via TestFlight
-
Subir APK/AAB a Play Console internal testing
-
Verificar reproductor de vídeos de rutinas (expo-video)
-
Testar grabación de notas de workout (expo-audio)
-
Comprobar splash screen y loading states
-
Validar OTA updates no rompen usuarios en SDK 52
-
Medir performance con New Architecture vs Old Architecture
Cronograma — 1 semana (2 devs)
✓
Lunes — Día 1
Diagnóstico + Upgrade base
expo-doctor, npx expo install expo@latest --fix, primer commit de upgrade
3
Martes-Miércoles — Días 2-3
Migración expo-av → expo-video + expo-audio
WorkoutVideoPlayer.tsx, AudioNoteRecorder.tsx, tests unitarios de ambos flujos
4
Jueves — Día 4
Limpieza de configs + paquetes menores
expo-splash-screen, expo-symbols, AsyncStorage, metro config, babel.config.js, app.json
5
Viernes — Día 5
Prebuild + New Architecture + Hermes v1
npx expo prebuild --clean, pod install, gradlew clean, activar Hermes v1
6
Fin de semana — Días 6-7
QA en TestFlight + Play Console → Deploy
Testing completo, validación OTA, aprobación equipo, release a producción
Recursos de referencia: Changelog completo en
https://expo.dev/changelog · Migración expo-av documentada en references/expo-av-to-video.md y references/expo-av-to-audio.md