#DEVELOPMENT

Optimierung von Projektstrukturen: Ein neuer Ansatz mit pnpm und concurrently

05. Juli 2024

2 min Lesezeit

image (1).png

Es stellt eine ständige Herausforderung dar, Code in großen Projekten zu organisieren und zu verwalten, besonders in Monorepo-Strukturen, wo sämtlicher Code in einem einzigen Repository liegt. Solche Konstellationen bringen schnell Schwierigkeiten mit sich. Ein prägnantes Beispiel hierfür sind Projekte, die auf die Kombination von Strapi und Next.js setzen. Wir sind auf das Problem gestoßen, dass unterschiedliche Versionen von React zu Komplikationen führten. Die Bewältigung dieses Problems erforderte ein umständliches Hantieren mit Ausnahmen und Resolutions in den package.json-Dateien, was wiederum die Wartung erheblich erschwerte.

Der Wechsel zu einem neuen System

Um diese Herausforderungen zu bewältigen, haben wir uns für einen neuen Ansatz entschieden: den Übergang zu einem Pseudo-Workspace-Projekt, unterstützt durch die Tools pnpm und concurrently. Aber warum gerade diese Kombination?

  1. Die Vorteile von pnpm: pnpm optimiert die Handhabung verschiedener Versionen von Abhängigkeiten, indem es diese isoliert installiert. Das bedeutet, dass jede Version nur einmal gespeichert wird und bei Bedarf verlinkt wird. Dadurch sparst du nicht nur Speicherplatz, sondern reduzierst auch Konflikte. Zudem bietet pnpm eine effiziente Installation und Verwaltung von Abhängigkeiten durch globale Installationen, was insbesondere in großen Projekten nützlich ist.
  2. Die Rolle von concurrently: Mit concurrently kannst du mehrere Skripte parallel ausführen. Das ist besonders praktisch, wenn du in Entwicklungsumgebungen arbeitest, in denen verschiedene Services oder Prozesse gleichzeitig laufen müssen.

Die Herausforderungen und Lösungen

Die Umstellung auf dieses System erfordert anfangs mehr Aufwand. Skripte müssen angepasst und Projektkonfigurationen geändert werden, um die Vorteile von pnpm voll auszuschöpfen. Doch die Vorteile überwiegen:

  • Bessere Handhabung von unterschiedlichen Dependency-Versionen: Durch die Isolierung der Installationen werden Konflikte reduziert.
  • Effizientere Nutzung von Speicherplatz und schnellere Installationen: Dank der Symlink-Strategie von pnpm.
  • Verbesserte Kompatibilität und Steuerbarkeit der Entwicklungsumgebung: Durch die parallele Ausführung von Prozessen mit concurrently.

Technischer Anhang: Ein praktisches Beispiel

Um die praktische Anwendung unseres neuen Ansatzes zu verdeutlichen, stellen wir dir ein konkretes Codebeispiel vor. Dieses Skript zeigt, wie du in einem Pseudo-Workspace-Projekt mit pnpm und concurrently verschiedene Entwicklungs-Server parallel starten kannst.

Das Skript im Detail:

 

Erklärung des Skripts:

  • Einrichtung des Arbeitsumfelds: Zuerst wird das Basisverzeichnis auf das Wurzelverzeichnis des Projekts gesetzt. Das appsDir ist der Ordner, in dem sich alle Unterprojekte befinden.
  • Ermittlung der Unterprojekte: Mit der Funktion getDirectories werden alle Unterverzeichnisse im appsDir ermittelt. Diese repräsentieren die verschiedenen Unterprojekte, für die Entwicklungs-Server gestartet werden sollen.
  • Paralleles Ausführen der Entwicklungs-Server: Die Funktion startDevConcurrently konstruiert für jedes Unterprojekt einen Befehl, der in das jeweilige Verzeichnis wechselt und dort pnpm run dev ausführt. Diese Befehle werden dann mit dem Tool concurrently parallel ausgeführt. Die Option --names gibt den Projekten Namen, und -c "auto" wählt automatisch unterschiedliche Farben für die Ausgabe in der Konsole, um diese leichter unterscheidbar zu machen.

Dieses Skript ermöglicht eine effiziente und flexible Entwicklungsumgebung, in der Änderungen an verschiedenen Teilen eines Projekts gleichzeitig und unabhängig voneinander bearbeitet werden können. Die parallele Ausführung spart Zeit und erleichtert die Arbeit in komplexen Projekten erheblich.

Fazit

Die Umstellung auf ein Pseudo-Workspace-Projekt mit pnpm und concurrently bietet langfristig zahlreiche Vorteile. Trotz des initialen Mehraufwands verbessert dieser Ansatz die Wartbarkeit, Effizienz und Kompatibilität des Projekts. Für große und komplexe Projekte ist diese Umstellung daher eine sinnvolle Entscheidung.

MORE