Monorepository mit JavaScript: Code-Organisation und Best Practices

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Monorepo mit JavaScript: Code-Organisation und bewährte Praktiken



Moderne JavaScript-Entwicklung (Node.js) steht oft vor dem Problem der Code-Verwaltung in großen Projekten. Wenn die Anzahl der Microservices, Bibliotheken und Anwendungen wächst, beginnen traditionelle Multi-Modul-Repositories (Polyrepo) Chaos zu verursachen: doppelte Konfigurationen, Schwierigkeiten bei der Versionssynchronisation und lange CI/CD-Zeiten. Die Lösung ist ein Monorepo. In diesem Artikel werden wir untersuchen, wie man Code in einem JavaScript-Monorepo organisiert, welche Tools man verwendet und wie man typische Fehler vermeidet.



Was ist ein Monorepo und warum wird es benötigt?



Ein Monorepo ist ein Ansatz, bei dem der gesamte Code eines Projekts (mehrere Anwendungen, Bibliotheken, Dienste) in einem einzigen Repository gespeichert wird. Im Gegensatz zu Polyrepo, bei dem jede Komponente in einem eigenen Git-Repository lebt, vereint das Monorepo alles in einer einzigen Struktur.



Vorteile eines Monorepos für JavaScript:

  • Einheitliche Abhängigkeitsversionen – alle Pakete verwenden dieselben Bibliotheksversionen, was Konflikte ausschließt.
  • Code-Wiederverwendung – gemeinsame Hilfsprogramme und Komponenten können einfach zwischen Unterprojekten importiert werden, ohne dass eine Veröffentlichung in npm erforderlich ist.
  • Atomare Commits – Änderungen in mehreren Paketen können in einem einzigen Commit vorgenommen werden, was Reviews und Rollbacks vereinfacht.
  • Vereinfachtes CI/CD – eine einzige Pipeline für das gesamte Projekt, Caching von Builds und Tests.


Allerdings hat ein Monorepo auch Nachteile: Es erfordert strenge Disziplin bei der Code-Organisation und die richtige Auswahl der Tools. Im Folgenden betrachten wir, wie man die Struktur organisiert und welche Tools man verwendet.



Tools zur Verwaltung eines Monorepos in Node.js



Das JavaScript-Ökosystem bietet mehrere ausgereifte Tools für die Arbeit mit Monorepos. Betrachten wir die drei beliebtesten:



1. Lerna

Ein klassisches Tool, das lange Zeit der Standard war. Lerna verwaltet die Veröffentlichung von Paketen, die Versionierung und das Ausführen von Skripten in allen Paketen. Beispielkonfiguration lerna.json:

{  "version": "independent",  "packages": ["packages/*"],  "npmClient": "yarn"}

Der Befehl lerna bootstrap installiert Abhängigkeiten für alle Pakete und verknüpft sie miteinander.



2. Nx (Nrwl)

Ein moderneres und leistungsfähigeres Tool mit einem erweiterten Caching-System, Abhängigkeitsgraphen und Code-Generatoren. Nx unterstützt nicht nur JavaScript, sondern auch TypeScript, Angular, React, Next.js. Beispielbefehl zum Erstellen einer Bibliothek:

npx nx generate @nrwl/node:library my-lib --directory=shared

Nx analysiert automatisch Abhängigkeiten und baut nur geänderte Pakete neu.



3. Turborepo

Erstellt von Vercel, konzentriert sich Turborepo auf Build-Geschwindigkeit und Einfachheit. Es verwendet intelligentes Caching und parallele Aufgabenausführung. Beispiel turbo.json:

{  "pipeline": {    "build": {      "dependsOn": ["^build"],      "outputs": ["dist/**"]    },    "test": {      "dependsOn": ["build"],      "outputs": []    }  }}

Turborepo ist ideal für Projekte mit vielen Paketen, bei denen die CI-Geschwindigkeit wichtig ist.



Organisation der Projektstruktur in einem Monorepo



Die richtige Ordnerstruktur ist die Grundlage eines erfolgreichen Monorepos. Betrachten wir eine typische Struktur für ein Node.js-Projekt:



my-monorepo/├── packages/│   ├── shared-utils/       # Gemeinsame Hilfsprogramme│   │   ├── src/│   │   │   └── index.js│   │   └── package.json│   ├── api-gateway/        # API-Gateway│   │   ├── src/│   │   │   └── server.js│   │   └── package.json│   └── web-app/            # Webanwendung (React/Vue)│       ├── src/│       │   └── App.js│       └── package.json├── tools/                  # Skripte und Konfigurationen                

Blogs

Buchempfehlungen