Volver al blog
React Native: 5 lecciones después de 3 años en producción

React Native: 5 lecciones después de 3 años en producción

Lo que aprendimos manteniendo apps React Native en producción real. Errores que cometimos, patrones que funcionaron y lo que haríamos diferente.

8 de octubre de 2024 @devlabscl 3 min de lectura
react-native mobile produccion lecciones

No es lo mismo un demo que producción

React Native es genial para demos. En 2 días tienes algo funcionando en ambas plataformas. El problema empieza cuando esa app tiene que funcionar para miles de usuarios reales con dispositivos reales.

Estas son las lecciones que aprendimos manteniendo apps en producción durante 3 años.

1. La navegación define la arquitectura

Elegir entre React Navigation y Expo Router no es una decisión menor. Define cómo organizas toda la app.

Nuestra recomendación actual: Expo Router si arrancas de cero. El routing basado en archivos simplifica mucho la estructura y el deep linking viene gratis.

2. No ignores los renders innecesarios

En web, un re-render de más es imperceptible. En mobile, puede significar la diferencia entre una app fluida y una que el usuario desinstala.

// ❌ Esto causa re-renders en cada componente hijo
<Context.Provider value={{ user, settings, theme }}>

// ✅ Separar contextos por frecuencia de cambio
<UserProvider value={user}>
  <ThemeProvider value={theme}>
    <SettingsProvider value={settings}>

Usamos React.memo, useMemo y useCallback con criterio — no en todos lados, sino donde el profiler muestra problemas reales.

3. Las actualizaciones OTA son imprescindibles

Depender solo de App Store y Google Play para deployar fixes es inaceptable. EAS Update (antes CodePush) permite enviar actualizaciones JavaScript sin pasar por review.

Un bug crítico en producción un viernes a las 6pm se resuelve en minutos, no en días.

4. Testea en dispositivos reales, siempre

El simulador miente. Especialmente en:

  • Performance — El simulador corre en tu Mac M1. Un Android de gama media es otra historia.
  • Permisos — Cámara, ubicación, notificaciones. Cada OS tiene sus particularidades.
  • Gestos — El scroll, los swipes, el haptic feedback. Solo se validan con el dedo.

Tenemos un pool de dispositivos físicos para testing. No es negociable.

5. El tamaño del bundle importa más de lo que crees

Cada librería que agregas suma al tamaño del bundle y al tiempo de inicio. Hemos visto apps que tardan 4 segundos en arrancar porque importan 15 librerías en el entry point.

Regla: si una librería solo se usa en una pantalla, se carga lazy. Si solo necesitas una función de lodash, la escribes a mano.

Lo que haríamos diferente

Si arrancáramos hoy desde cero:

  • Expo desde el día 1 — Ya no hay razón para hacer bare workflow salvo casos muy específicos.
  • TypeScript estricto — Sin any, sin excepciones.
  • Monorepo con la API — Compartir tipos entre frontend y backend elimina una clase entera de bugs.