Reanimated 4 es el motor de animación predeterminado en Expo SDK 57. Los valores compartidos, useAnimatedStyle, y los helpers de timing/spring se ejecutan en el hilo de UI para que los gestos y el scroll no se bloqueen cuando JavaScript está ocupado.
Plugin de Babel no es el último - Los worklets fallan en la transformación; las animaciones se atascan en el hilo JS. Solución: Mueve react-native-reanimated/plugin al final de plugins y ejecuta npx expo start --clear.
Importar Animated desde react-native - Mezclar Animated clásico con estilos worklet causa errores de tipo y tiempo de ejecución. Solución:import Animated from 'react-native-reanimated' para componentes worklet.
Leer valores compartidos en renderizado de React - translateX.value en el cuerpo JSX no se suscribe a actualizaciones. Solución: Solo lee dentro de useAnimatedStyle o useDerivedValue; usa useAnimatedProps para props nativos.
Llamar a setState dentro de useAnimatedStyle - Provoca errores "Tried to synchronously call a function on a non-worklet thread". Solución:runOnJS(setState) solo desde manejadores de final de gesto.
Olvidar GestureHandlerRootView - Los gestos nunca se disparan; los pans parecen congelados. Solución: Envuelve el layout raíz (ver react-native-gesture-handler).
Animar ancho como cadenas de porcentaje incorrectamente - Algunas versiones de RN coaccionan de manera extraña. Solución: Anima ancho numérico desde onLayout o usa flex + scaleX para barras simples.
Trabajo pesado en onUpdate - El análisis JSON o el registro cada frame de pan deja caer frames. Solución: Mantén onUpdate para matemática de valor compartido; difiere el trabajo a onEnd a través de runOnJS.
Verifica que babel.config.js incluya react-native-reanimated/plugin como el último plugin. Reinicia Metro con --clear después de instalar.
¿Cuál es la diferencia entre useSharedValue y useState?
useSharedValue - slot de hilo de UI; sin re-renderizado de React al cambiar; lee en worklets.
useState - estado de React de hilo JS; provoca renderizado; nunca actualices por frame de animación.
¿Cuándo debo usar withTiming vs withSpring?
withTiming cuando el diseño especifica duración exacta (modales, progreso, desvanecimientos cruzados).
withSpring cuando el movimiento debe sentirse físico (drags, ajuste de vuelta, toggles con rebote).
¿Puedo usar Reanimated sin Gesture Handler?
Sí para animaciones de montaje, transiciones de layout, y timing impulsado por presión. Cualquier escenario de conflicto de pan/pinch o scroll debe agregar Gesture Handler.
¿Por qué mi animación funciona en dev pero no en release?
El plugin de Babel faltante es la causa principal - los bundles de producción omiten transformaciones de worklet.
También verifica reglas de Proguard en compilaciones bare de Android y caché de Metro obsoleto después de actualizaciones.
¿Cómo depuro worklets?
Habilita registrador de Reanimated en dev: configureReanimatedLogger (ver Worklets & Bundle Mode).
Si ves "failed to create a worklet", el plugin de Babel está mal configurado.
¿Reanimated 4 requiere New Architecture?
Los proyectos de SDK 57 cada vez más ejecutan New Architecture por defecto. Reanimated 4 apunta a esa pila; la arquitectura más antigua aún puede funcionar pero el soporte del equipo se enfoca en Fabric + Hermes.