© Intpro/Shutterstock.com
Die systematische Nutzung des npm-Paketmanagers

Es kommt nicht nur auf die letzte Meile an


Der npm-Paketmanager hat das Leben zahlreicher Entwickler deutlich vereinfacht. Auch wenn es immer wieder Sicherheitsprobleme gab, so steht der Paketmanager doch für eine wahre Erfolgsgeschichte. Folgt man einigen Best Practices, lässt es sich noch komfortabler damit arbeiten.

Der Node Package Manager hat sich in den letzten Jahren zum De-facto-Standardpaketmanager für JavaScript entwickelt. Weitere Paketmanager wie beispielsweise Yarn oder pnpm verfolgen die gleiche Idee und, was noch viel wichtiger ist, beziehen die Pakete aus der derselben Quelle. Wenn Sie also ein Paket in das npm Repository publizieren, ist Ihr Paket auch unter den anderen Paketmanagern verfügbar. Diese greifen entweder direkt auf das Repository zu oder erzeugen eine Kopie des Repositorys. npm ist nicht nur in der JavaScript-Welt eine feste Größe, auch insgesamt betrachtet ist npm nach den Zahlen von www.modulecounts.com der umfangreichste Paketmanager im Vergleich mit populären Paketmanagern anderer Programmiersprachen, wie beispielsweise Maven Central für Java oder Packagist für PHP. npm ist mittlerweile nicht nur die Quelle für Erweiterungen der Node.js-Plattform, sondern ein Paketmanager für das gesamte JavaScript-Ökosystem. Egal, ob Sie serverseitige Frameworks wie Express oder Nest, plattformunabhängige Bibliotheken wie lodash oder Frontend-Bibliotheken und Frameworks wie Angular, Vue oder React suchen, Sie werden alle über npm ausgeliefert. Doch warum ist npm so populär? Ein Grund hierfür ist sicherlich die geringe Einstiegshürde beim Publizieren von Paketen. Sie benötigen lediglich einen Account auf https://npmjs.com, für den Sie sich kostenlos registrieren können, und schon können Sie Ihr eigenes Paket veröffentlichen. Dieser Vorteil kann allerdings auch als einer der größten Nachteile des JavaScript-Ökosystems gesehen werden. Es gibt keinerlei Qualitätskontrolle für Pakete und keine Garantie, dass sich nicht in einem Paket Schadcode verbirgt. Theoretisch müssten Sie jedes Paket überprüfen, bevor Sie es in Ihre Applikation integrieren. Das geschieht jedoch in den seltensten Fällen, da eine umfassende Prüfung gerade bei größeren Paketen oder Paketen mit sehr vielen Abhängigkeiten den Rahmen sprengen würde. Viele Entwickler verlassen sich auf die sehr aktive Open-Source-Gemeinde, die sich um npm gebildet hat. Wird ein Sicherheitsproblem festgestellt, wird es gemeldet und bei einem npm-Audit als bekanntes Problem aufgelistet.

An dieser Stelle stellt sich die Frage: Was können Sie als Entwickler tun, damit die Qualität Ihres Pakets einen gewissen Maßstab erfüllt? Über die Jahre haben sich einige Best Practices herausgebildet, die wir uns im Folgenden näher ansehen werden. Als Beispiel für ein solches Paket implementieren wir eine Bibliothek mit dem Namen Math-Demo, die eine Schnittstelle für die vier Grundrechenarten zur Verfügung stellt. Diese Bibliothek soll in einer JavaScript- und einer TypeScript-Variante implementiert werden.

Die Grundlagen eines neuen Pakets

Öffentliche npm-Pakete unterliegen in der Regel einer Open-Source-Lizenz und werden meist für alle einsehbar auf GitHub verwaltet. Die Versionskontrolle ist ein unverzichtbares Hilfsmittel bei der Arbeit mit npm-Paketen. Egal, ob Sie Ihr Paket auf GitHub oder bei einem beliebigen anderen Git Hoster verwalten, der erste Schritt im Leben eines npm-Pakets ist im Normalfall die Erstellung eines Repositorys, das Sie im Anschluss lokal klonen. Und schon hier stehen Sie vor der ersten Herausforderung: Den Namen des Repositorys sollten Sie möglichst so wählen, dass er das Paket präzise beschreibt und auch als Paketname verwendet werden kann.

Nachdem Sie das Repository angelegt und geklont haben, erzeugen Sie im Wurzelverzeichnis Ihres Pakets zunächst eine .gitignore-Datei, in der Sie die Dateien und Verzeichnisse ignorieren, die nicht in der Versionskontrolle laden sollen. Einen Eintrag, den Sie auf jeden Fall in die .gitignore-Datei aufnehmen sollten, ist das node_modules-Verzeichnis. In diesem Verzeichnis werden die Abhängigkeiten Ihres Pakets gespeichert. Diese Abhängigkeiten werden im npm Repository vorgehalten. Deshalb gibt es keinen Grund, den gesamten Quellcode in Ihrem Repository selbst erneut zu speichern.

Eine weitere Datei, die Sie neben der .gitignore-Datei initial anlegen sollten, trägt den Namen README.md; eine Datei im Markdown-Format, die die Dokumentation des Pakets enthält. Was Sie hier auf jeden Fall aufführen müssen, ist, wie Ihr Paket installiert wird. Im Normalfall ist das mit dem Kommando npm install <Paketname> erledigt. Es besteht aber auch die Möglichkeit, dass für die Installation zusätzliche Anforderungen erfüllt werden müssen oder es sonstige Besonderheiten gibt, die ein Entwickler beachten muss. All diese Punkte nehmen Sie in die Dokumentation mit auf. Im Fall unseres Beispiels erfolgt die Installation mit dem Befehl npm install math-demo. In der README.md können Sie für die Benutzer Ihres Pakets auch noch weitere Paketmanager abdecken. Anschließend dokumentieren Sie die Schnittstellen und deren Verwendung Ihres Pakets, also wie ein Benutzer das Paket einbinden und verwenden sollte. Die Devise lautet hier: je ausführlicher desto besser. Sparen Sie an dieser Stelle auch nicht mit Codebeispielen. Diese eignen sich hervorragend als Copy-Paste-Vorlagen und erleichtern ebenfalls den Einsatz Ihres Pakets. Nach diesen Vorbereitungen geht es nun an die eigentliche Implementierungsarbeit. Der erste Schritt besteht aus der Erstellung einer package.json-Datei. Diese befindet sich wie die anderen beiden Dateien auch im Wurzelverzeichnis Ihres Pakets. Da es sich bei dieser Datei um eine einfache Textdatei im JSON-Format handelt, können Sie sie entweder von Hand anlegen oder Sie nutzen den Befehl npm init auf der Kommandozeile, um die Datei über einen interaktiven Prozess zu erzeugen. Während dieses Prozesses werden Sie nach einigen Informationen über Ihr Paket gefragt:

  • Name Ihres Projekts: Für unser Paket lautet der Name math-demo, der unter dem Schlüssel name gespeichert wird. Für den Namen eines npm-Pakets gelten eine Reihe von Regeln: Die maximale Länge ist auf 214 Zeichen beschränkt, der Name darf nicht mit einem Punkt oder einem Unterstrich beginnen, es sind nur Kleinbuchstaben erlaubt, der Paketname darf nur aus Zeichen bestehen, die auch in URLs erlaubt sind.

  • Versionsnummer: Für die Versionierung eines npm-Pakets wird der Semantic-Versioning-Ansatz empfohlen. Er arbeitet mit Major-Version, Minor-Version und Patch-Level. Änderungen an den Schnittstellen Ihres Pakets sind nur in Verbindung mit Major-Updates erlaubt. Interne Änderungen äußern sich je nach Umfang in einer Erhöhung der Minor-Version oder des Patch-Levels. Weitere Informationen zum Semantic Versioning fi...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang