Monorepo mit JavaScript: Code-Organisation in der Praxis
\n\nDie Entwicklung komplexer Projekte mit JavaScript (Node.js) steht oft vor dem Problem der Code-Verwaltung. Wenn Sie mehrere Pakete, Bibliotheken oder Microservices haben, die jeweils in ihrem eigenen Repository leben, führt dies zu Code-Duplizierung, Schwierigkeiten bei der Versionssynchronisation und verlangsamten CI/CD-Prozessen. Die Lösung ist ein Monorepo. In diesem Artikel werden wir uns ansehen, wie man ein Monorepo mit JavaScript in der Praxis organisiert: von der Auswahl der Tools bis zur Einrichtung des Builds und der Veröffentlichung.
\n\nWas ist ein Monorepo und warum wird es benötigt?
\n\nEin Monorepo ist ein Ansatz zur Code-Verwaltung, bei dem alle Pakete, Bibliotheken und Anwendungen eines Projekts in einem einzigen Repository gespeichert werden. Im Gegensatz zu Multi-Repositories (jedes Paket in seinem eigenen Repo) bietet ein Monorepo:
\n\n- \n
- Einheitliche Änderungshistorie: Einfach nachvollziehen, wie sich Änderungen in einem Teil auf einen anderen auswirken. \n
- Code-Wiederverwendung: Gemeinsame Hilfsprogramme und Komponenten leben an einem Ort ohne Veröffentlichung in npm. \n
- Vereinfachtes Refactoring: Eine API-Änderung eines Pakets ist sofort in allen abhängigen Paketen sichtbar. \n
- Einheitliche CI/CD-Einstellungen: Eine Konfigurationsdatei für alle Pakete. \n
Für JavaScript (Node.js) ist ein Monorepo besonders relevant, da es hilft, den "Abhängigkeits-Overkill" zu vermeiden und die Entwicklung zu beschleunigen. Betrachten wir die praktische Umsetzung.
\n\nTools für Monorepos in JavaScript
\n\nAuf dem Markt gibt es mehrere beliebte Tools. Wir werden zwei Hauptwerkzeuge betrachten: npm workspaces (integriert in npm) und Lerna (erweiterte Funktionalität).
1. npm workspaces (integrierte Unterstützung)
\n\nAb npm v7 unterstützt der Paketmanager workspaces. Dies ist der einfachste Weg, um zu beginnen. Beispiel einer Projektstruktur:
\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 (optional)\n\nRoot-package.json:
{\n "name": "my-monorepo",\n "private": true,\n "workspaces": ["packages/*"]\n}\n\nJetzt werden alle Pakete in packages/* automatisch verlinkt. Um Abhängigkeiten zu installieren, reicht es aus, npm install im Root-Verzeichnis auszuführen. Abhängigkeiten zwischen Paketen werden standardmäßig angegeben:
// packages/app/package.json\n{\n "name": "@my/app",\n "dependencies": {\n "@my/core": "*",\n "@my/utils": "*"\n }\n}\n\nnpm workspaces erstellt Symlinks im Ordner node_modules, sodass Importe wie bei normalen Paketen funktionieren.
2. Lerna (fortschrittliche Verwaltung)
\n\nLerna ist ein Tool zur Verwaltung von Monorepos mit der Möglichkeit der Veröffentlichung, Versionierung und parallelen Ausführung von Skripten. Installation:
\n\nnpm install --global lerna\n\nInitialisierung im Projekt:
\n\nlerna init\n\nDatei lerna.json:
{\n "version": "independent",\n "npmClient": "npm",\n "packages": ["packages/*"]\n}\n\nDer Modus independent erlaubt es jedem Paket, seine eigene Version zu haben. Hauptbefehle:
- \n
lerna bootstrap— installiert Abhängigkeiten und verlinkt Pakete. \n lerna run build— führt das Skriptbuildin allen Paketen aus. \n lerna publish— veröffentlicht geänderte Pakete in npm. \n
Praktische Code-Organisation
\n\nBetrachten wir ein Beispiel für die Einrichtung eines Monorepos für eine Webanwendung mit einem Backend in Node.js und gemeinsamen Hilfsprogrammen.
\n\nSchritt 1: Grundlegende Struktur
\n\nWir erstellen drei Pakete:
\n\nBlogs
Buchempfehlungen
Lesen Sie auch
Beste IDEs und Tools für die Swift-Entwicklung im Jahr 2025