Un enfoque de opinión para apoyar múltiples plataformas con React Native utilizando un monoreo de espacios de trabajo de hilados.
Consulte Running React Native en todas partes para obtener una guía en profundidad sobre cómo y por qué recomiendo probar este enfoque si planea admitir múltiples plataformas en su aplicación.

Este Monorepo utiliza espacios de trabajo de hilo y mecanografiado para admitir un proyecto nativo de React modular.
La idea central es aislar el código de la aplicación JavaScript de las configuraciones de la plataforma (código nativo + los agrupadores de aplicaciones como Metro y Webpack).
Este aislamiento ocurre utilizando diferentes espacios de trabajo: tenemos un espacio de trabajo app para el código de aplicación JavaScript, un espacio de trabajo mobile para la configuración móvil React Native, un espacio de trabajo macos para la configuración de macOS nativa React, etc.
Adoptamos completamente nohoist del hilo para permitir el uso de diferentes versiones de React Native en cada plataforma (lo que se recomienda pero no es necesario), simplificando la adopción de nuevas actualizaciones de React Native.
Gracias Nohoist, cada espacio de trabajo de plataforma ( mobile , macos , etc.) puede depender de cualquier versión nativa de React, independientemente de la versión que los otros espacios de trabajo de la plataforma estén utilizando. Por ejemplo, podemos usar [email protected] en la aplicación móvil y [email protected] en la aplicación MacOS, siempre que el código de la aplicación JavaScript admita ambas versiones.
Este enfoque promueve las actualizaciones nativas de reacción gradual sobre las actualizaciones en Lockstep.
Para obtener más detalles, consulte "Ejecutar React Native en todas partes: Configuración de Monorepo en espacios de trabajo de hilos".
️ Tenga en cuenta que no estoy diciendo que esta es la forma correcta de hacer reaccionamiento de Monorepos nativos. Este es solo un enfoque que disfruto usando en bases de código más grandes :)
Puede usar este repositorio como una placa, eliminando los espacios de trabajo de las plataformas que no necesita, o puede crear esta configuración desde cero si desea comprender completamente cómo funciona.
[email protected]:mmazzarolo/react-native-universal-monorepo.gitcd react-native-universal-monorepo && yarnTutorial paso a paso sobre la creación de este repositorio desde cero:
Tutorial para las plataformas TV y NEXT.JS de @TheFinnomenon:
Recursos adicionales:
Comandos de desarrollo y construcción:
yarn android:metro : Inicie el servidor Metro para Android/iOSyarn android:start : comience a desarrollar la aplicación Androidyarn android:studio : Abra la aplicación Android en Android Studioyarn ios:metro : Inicie el servidor Metro para Android/iOSyarn ios:start : comience a desarrollar la aplicación iOSyarn ios:pods : instalar dependencias de iOS Cocoapodsyarn ios:xcode : abra la aplicación iOS en xcodeyarn macos:metro : inicie el servidor de metro para macOSyarn macos:start : comience a desarrollar la aplicación MacOSyarn macos:pods : instalar dependencias de Cocoapods de MacOSyarn macos:xcode : Abra la aplicación MacOS en Xcodeyarn web:start : comenzar a desarrollar la aplicación webyarn web:build : cree una compilación de producción de la aplicación webyarn electron:start : comience a desarrollar la aplicación Electronyarn electron:package:mac : Empaque el binario de producción de la aplicación Electron para macOSyarn electron:package:win : Empaque el binario de producción de la aplicación Electron para Windowsyarn electron:package:linux : Empaque el binario de producción de la aplicación Electron para Linuxyarn browser-ext:start : comenzar a desarrollar la extensión del navegadoryarn browser-ext:build : Crear una compilación de producción de la extensión del navegadoryarn windows:metro : inicie el servidor de metro para Windowsyarn windows:start : comience a desarrollar la aplicación Windowsyarn tv:android:metro : Inicie el servidor Metro para Android TVyarn tv:android:start : Comience a desarrollar la aplicación Android TVyarn tv:android:studio : Abra la aplicación Android TV en Android Studioyarn tv:tvos:metro : Inicie el servidor de metro para TVOSyarn tv:tvos:start : Comience a desarrollar la aplicación TVOSyarn tv:tvos:xcode : Abra la aplicación TVOS en Xcodeyarn tv:tvos:pods : Instalar Dependencias de Cocoapods de TVOSyarn next:start : Inicie la aplicación Next.jsyarn next:build : Build the Next.js Appyarn next:serve : servir la compilación de la aplicación Next.jsOtros comandos (usamos Ultra-Runner para ejecutar estos comandos en todos los espacios de trabajo):
yarn lint : pelusa cada proyectoyarn lint:fix : pelusa + arreglar cada proyectoyarn test : ejecutar pruebas de cada proyectoyarn typecheck : ejecute el tipo de comprobación de tipo mecanografiado en cada proyecto Mientras trabaja en React Native en un Monorepo, notará que varios paquetes no funcionarán correctamente cuando se iban, ya sea porque necesitan estar de forma nativa o porque terminan siendo agrupados dos veces, rompiendo la construcción (por ejemplo, react , react-dom ).
Este no es un problema con el enfoque utilizado en este proyecto per se. Es más un problema común con los Monorepos.
Para solucionar estos problemas, los marcamos como nohoist, por lo que se instalarán en cada paquete que depende de ellos.
En este monoreso, puede ver un ejemplo de tales bibliotecas en react-native-async-storage .
En las configuraciones de Metro Bundler y Webpack utilizadas en todo el Monorepo, estamos utilizando un conjunto de herramientas de construcción para garantizar que los paquetes no vacíos se resuelvan correctamente.
Entonces, mientras agregue estas bibliotecas a la lista nohoist , ¿debería estar listo para comenzar?
Nos esforzamos por hacer que esta configuración sea compatible con Yarn Classic, pero, con algunos ajustes, también es compatible con Yarn 2+ (proporcionando todos los beneficios de Yarn 2+).
Ver #22 para obtener más información.
yarn set version berry en la raíz del proyecto. Creará un archivo .yarnrc.yml ..yarnrc.yml para garantizar que los directorios node_modules se creen en cada espacio de trabajo: nodeLinker : node-modules
nmHoistingLimits : workspacesnmHositingLimits dice cómo izar dependencias para cada espacio de trabajo. Al configurarlo en workspaces todas las dependencias se instalarán en el node_modules de cada espacio de trabajo en lugar de ser elevados a la carpeta raíz. Esto significa que ahora puede que pueda de manera segura la sección noHoist en el package.json de raíz.json.Echa un vistazo a la guía "Presentando" de Yarn 2+para obtener más información.
En algunos casos, Yarn Classic no podrá resolver las dependencias correctas que tienen una peerDependency en react-native .
Ver #22 para ver algunas soluciones. Una solución en el repositorio react-native-monorepo-tools está en el trabajo.
¡Las contribuciones, las discusiones y los comentarios son bienvenidos! Pregunte si hay planes activos en los cambios de características antes de enviar nuevos PR.