Monorepositorio con JavaScript: organización de código para principiantes
Con el crecimiento del proyecto y la aparición de lógica común que debe reutilizarse en diferentes partes de la aplicación, los desarrolladores se enfrentan al problema de la organización del código. Muchos comienzan a copiar archivos, crear paquetes npm separados o módulos enredados. La solución a este problema es el monorepositorio (monorepo). En este artículo, analizaremos qué es un monorepositorio, por qué es necesario en el ecosistema de JavaScript (Node.js) y cómo configurarlo con herramientas populares. El artículo está dirigido a desarrolladores principiantes que ya están familiarizados con los conceptos básicos de Node.js y npm.
¿Qué es un monorepositorio y por qué es necesario?
Un monorepositorio es un enfoque para organizar el código en el que todos los proyectos, bibliotecas y servicios se almacenan en un solo repositorio (por ejemplo, en GitHub). A diferencia de un multirepositorio (multirepo), donde cada proyecto tiene su propio repositorio, un monorepositorio lo unifica todo en un solo lugar.
Principales ventajas:
- Control de versiones unificado: Es más fácil gestionar los cambios que afectan a varios paquetes.
- Reutilización de código: Las utilidades, tipos y configuraciones comunes están cerca y no requieren publicación en npm.
- Simplificación de la refactorización: Los cambios en un paquete se prueban automáticamente junto con otros.
- Compilación y pruebas unificadas: Se pueden ejecutar pruebas para todos los paquetes con un solo comando.
Sin embargo, el monorepositorio también tiene desventajas: puede volverse demasiado grande y la gestión de dependencias puede volverse compleja. Para resolver estos problemas, existen herramientas especiales.
Herramientas para trabajar con monorepositorios en JavaScript
En el ecosistema de Node.js, hay varias herramientas populares para gestionar monorepositorios. Veremos las dos más comunes: NPM Workspaces (integrado en npm) y Lerna.
NPM Workspaces
A partir de la versión npm 7, se agregó soporte integrado para monorepositorios a través de workspaces. Esta es una forma simple y ligera de organizar el código sin instalar paquetes adicionales.
Para la configuración, basta con crear un package.json raíz y especificar las carpetas con los paquetes:
// package.json (raíz){ "name": "my-monorepo", "private": true, "workspaces": [ "packages/*" ]}Luego, cree la estructura de carpetas:
my-monorepo/├── package.json├── packages/│ ├── utils/│ │ ├── package.json│ │ └── index.js│ └── app/│ ├── package.json│ └── index.jsAhora, si el paquete app depende de utils, simplemente puede especificarlo en las dependencias:
// packages/app/package.json{ "name": "@my/app", "dependencies": { "@my/utils": "*" }}Después de ejecutar npm install en la raíz del proyecto, npm creará enlaces simbólicos entre los paquetes. Esto significa que puede desarrollar ambos paquetes simultáneamente, y los cambios en utils estarán disponibles inmediatamente en app.
Lerna
Lerna es una herramienta más potente que a menudo se usa junto con NPM Workspaces o Yarn Workspaces. Agrega capacidades para publicar paquetes, versionar y ejecutar comandos en todos los paquetes.
Instalación de Lerna:
npm install -g lernaCreación de configuración:
lerna initEsto creará un archivo lerna.json y una estructura básica. Ejemplo de configuración:
// lerna.json{ "version": "0.0.0", "packages": ["packages/*"], "npmClient": "npm"}Lerna permite ejecutar comandos en todos los paquetes:
lerna run testlerna run buildY también gestionar las versiones de los paquetes.