Monorepositorio con JavaScript: organización de código en la práctica
\n\nEl desarrollo de proyectos complejos en JavaScript (Node.js) a menudo se enfrenta al problema de la gestión del código. Cuando tienes varios paquetes, bibliotecas o microservicios, cada uno viviendo en su propio repositorio, esto conduce a la duplicación de código, dificultad en la sincronización de versiones y ralentización del CI/CD. La solución es un monorepositorio (monorepo). En este artículo, analizaremos cómo organizar un monorepositorio con JavaScript en la práctica: desde la selección de herramientas hasta la configuración de la compilación y la publicación.
\n\n¿Qué es un monorepositorio y por qué es necesario?
\n\nUn monorepositorio es un enfoque para la gestión de código donde todos los paquetes, bibliotecas y aplicaciones del proyecto se almacenan en un solo repositorio. A diferencia de los multirepositorios (cada paquete en su propio repo), un monorepositorio ofrece:
\n\n- \n
- Historial de cambios unificado: fácil de rastrear cómo los cambios en una parte afectan a otra. \n
- Reutilización de código: utilidades y componentes comunes viven en un solo lugar sin necesidad de publicarlos en npm. \n
- Refactorización simplificada: el cambio de API de un paquete es inmediatamente visible en todos los dependientes. \n
- Configuración unificada de CI/CD: un solo archivo de configuración para todos los paquetes. \n
Para JavaScript (Node.js), el monorepositorio es especialmente relevante, ya que permite eliminar el "infierno de las dependencias" y acelerar el desarrollo. Consideremos la implementación práctica.
\n\nHerramientas para monorepositorio en JavaScript
\n\nEn el mercado hay varias herramientas populares. Consideraremos dos principales: npm workspaces (integrado en npm) y Lerna (funcionalidad ampliada).
1. npm workspaces (soporte integrado)
\n\nA partir de npm v7, el gestor de paquetes admite workspaces. Esta es la forma más sencilla de empezar. Ejemplo de estructura de proyecto:
\n\nmy-monorepo/\n├── packages/\n│ ├── core/\n│ │ ├── package.json\n│ │ └── index.js\n│ ├── utils/\n│ │ ├── package.json\n│ │ └── helpers.js\n│ └── app/\n│ ├── package.json\n│ └── server.js\n├── package.json\n└── lerna.json (opcional)\n\npackage.json raíz:
{\n "name": "my-monorepo",\n "private": true,\n "workspaces": ["packages/*"]\n}\n\nAhora todos los paquetes en packages/* se enlazan automáticamente. Para instalar dependencias, basta con ejecutar npm install en la raíz. Las dependencias entre paquetes se indican de forma estándar:
// packages/app/package.json\n{\n "name": "@my/app",\n "dependencies": {\n "@my/core": "*",\n "@my/utils": "*"\n }\n}\n\nnpm workspaces crea enlaces simbólicos en la carpeta node_modules, por lo que las importaciones funcionan como con paquetes normales.
2. Lerna (gestión avanzada)
\n\nLerna es una herramienta para gestionar monorepositorios con capacidad de publicación, versionado y ejecución de scripts en paralelo. Instalación:
\n\nnpm install --global lerna\n\nInicialización en el proyecto:
\n\nlerna init\n\nArchivo lerna.json:
{\n "version": "independent",\n "npmClient": "npm",\n "packages": ["packages/*"]\n}\n\nEl modo independent permite que cada paquete tenga su propia versión. Comandos principales:
- \n
lerna bootstrap— instala dependencias y enlaza paquetes. \n lerna run build— ejecuta el scriptbuilden todos los paquetes. \n lerna publish— publica los paquetes modificados en npm. \n
Organización práctica del código
\n\nConsideremos un ejemplo de configuración de un monorepositorio para una aplicación web con backend en Node.js y utilidades compartidas.
\n\nPaso 1: Estructura básica
\n\nCrearemos tres paquetes:
\n\nBlogs
Book Recommendations
Leer también
PHP vs Python para backend: ¿qué elegir en 2025?
Funciones en Python: declaración, argumentos, retorno y variables globales