Verwalten von Updates der Abhängigkeiten im Node.js-Paket

Abgeschlossen

Als Entwickler bei Tailwind Traders ist es wichtig, dass Sie unsere Pakete auf dem neuesten Stand halten. Dadurch wird sichergestellt, dass wir die neuesten Funktionen und Fixes verwenden. Dies trägt außerdem dazu bei, Sicherheitsrisiken zu vermeiden. In dieser Lektion erfahren Sie, wie Sie Abhängigkeiten in einem Node.js-Projekt verwalten. Sie erfahren, wie Sie Pakete aktualisieren, semantische Versionsverwaltung verwenden und mit Sicherheitsproblemen umgehen.

Überlegungen vor dem Aktualisieren eines Pakets

Berücksichtigen Sie vor dem Aktualisieren eines Pakets Folgendes:

  • Art des Updates: Finden Sie heraus, ob es sich um einen kleineren Fix, eine neue Funktion oder eine wesentliche Änderung handelt, die Ihren Code unterbrechen könnte. Die semantische Versionsverwaltung kann Ihnen bei der Identifizierung helfen.
  • Projektkonfiguration: Stellen Sie sicher, dass Ihr Projekt so eingestellt ist, dass es nur erwünschte Updates empfängt, um unerwartete Änderungen zu vermeiden.
  • Sicherheit: Achten Sie auf potenzielle Sicherheitsrisiken. Verwenden Sie die npm-Überwachungsfunktion, um problematische Pakete zu identifizieren und zu aktualisieren.
  • Tests: Stellen Sie sicher, dass Ihre Tests nach dem Update erfolgreich verlaufen. Wenn Sie noch keine Tests einsetzen, sollten Sie welche hinzufügen. Ihre Anwendung verhält sich nach einem Update möglicherweise anders. Tests überprüfen, ob das Verhalten korrekt ist.

Semantische Versionsverwaltung zum Definieren des Updateverhaltens

Die semantische Versionsverwaltung ist im Rahmen der Softwareentwicklung ein wichtiger Standard. Sie ist sowohl für das Veröffentlichen als auch für das Verwenden von npm-Paketen von Bedeutung. Darüber hinaus unterstützt sie Sie dabei, Risiken im Rahmen von Updates zu kontrollieren, indem sie die in einer neuen Version vorgenommenen Änderungen angibt. Eine Versionsnummer weist bestimmte Abschnitte auf, die diese Änderungen aufzeigen:

Versionstyp Position Syntax Was passiert Vorgehensweise für Updates
Major 1. x.0.0 oder * Eine Änderung von 1.0.0 auf 2.0.0 deutet auf Breaking Changes hin. Es können Codeanpassungen erforderlich sein. Mit sofortigen Updates auf die neueste Hauptversion einverstanden, wobei potenzielle Änderungen am Code akzeptiert werden.
Minor 2. 1.x.1 oder ^ Eine Änderung von 1.2.9 auf 1.3.0 führt neue Funktionen ein. Vorhandener Code sollte weiterhin funktionieren. Updates sind in der Regel sicher. Mit neuen Funktionen einverstanden, aber keine Breaking Changes.
Patch Dritte 1.1.x oder ~ Eine Änderung von 1.0.7 auf 1.0.8 bedeutet Fehlerbehebungen. Updates sollten sicher sein. Fehlerbehebungen werden akzeptiert.

Kleine Node.js-Projekte können Sie problemlos auf die neuesten Versionen aktualisieren. Updates für größere Projekte sollten Sie jedoch sorgfältig bedenken. Sie können nicht immer automatisch erfolgen. Im Allgemeinen erleichtert das Aktualisieren kleinerer Abhängigkeiten mit weniger eigenen Abhängigkeiten den Prozess.

Bevor Sie eine oder mehrere Abhängigkeiten aktualisieren, sollten Sie Ihre package.json-Datei so konfigurieren, dass ein vorhersagbares Verhalten auftritt, wenn Sie den Befehl npm update <name of dependency> ausführen. Node.js verwendet über eine Reihe von Symbolen, mit denen Sie definieren können, wie Pakete aktualisiert werden sollen.

Aktualisieren eines Pakets mit der npm-Befehlszeilenschnittstelle

Sie können ein Paket entweder über den Befehl install oder den Befehl update in npm installieren. Diese Befehle sind inzwischen meist austauschbar. Zum Aktualisieren eines Pakets verwenden Sie in der Regel Folgendes:

  • Aktuellste Version: npm update <package name>@latest.
  • Spezifische Version: npm update <package name>@<optional version number>.

Der Updateprozess hängt von zwei Faktoren ab:

  • Versionsargument: Wenn im Befehl npm update eine Versionsnummer angegeben ist, ruft npm diese Version ab und installiert sie.
  • Eintrag in der Manifestdatei: Die package.json-Datei enthält Regeln zum Aktualisieren von Abhängigkeiten. "dependencyName": "1.1.x" bedeutet beispielsweise, dass npm die Version abruft, die diesem Muster entspricht.

Grundlegendes zur Versionsverwaltung

Drei Dateien steuern die Versionsverwaltung von Abhängigkeiten:

  • package.json: Diese Datei definiert die Version des Pakets, das Sie verwenden möchten. Dies ist die Manifestdatei für Ihr Projekt. Sie enthält die Metadaten für Ihr Projekt, einschließlich der Abhängigkeiten.
  • package-lock.json: Diese Datei beschreibt die genaue Struktur, die generiert wurde, sodass bei nachfolgenden Installationen unabhängig von zwischenzeitlichen Änderungen an den Abhängigkeiten identische Strukturen generiert werden können. Diese Datei soll in Quellrepositorys committet werden.
  • shrinkwrap.json: Diese Datei wird vom CLI-Befehl npm shrinkwrap erstellt und ähnelt package-lock.json. Der Hauptunterschied zwischen den Befehlen besteht darin, dass die in npm-shrinkwrap.json angegebenen Paketversionen nicht von Benutzer*innen überschrieben werden können. Darüber hinaus ist die Datei npm-shrinkwrap.json mit älteren Versionen von npm (Versionen 2–4) kompatibel, während package-lock.json mit npm ab Version 5 kompatibel ist. Daher können Sie bei der Wartung von Legacycodebasen npm-shrinkwrap.json vorfinden. Die meisten Entwickler*innen verwenden package-lock.json anstelle von npm-shrinkwrap.json. Eine Ausnahme, bei npm-shrinkwrap.json bevorzugt wird, stellen globale Installationen von Daemons und Befehlszeilentools dar, bei denen die Entwickler*innen sicherstellen möchten, dass die genauen Versionen der angegebenen Pakete installiert werden.

Beispiel für die Ermittlung der Paketversion

Stellen Sie sich ein Szenario vor, in dem Sie in Ihrem Code Version 1.2 verwenden, dann aber Version 1.4 veröffentlicht, was Ihren Code unterbricht. Wenn jemand Ihre App zu diesem Zeitpunkt installiert, wird sie nicht funktionsfähig sein. Wenn es jedoch eine package-lock.json-Datei gibt, die Version 1.2 angibt, wird diese Version installiert.

Hier sehen Sie ein Beispiel zur Ermittlung der installierten Version eines Pakets:

  • Wenn sich die Dateien package.json und package-lock.json auf eine Versionsregel einigen, gibt es keinen Konflikt. Wenn beispielsweise package.json 1.x und package-lock.json Version 1.4 festlegt, wird Version 1.4 installiert.
  • Wenn package.json eine spezifischere Version wie zum Beispiel 1.8.x angibt, wird die package-lock.json-Datei außer Kraft gesetzt, die die ältere Version 1.4 angibt. In diesem Fall wird Version 1.8.0 oder höher oder eine höhere Patchversion installiert (sofern verfügbar).

Suchen und Aktualisieren veralteter Pakete mit dem Befehl „npm outdated“

Der Befehl npm outdated wird verwendet, um Pakete zu identifizieren, für die neuere Versionen verfügbar sind. Durch Ausführen des Befehls wird eine Liste dieser veralteten Pakete bereitgestellt:

Package       Current    Wanted   Latest     Location     Depended by
lodash        1.0.0      1.0.0    4.17.19    lock-test    main-code-file
node-fetch    1.2.0      1.2.0    2.6.0      lock-test    function-code-file

Die Spalten in der Ausgabe enthalten Folgendes:

Column BESCHREIBUNG
Paket Das veraltete Paket.
Aktuell Die derzeit installierte Version des Pakets.
Gewünscht Diese aktuellste Version, die dem in der package.json-Datei angegeben semantischen Muster entspricht.
Latest Die aktuelle Version des Pakets.
Standort Der Speicherort der Paketabhängigkeit. Der Befehl outdated durchsucht alle installierten Pakete in den verschiedenen node_modules-Ordnern.
Abhängigkeit von Das Paket mit der Abhängigkeit.

Umgang mit Sicherheitsproblemen bei der npm-Überwachung

Jedes Mal, wenn Sie ein Paket installieren oder aktualisieren, erhalten Sie eine Protokollantwort, die Ihnen anzeigt, welche Version installiert wurde und ob Sicherheitsrisiken bestehen. Das Protokoll listet Sicherheitsrisiken auf. Wenn Sicherheitsrisiken mit kritischem oder hohem Schweregrad bestehen, sollten Sie das Paket aktualisieren.

Hier ein Beispiel für eine Protokollantwort:

+ lodash@1.3.1
added 1 package from 4 contributors and audited 1 package in 0.949s
found 3 vulnerabilities (1 low, 2 high)
  run `npm audit fix` to fix them, or `npm audit` for details

Sie können den Befehl npm audit ausführen, um ein Problem zu beheben und ein Update anzuwenden. Dieser Befehl listet jedes Sicherheitsrisiko auf.

Der Befehl npm audit fix versucht, Sicherheitsrisiken zu beheben, indem ein Upgrade auf eine Nebenversion ausgeführt wird, in der das Problem nicht besteht. Eine solche Nebenversion ist jedoch möglicherweise nicht verfügbar, wenn sich der Fix in der nächsten Hauptversion befindet.

In solchen Fällen müssen Sie möglicherweise npm audit fix --force verwenden. Durch das Aktualisieren auf die Hauptversion kann es allerdings zu Breaking Changes kommen. Sie sollten die Entscheidung, diesen Befehl auszuführen, sorgfältig abwägen. Seien Sie sich der Breaking Changes bewusst, und verwenden Sie npm update, um Ihren Code mit den Sicherheitsrisiken zu aktualisieren.

Ein Sicherheitsrisiko ist eine Schwäche im Code, die von Angreifern ausgenutzt werden kann, um böswillige Aktionen auszuführen, wodurch ihre Daten und Systeme potenziell beeinträchtigt werden können. Es ist von entscheidender Bedeutung, solche Sicherheitsrisiken umgehend zu beheben.

Da häufig Sicherheitsrisiken entdeckt werden, verfügt GitHub über eine Funktion, die Repositorys überprüft und automatisch Pull Requests (PRs) erstellt, die Upgrades auf sicherere Versionen vorschlagen. Das regelmäßige Ausführen von npm audit ist eine bewährte Methode zum Identifizieren und Beheben von Sicherheitsrisiken, die zur allgemeinen Sicherheit Ihres Projekts beiträgt.

Der empfohlene Workflow für Updates ist folgender:

  1. npm run test: Überprüfen Sie, ob Ihre vorhandenen Tests bestanden werden, bevor Sie diesen Updatevorgang starten.
  2. npm audit: um eine Überprüfung auf Sicherheitsrisiken in der aktuell von Ihnen verwendeten Version vorzunehmen. Die durch npm audit bereitgestellten Informationen umfassen möglicherweise die Empfehlung, eine Aktualisierung auf eine Hauptversion durchzuführen. Sofern Breaking Changes aufgeführt sind, sollten Sie diese sorgfältig überprüfen.
  3. npm outdated: um alle veralteten Pakete aufzulisten. Dieser Befehl stellt Informationen in den Spalten Wanted, Current und Location bereit.
  4. Aktualisieren Sie mit npm update:
    • Für kleinere Projekte (mit wenigen Abhängigkeiten in der package.json): Sie können npm update versuchen, um alle Abhängigkeiten zu aktualisieren, und dann Ihre Tests ausführen.
    • Für größere Projekte (mit vielen Abhängigkeiten in der package.json): Aktualisieren Sie ein einzelnes Paket oder eine Paketfamilie (z. B. Next.js und React), und führen Sie dann die Tests aus.
  5. npm audit: Überprüfen Sie, ob kritische oder hohe Sicherheitsrisiken vorhanden sind. Wenn weiterhin Sicherheitsrisiken bestehen, verwenden Sie npm update mit dem Paketnamen und der in npm audit empfohlenen Hauptversion.
  6. Wieder npm run test.
  7. Überprüfen Sie in Ihrer package.json und package-lock.json.