En realidad, si utilizas Lerna y quieres usarlo con YARN, Lerna simplemente delegará la vinculación de paquetes a YARN. Y en este caso, especificamos cuáles son los paquetes, pero cuando hacemos la instalación o queremos vincularlos, instalará los módulos de nodo como si fueran paquetes normales, pero en realidad, se vinculará a la carpeta en el repositorio donde se encuentra el paquete.
Funciona perfectamente cuando trabajas con JavaScript básico. Es un poco menos ideal si trabajas con algo que requiere un proceso de compilación como TypeScript o módulos, y así sucesivamente, si necesitas Babel, entonces debes especificar la carpeta dist en lugar de build y asegurarte de que todo esté compilado correctamente.
Me gustaría mencionar nuevamente, una forma menos ortodoxa es utilizar la ruta de TypeScript. En lugar de especificar cuáles son los paquetes, puedes especificar las rutas de tus archivos TypeScript a los diferentes paquetes y simplemente usarlos. Pero podría ser una buena opción si lo usas para aplicaciones y estás construyendo múltiples aplicaciones. No es puramente un mono-repo, pero también es una forma posible.
Y la última estrategia se trata de la instalación. Y aquí me refiero a los módulos externos, a los módulos de NPM que deseas agregar en cada uno de los paquetes. Aquí hay algunas estrategias. Puedes especificar todos los paquetes que necesitas en la raíz de tu espacio de trabajo. Y esto solo es útil si estás construyendo una aplicación que tiene algún tipo de proceso de empaquetado. De lo contrario, obviamente no podrás instalar los otros como microservicios u otros paquetes porque las dependencias no existirán allí. Pero si estás trabajando con aplicaciones y utilizando un empaquetado, esta podría ser una buena opción. Tendrás menos problemas al intentar actualizar, menos incompatibilidades entre versiones. Y esto podría ser útil.
Pero si optas por el enfoque más tradicional, es decir, cada paquete tiene su propio package y tiene un conjunto de dependencias, entonces la primera opción es hacer una instalación local. Lo que significa que tienes las dependencias, y debajo de cada paquete tienes una carpeta de módulos de nodo y se instalará allí. Y luego te aseguras de que puedas tener diferentes versiones para diferentes paquetes. Esto lo hace muy autónomo.
Otra opción, y nuevamente, el gestor de paquetes lo admite, es hacer una elevación. Lo que significa que todo sigue definido a nivel de paquete, pero cuando se instala, se instala en un modelo de nodo único en la raíz, a menos que haya incompatibilidades de versiones. Y la razón por la que esto funciona es porque cuando Node busca un paquete, simplemente sube por el árbol e intenta encontrar el paquete en algún lugar más alto de la jerarquía. El riesgo aquí es que olvides agregar algún paquete en uno de tus paquetes y luego cuando lo implementes, no tengas ningún problema durante las pruebas o el desarrollo local porque está almacenado en algún lugar debido a otro paquete. Pero luego, cuando vayas a implementar solo este paquete en tu máquina de producción o en una máquina en pie, podrías obtener algunos errores y hay reglas de vinculación. Hay una regla de ESLint que verifica esto. Así que no tenemos que confiar en nuestra memoria y capacidad mental.
Entonces, para resumir, si queremos utilizar el monorepo, primero debemos entender qué es el alcance, qué queremos incluir en nuestro monorepo. No tiene que ser todo el código. Luego queremos definir cuáles son las estrategias que vamos a utilizar para la versión, la compilación, el proceso de desarrollo, cómo vamos a vincular los diferentes paquetes y cuál es nuestro método de instalación.
Comments