Monorepositorio con JavaScript: organización de código en la práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Monorepositorio con JavaScript: organización de código en la práctica

\n\n

El 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\n

Un 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
\n\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\n

Herramientas para monorepositorio en JavaScript

\n\n

En el mercado hay varias herramientas populares. Consideraremos dos principales: npm workspaces (integrado en npm) y Lerna (funcionalidad ampliada).

\n\n

1. npm workspaces (soporte integrado)

\n\n

A 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\n
my-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\n

package.json raíz:

\n\n
{\n  "name": "my-monorepo",\n  "private": true,\n  "workspaces": ["packages/*"]\n}
\n\n

Ahora 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:

\n\n
// packages/app/package.json\n{\n  "name": "@my/app",\n  "dependencies": {\n    "@my/core": "*",\n    "@my/utils": "*"\n  }\n}
\n\n

npm workspaces crea enlaces simbólicos en la carpeta node_modules, por lo que las importaciones funcionan como con paquetes normales.

\n\n

2. Lerna (gestión avanzada)

\n\n

Lerna es una herramienta para gestionar monorepositorios con capacidad de publicación, versionado y ejecución de scripts en paralelo. Instalación:

\n\n
npm install --global lerna
\n\n

Inicialización en el proyecto:

\n\n
lerna init
\n\n

Archivo lerna.json:

\n\n
{\n  "version": "independent",\n  "npmClient": "npm",\n  "packages": ["packages/*"]\n}
\n\n

El modo independent permite que cada paquete tenga su propia versión. Comandos principales:

\n\n
    \n
  • lerna bootstrap — instala dependencias y enlaza paquetes.
  • \n
  • lerna run build — ejecuta el script build en todos los paquetes.
  • \n
  • lerna publish — publica los paquetes modificados en npm.
  • \n
\n\n

Organización práctica del código

\n\n

Consideremos un ejemplo de configuración de un monorepositorio para una aplicación web con backend en Node.js y utilidades compartidas.

\n\n

Paso 1: Estructura básica

\n\n

Crearemos tres paquetes:

\n\n

Blogs

Book Recommendations