Monorepo mit JavaScript: Code-Organisation in der Praxis

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 in der Praxis

\n\n

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

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

\n\n

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

Tools für Monorepos in JavaScript

\n\n

Auf dem Markt gibt es mehrere beliebte Tools. Wir werden zwei Hauptwerkzeuge betrachten: npm workspaces (integriert in npm) und Lerna (erweiterte Funktionalität).

\n\n

1. npm workspaces (integrierte Unterstützung)

\n\n

Ab npm v7 unterstützt der Paketmanager workspaces. Dies ist der einfachste Weg, um zu beginnen. Beispiel einer Projektstruktur:

\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 (optional)
\n\n

Root-package.json:

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

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

\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 erstellt Symlinks im Ordner node_modules, sodass Importe wie bei normalen Paketen funktionieren.

\n\n

2. Lerna (fortschrittliche Verwaltung)

\n\n

Lerna ist ein Tool zur Verwaltung von Monorepos mit der Möglichkeit der Veröffentlichung, Versionierung und parallelen Ausführung von Skripten. Installation:

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

Initialisierung im Projekt:

\n\n
lerna init
\n\n

Datei lerna.json:

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

Der Modus independent erlaubt es jedem Paket, seine eigene Version zu haben. Hauptbefehle:

\n\n
    \n
  • lerna bootstrap — installiert Abhängigkeiten und verlinkt Pakete.
  • \n
  • lerna run build — führt das Skript build in allen Paketen aus.
  • \n
  • lerna publish — veröffentlicht geänderte Pakete in npm.
  • \n
\n\n

Praktische Code-Organisation

\n\n

Betrachten wir ein Beispiel für die Einrichtung eines Monorepos für eine Webanwendung mit einem Backend in Node.js und gemeinsamen Hilfsprogrammen.

\n\n

Schritt 1: Grundlegende Struktur

\n\n

Wir erstellen drei Pakete:

\n\n

Blogs

Buchempfehlungen