Die Autorin wählte den Open Internet/Free Speech Fund, um eine Spende im Rahmen des Programms Write for DOnations zu erhalten.
Aufgrund von solchen Eigenschaften wie ihrer schnellen Performance bezüglich des Input/Output (I/O) und ihrer bekannten JavaScript-Syntax ist Node.js schnell zu einer beliebten Laufzeitumgebung für die Backend-Webentwicklung geworden. Doch mit wachsendem Interesse werden immer größere Anwendungen erstellt und die Verwaltung der Komplexität der Codebasis und ihrer Abhängigkeiten wird immer schwieriger. Node.js organisiert diese Komplexität mithilfe von Modulen. Das sind beliebige einzelne JavaScript-Dateien mit Funktionen oder Objekten, die von anderen Programmen oder Modulen verwendet werden können. Eine Sammlung von einem oder mehreren Modulen wird allgemein als Paket bezeichnet. Die Pakete selbst werden von Paketmanagern organisiert.
Der Node.js-Paketmanager (npm) ist der standardmäßige und beliebteste Paketmanager im Node.js.-Ökosystem und wird in erster Linie zur Installation und Verwaltung externer Module in einem Node.js-Projekt verwendet. Er wird auch häufig genutzt, um eine breite Palette von CLI-Tools zu installieren und Projektskripte auszuführen. npm verfolgt die in einem Projekt installierten Module mit der Datei package.json
, die sich im Verzeichnis eines Projekts befindet und Folgendes enthält:
Wenn Sie komplexere Node.js-Projekte erstellen, bietet Ihnen das Verwalten Ihrer Metadaten und Abhängigkeiten mit der package.json
-Datei besser vorhersehbare Builds, da alle externen Abhängigkeiten gleich gehalten werden. Die Datei verfolgt diese Informationen automatisch; während Sie die Datei direkt ändern können, um die Metadaten Ihres Projekts zu aktualisieren, müssen Sie selten direkt mit ihr interagieren, um Module zu verwalten.
In diesem Tutorial verwalten Sie Pakete mit npm. Der erste Schritt besteht darin, die package.json
-Datei zu erstellen und zu verstehen. Diese verwenden Sie dann, um alle Module zu verfolgen, die Sie in Ihrem Projekt installieren. Zum Schluss listen Sie Ihre Paketabhängigkeiten auf, aktualisieren Ihre Pakete, deinstallieren Ihre Pakete und führen eine Prüfung zum Auffinden von Sicherheitsmängeln in Ihren Paketen durch.
Um diesem Tutorial zu folgen, benötigen Sie:
package.json
-DateiBeginnen wir dieses Tutorial, indem wir das Beispielprojekt einrichten – ein fiktives Node.js-locator
-Modul, das die IP-Adresse des Benutzers ermittelt und das Herkunftsland ausgibt. In diesem Tutorial codieren Sie das Modul nicht. Die von Ihnen verwalteten Pakete wären jedoch relevant, wenn Sie es entwickeln würden.
Zuerst erstellen Sie eine package.json
-Datei, um nützliche Metadaten über das Projekt zu speichern und um Ihnen die Verwaltung der abhängigen Node.js-Module des Projekts zu erleichtern. Wie die Endung bereits andeutet, handelt es sich um eine JSON-Datei (JavaScript Object Notation). JSON ist ein Standardformat für die gemeinsame Nutzung, das auf JavaScript-Objekten basiert und aus Daten besteht, die als Schlüssel-Wert-Paare gespeichert sind. Wenn Sie mehr über JSON erfahren möchten, lesen Sie unseren Artikel Einführung zu JSON.
Da eine package.json
-Datei zahlreiche Eigenschaften enthält, kann ihre manuelle Erstellung umständlich sein, ohne eine Vorlage von einer anderen Stelle zu kopieren und einzufügen. Um das zu erleichtern, bietet npm den Befehl init
. Das ist ein interaktiver Befehl, der Ihnen eine Reihe von Fragen stellt und eine package.json
-Datei auf der Grundlage Ihrer Antworten erstellt.
init
Erstellen Sie zuerst ein Projekt, mit dem Sie das Verwalten von Modulen praktizieren können. Erstellen Sie in Ihrer Shell einen neuen Ordner namens locator
:
- mkdir locator
Gehen Sie dann in den neuen Ordner:
- cd locator
Initialisieren Sie nun die interaktive Eingabeaufforderung, indem Sie Folgendes eingeben:
- npm init
Anmerkung: Wenn Ihr Code Git zur Versionskontrolle verwendet, erstellen Sie zuerst das Git-Repository und führen Sie dann npm init
aus. Der Befehl versteht automatisch, dass er in einem Git-fähigen Ordner ist. Wenn ein Git-Remote eingestellt ist, füllt es automatisch die Felder repository
, bugs
und homepage
für Ihre package.json
-Datei aus. Wenn Sie das Repo nach Erstellung der package.json
-Datei initialisiert haben, müssen Sie diese Informationen selbst eingeben. Weitere Informationen zur Git-Versionskontrolle finden Sie in unserer Serie Einführung zu Git: Installation, Verwendung und Zweige.
Sie erhalten die folgende Ausgabe:
OutputThis utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (locator)
Zuerst werden Sie mit name
zur Eingabe des Namens Ihres neuen Projekts aufgefordert. Standardmäßig nimmt der Befehl an, dass dies der Name des Ordners ist, in dem Sie sind. Standardwerte für jede Eigenschaft werden in Klammern ()
gezeigt. Da der Standardwert für name
die Zwecke dieses Tutorials erfüllt, drücken Sie die Eingabetaste
, um ihn zu akzeptieren.
Der nächste einzugebende Wert ist version
. Neben name
ist dieses Feld erforderlich, wenn Ihr Projekt mit anderen im npm-Paket-Repository geteilt wird.
Anmerkung: Es wird erwartet, dass Node.js-Pakete dem Leitfaden Semantic Versioning (semver) folgen, einem Leitfaden für semantische Versionierung. Die erste Ziffer ist daher die MAJOR
-Versionsziffer, die sich nur ändert, wenn sich die API ändert. Die zweite Ziffer ist die MINOR
-Version, die sich ändert, wenn Eigenschaften hinzugefügt werden. Die letzte Ziffer ist die PATCH
-Version, die sich ändert, wenn Fehler behoben werden.
Drücken Sie die Eingabetaste
, damit die Standardversion akzeptiert wird.
Das nächste Feld ist description
– eine nützliche Zeichenfolge, um zu erklären, was Ihr Node.js-Modul tut. Unser fiktive locator
würde die IP-Adresse des Benutzers ermitteln und das Herkunftsland ausgeben. Eine passende description
wäre Findet das Ursprungsland der eingehenden Anfrage
. Geben Sie etwas in dieser Art ein und drücken Sie die Eingabetaste
. Die description
ist sehr nützlich, wenn jemand nach Ihrem Modul sucht.
Die nächste Eingabeaufforderung fragt Sie nach dem entry point
. Wenn jemand Ihr Modul installiert und mit requires
anfordert, wird das, was Sie in entry point
festlegen, als erster Teil Ihres Programms geladen. Der Wert muss der relative Speicherort einer JavaScript-Datei sein und wird der main
-Eigenschaft des package.json
hinzugefügt. Drücken Sie die Eingabetaste
, um den Standardwert zu speichern.
Anmerkung: Die meisten Module haben eine index.js
-Datei als Haupteingabepunkt. Das ist der Standardwert für die main
-Eigenschaft des package.json
, die der Eingangspunkt für npm-Module ist. Wenn kein package.json
vorhanden ist, wird Node.js standardmäßig versuchen, index.js
zu laden.
Als Nächstes werden Sie nach einem test command
gefragt, einem ausführbaren Skript oder Befehl zur Ausführung Ihres Projekttests. In vielen beliebten Node.js-Modulen werden Tests mit Mocha, Jest, Jasmine oder anderen Test-Frameworks geschrieben und ausgeführt. Da das Testen über den Umfang dieses Artikels hinausgeht, lassen Sie diese Option jetzt leer und drücken Sie die Eingabetaste
, um fortzufahren.
Der Befehl init
fragt dann nach dem GitHub-Repository des Projekts. Sie werden es in diesem Beispiel nicht verwenden, also lassen Sie auch das leer.
Nach der Eingabeaufforderung des Repository fragt der Befehl nach keywords
. Diese Eigenschaft ist ein Array von Zeichenfolgen mit nützlichen Begriffen, die Personen zum Finden Ihres Repositorys verwenden können. Am besten ist es, wenn Sie eine kleine Anzahl von Wörtern haben, die für Ihr Projekt wirklich relevant sind, damit die Suche gezielter erfolgen kann. Erstellen Sie eine Liste dieser Schlüsselwörter als Zeichenfolge mit Kommas, die die einzelnen Werte trennen. Geben Sie für dieses Beispielprojekt ip,geo,country
bei der Eingabeaufforderung ein. Das fertige package.json
verfügt nun über drei Elemente im Array für keywords
.
Das nächste Feld in der Eingabeaufforderung ist author
. Das ist nützlich für die Benutzer Ihres Moduls, die Kontakt mit Ihnen aufnehmen möchten. Wenn zum Beispiel jemand ein Exploit in Ihrem Modul entdeckt, kann er auf diesem Wege das Problem melden, damit Sie es beheben können. Das author
-Feld ist eine Zeichenfolge im folgenden Format: "Name \<Email\> (Website)"
. Beispielsweise ist „Sammy \<sammy@your_domain\> (https://your_domain)"
ein gültiger Autor. Die Daten zur E-Mail und Website sind optional – ein gültiger Autor kann auch nur ein Name sein. Fügen Sie Ihre Kontaktdaten als Autor hinzu und bestätigen Sie mit der Eingabetaste
.
Schließlich werden Sie mit license
zur Eingabe der Lizenz aufgefordert. Dadurch werden die rechtlichen Berechtigungen und Beschränkungen für Benutzer bei der Verwendung Ihres Moduls festgelegt. Viele Node.js-Module sind Open-Source-Module, sodass npm die Standardeinstellung auf ISC setzt.
Zu diesem Zeitpunkt würden Sie Ihre Lizenzoptionen überprüfen und entscheiden, was für Ihr Projekt am besten geeignet ist. Weitere Informationen zu verschiedenen Arten von Open-Source-Lizenzen finden Sie in dieser Lizenzliste aus der Open Source Initiative. Wenn Sie keine Lizenz für ein privates Repository bereitstellen möchten, können Sie bei der Eingabeaufforderung UNLICENSED
eingeben. Verwenden Sie für dieses Beispiel die standardmäßige ISC-Lizenz und drücken Sie die Eingabetaste
, um den Prozess abzuschließen.
Der Befehl init
zeigt nun die package.json
-Datei, die erstellt wird. Das wird ähnlich aussehen wie folgt:
OutputAbout to write to /home/sammy/locator/package.json:
{
"name": "locator",
"version": "1.0.0",
"description": "Finds the country of origin of the incoming request",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"ip",
"geo",
"country"
],
"author": "Sammy <sammy@your_domain> (https://your_domain)",
"license": "ISC"
}
Is this OK? (yes)
Sobald die Informationen mit dem übereinstimmen, was Sie hier sehen, drücken Sie die Eingabetaste
, um den Prozess abzuschließen und die Datei package.json
zu erstellen. Mit dieser Datei können Sie ein Verzeichnis der Module führen, die Sie für Ihr Projekt installieren.
Nachdem Ihre package.json
-Datei nun vorhanden ist, können Sie im nächsten Schritt die Installation von Modulen testen.
In der Softwareentwicklung ist es üblich, externe Bibliotheken zu nutzen, um untergeordnete Aufgaben in Projekten auszuführen. Dadurch kann sich der Entwickler auf die Geschäftslogik konzentrieren und die Anwendung schneller und effizienter gestalten.
Wenn beispielsweise unser locater
-Beispielmodul eine externe API-Anfrage stellen muss, um geografische Daten zu erhalten, könnten wir eine HTTP-Bibliothek verwenden, um diese Aufgabe zu erleichtern. Da unser Hauptziel darin besteht, sachbezogene geografische Daten an den Benutzer auszugeben, könnten wir ein Paket installieren, das uns HTTP-Anfragen erleichtert – anstatt diesen Code für uns selbst neu zu schreiben, was eine Aufgabe wäre, die den Rahmen unseres Projekts sprengt.
Wir führen dieses Beispiel nun durch. In Ihrer locator
-Anwendung nutzen Sie die axios-Bibliothek, die Ihnen bei der Erstellung von HTTP-Anfragen hilft. Installieren Sie sie, indem Sie Folgendes in Ihre Shell eingeben:
- npm install axios --save
Sie beginnen diesen Befehl mit npm install
, wodurch das Paket installiert wird (der Einfachheit halber können Sie npm i
verwenden). Anschließend listen Sie die Pakete, die installiert werden sollen, durch ein Leerzeichen getrennt auf. In diesem Fall ist das axios
. Schließlich beenden Sie den Befehl mit dem optionalen Parameter --save
, der angibt, dass axios
als Projektabhängigkeit gespeichert wird.
Wenn die Bibliothek installiert ist, sehen Sie eine Ausgabe, die der folgenden ähnelt:
Output...
+ axios@0.19.0
added 5 packages from 8 contributors and audited 5 packages in 0.764s
found 0 vulnerabilities
Öffnen Sie nun die Datei package.json
mit einem Texteditor Ihrer Wahl. Dieses Tutorial verwendet nano
:
- nano package.json
Sie sehen eine neue Eigenschaft, wie im Folgenden hervorgehoben:
{
"name": "locator",
"version": "1.0.0",
"description": "Finds the country of origin of the incoming request",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"ip",
"geo",
"country"
],
"author": "Sammy sammy@your_domain (https://your_domain)",
"license": "ISC",
"dependencies": {
"axios": "^0.19.0"
}
}
Die Option --save
hat npm angewiesen, die Datei package.json
mit dem Modul und der Version zu aktualisieren, die gerade installiert wurden. Das ist sehr gut, da andere Entwickler, die an Ihren Projekten arbeiten, leicht erkennen können, welche externen Abhängigkeiten benötigt werden.
Anmerkung: Vielleicht ist Ihnen das ^
vor der Versionsnummer für die axios
-Abhängigkeit aufgefallen. Erinnern Sie sich daran, dass die semantische Versionierung aus drei Ziffern besteht: MAJOR, MINOR und PATCH. Das Symbol ^
bedeutet, dass jede höhere MINOR- oder PATCH-Version diese Versionseinschränkung erfüllen würde. Wenn Sie zu Beginn einer Versionsnummer ~
sehen, erfüllen nur höhere PATCH-Versionen die Einschränkung.
Wenn Sie mit der Prüfung von package.json
fertig sind, beenden Sie die Datei.
Pakete, die für die Entwicklung eines Projekts verwendet werden, nicht aber für die Zusammenstellung oder die Ausführung in der Produktion, werden als Entwicklungsabhängigkeiten bezeichnet. Sie sind nicht notwendig, damit Ihr Modul oder Ihre Anwendung in der Produktion funktioniert, können aber beim Schreiben des Codes hilfreich sein.
Beispielsweise ist es üblich, dass Entwickler Code-Linter verwenden, um sicherzustellen, dass ihr Code bewährte Praktiken verfolgt und um den Stil konsistent zu halten. Das ist für die Entwicklung nützlich, erhöht aber die Menge des Verteilbaren, ohne beim Einsatz in der Produktion einen spürbaren Nutzen zu bieten.
Installieren Sie einen Linter als Entwicklungsabhängigkeit für Ihr Projekt. Probieren Sie Folgendes in Ihrer Shell aus:
- npm i eslint@6.0.0 --save-dev
In diesem Befehl haben Sie das Flag --save-dev
verwendet. Dadurch wird eslint
als Abhängigkeit gespeichert, die nur für die Entwicklung benötigt wird. Beachten Sie auch, dass Sie Ihrem Abhängigkeitsnamen @6.0.0
hinzugefügt haben. Wenn Module aktualisiert werden, werden sie mit einer Version getaggt. Das @
weist npm an, nach einem bestimmten Tag des Moduls, das Sie installieren, zu suchen. Ohne ein bestimmtes Tag installiert npm die letzte getaggte Version. Öffnen Sie package.json
erneut:
- nano package.json
Dadurch wird Folgendes angezeigt:
{
"name": "locator",
"version": "1.0.0",
"description": "Finds the country of origin of the incoming request",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"ip",
"geo",
"country"
],
"author": "Sammy sammy@your_domain (https://your_domain)",
"license": "ISC",
"dependencies": {
"axios": "^0.19.0"
},
"devDependencies": {
"eslint": "^6.0.0"
}
}
eslint
wurde als eine devDependencies
gespeichert, zusammen mit der zuvor von Ihnen angegebenen Versionsnummer. Beenden Sie package.json
.
node_modules
und package-lock.json
Wenn Sie zum ersten Mal ein Paket in einem Node.js-Projekt installieren, erstellt npm automatisch den Ordner node_modules
, um die für Ihr Projekt erforderlichen Module zu speichern, und die Datei package-lock.json
, die Sie zuvor geprüft haben.
Bestätigen Sie, dass sich diese in Ihrem Arbeitsverzeichnis befinden. Geben Sie in Ihrer Shell ls
ein und drücken Sie die Eingabetaste
. Sie sehen folgende Ausgabe:
Outputnode_modules package.json package-lock.json
Der Ordner node_modules
enthält jede installierte Abhängigkeit für Ihr Projekt. In den meisten Fällen sollten Sie diesen Ordner nicht in Ihr versionskontrolliertes Repository übertragen. Wenn Sie weitere Abhängigkeiten installieren, wird die Größe dieses Ordners schnell anwachsen. Darüber hinaus werden in der Datei package-lock.json
die genauen installierten Versionen in einer knapperen Form aufgezeichnet, sodass das Einfügen von node_modules
nicht notwendig ist.
Während die Datei package.json
Abhängigkeiten auflistet, die uns die geeigneten Versionen zeigen, die für das Projekt installiert werden sollten, verfolgt die Datei package-lock.json
alle Änderungen in package.json
oder node_modules
und zeigt uns die genaue Version des installierten Pakets. Normalerweise übergeben Sie diese an Ihr versionskontrolliertes Repository statt an node_modules
, da dies eine sauberere Darstellung all Ihrer Abhängigkeiten bietet.
Mit Ihren Dateien package.json
und package-lock.json
können Sie schnell die gleichen Projektabhängigkeiten einrichten, bevor Sie die Entwicklung eines neuen Projekts starten. Um dies zu demonstrieren, gehen Sie in Ihrem Verzeichnisbaum eine Ebene höher und erstellen Sie einen neuen Ordner namens cloned_locator
auf derselben Verzeichnisebene wie locator
:
- cd ..
- mkdir cloned_locator
Gehen Sie in Ihr neues Verzeichnis:
- cd cloned_locator
Kopieren Sie nun die Dateien package.json
und package-lock.json
von locator
zu cloned_locator
:
- cp ../locator/package.json ../locator/package-lock.json .
Um die erforderlichen Module für dieses Projekt zu installieren, geben Sie Folgendes ein:
- npm i
npm wird nach einer package-lock.json
-Datei suchen, um die Module zu installieren. Wenn keine Lock-Datei verfügbar ist, würde npm aus der Datei package.json
lesen, um die Installationen zu bestimmen. Normalerweise ist es schneller, aus package-lock.json
zu installieren, da die Lock-Datei die genaue Version von Modulen und deren Abhängigkeiten enthält. So muss npm nicht lange nach einer geeigneten Version für die Installation suchen.
Beim Einsatz in der Produktion können Sie die Entwicklungsabhängigkeiten überspringen. Erinnern Sie sich daran, dass Entwicklungsabhängigkeiten im Abschnitt devDependencies
von package.json
gespeichert werden und keinen Einfluss auf die Ausführung Ihrer Anwendung haben. Wenn Sie Module als Teil des CI/CD-Prozesses zur Bereitstellung Ihrer Anwendung installieren, lassen Sie die dev-Abhängigkeiten weg, indem Sie Folgendes ausführen:
- npm i --production
Das Flag --production
ignoriert den Abschnitt devDependencies
während der Installation. Bleiben Sie vorerst bei Ihrem Entwicklungs-Build.
Bevor Sie zum nächsten Abschnitt übergehen, kehren Sie zum Ordner locator
zurück:
- cd ../locator
Bisher haben Sie npm-Module für das locator
-Projekt installiert. npm bietet Ihnen auch die Möglichkeit, Pakete global zu installieren. Das bedeutet, dass das Paket wie jeder andere Shell-Befehl für Ihren Benutzer im weiteren System verfügbar ist. Diese Fähigkeit ist für die vielen Node.js-Module nützlich, die CLI-Tools sind.
Vielleicht möchten Sie zum Beispiel über das locator
-Projekt bloggen, an dem Sie gerade arbeiten. Dazu können Sie eine Bibliothek wie Hexo verwenden, um Ihren statischen Website-Blog zu erstellen und zu verwalten. Installieren Sie die Hexo-CLI wie folgt:
- npm i hexo-cli -g
Um ein Paket global zu installieren, hängen Sie das Flag -g
an den Befehl an.
Anmerkung: Wenn Sie beim Versuch, dieses Paket global zu installieren, eine Fehlermeldung bezüglich der Berechtigung erhalten, benötigt Ihr System möglicherweise Superuser-Rechte, um den Befehl auszuführen. Versuchen Sie es erneut mit sudo npm i hexo-cli -g
.
Testen Sie, ob das Paket erfolgreich installiert wurde, indem Sie Folgendes eingeben:
- hexo --version
Sie werden eine Ausgabe sehen, die der folgenden ähnelt:
Outputhexo-cli: 2.0.0
os: Linux 4.15.0-64-generic linux x64
http_parser: 2.7.1
node: 10.14.0
v8: 7.6.303.29-node.16
uv: 1.31.0
zlib: 1.2.11
ares: 1.15.0
modules: 72
nghttp2: 1.39.2
openssl: 1.1.1c
brotli: 1.0.7
napi: 4
llhttp: 1.1.4
icu: 64.2
unicode: 12.1
cldr: 35.1
tz: 2019a
Bisher haben Sie gelernt, wie Sie Module mit npm installieren. Sie können Pakete lokal in ein Projekt installieren, entweder als Produktions- oder Entwicklungsabhängigkeit. Sie können auch Pakete installieren, die auf bereits existierenden package.json
- oder package-lock.json
-Dateien basieren. So können Sie mit den gleichen Abhängigkeiten entwickeln wie Ihre Peers. Außerdem können Sie das Flag -g
verwenden, um Pakete global zu installieren und auf diese zuzugreifen – unabhängig davon, ob Sie sich in einem Node.js-Projekt befinden oder nicht.
Nachdem Sie nun Module installieren können, werden Sie im nächsten Abschnitt Techniken zur Verwaltung Ihrer Abhängigkeiten anwenden.
Ein vollständiger Paketmanager kann viel mehr als nur Module installieren. npm verfügt über mehr als 20 Befehle bezüglich der Verwaltung von Abhängigkeiten. In diesem Schritt werden Sie folgende Aufgaben erledigen:
Obwohl diese Beispiele in Ihrem locator
-Ordner angewendet werden, können alle diese Befehle auch global ausgeführt werden, indem Sie das Flag -g
am Ende anhängen – genau wie bei der globalen Installation.
Wenn Sie wissen möchten, welche Module in einem Projekt installiert sind, ist es einfacher, den list
- oder ls
-Befehl zu verwenden, anstatt das package.json
direkt zu lesen. Dazu geben Sie Folgendes ein:
- npm ls
Sie werden eine Ausgabe wie diese sehen:
Output├─┬ axios@0.19.0
│ ├─┬ follow-redirects@1.5.10
│ │ └─┬ debug@3.1.0
│ │ └── ms@2.0.0
│ └── is-buffer@2.0.3
└─┬ eslint@6.0.0
├─┬ @babel/code-frame@7.5.5
│ └─┬ @babel/highlight@7.5.0
│ ├── chalk@2.4.2 deduped
│ ├── esutils@2.0.3 deduped
│ └── js-tokens@4.0.0
├─┬ ajv@6.10.2
│ ├── fast-deep-equal@2.0.1
│ ├── fast-json-stable-stringify@2.0.0
│ ├── json-schema-traverse@0.4.1
│ └─┬ uri-js@4.2.2
...
Standardmäßig zeigt ls
den gesamten Abhängigkeitenbaum – die Module, auf die Ihr Projekt angewiesen ist, und die Module, auf die Ihre Abhängigkeiten angewiesen sind. Das kann etwas unhandlich sein, wenn Sie einen Überblick auf hoher Ebene über die installierten Systeme haben wollen.
Um nur die von Ihnen installierten Module ohne deren Abhängigkeiten zu zeigen, geben Sie in Ihrer Shell Folgendes ein:
- npm ls --depth 0
Sie erhalten folgende Ausgabe:
Output├── axios@0.19.0
└── eslint@6.0.0
Mit der Option --depth
können Sie angeben, welche Ebene des Abhängigkeitenbaums Sie sehen möchten. Wenn diese 0
, ist, sehen Sie nur Ihre Abhängigkeiten auf höchster Ebene.
Das ist eine gute Praxis, Ihre npm-Module auf dem neuesten Stand zu halten. Es erhöht die Wahrscheinlichkeit, die neuesten Sicherheitskorrekturen für ein Modul zu erhalten. Verwenden Sie den Befehl outdated
, um zu prüfen, ob Module aktualisiert werden können:
- npm outdated
Sie erhalten eine ähnliche Ausgabe:
OutputPackage Current Wanted Latest Location
eslint 6.0.0 6.7.1 6.7.1 locator
Der Befehl listet zuerst unter Package
das installierte Paket und unter Current
die aktuelle Version auf. Die Spalte Wanted
zeigt, welche Version Ihre Versionsanforderung in package.json
erfüllt. Die Spalte Latest
zeigt die neueste veröffentlichte Version des Moduls.
Die Spalte Location
gibt an, wo sich das Paket im Abhängigkeitenbaum befindet. Der Befehl outdated
hat so wie ls
das Flag --depth
. Die Standardeinstellung für depth ist 0.
Scheinbar können Sie eslint
auf eine neuere Version aktualisieren. Verwenden Sie den update
- oder up
-Befehl wie folgt:
- npm up eslint
Die Ausgabe des Befehls enthält die installierte Version:
Outputnpm WARN locator@1.0.0 No repository field.
+ eslint@6.7.1
added 7 packages from 3 contributors, removed 5 packages, updated 19 packages, moved 1 package and audited 184 packages in 5.818s
found 0 vulnerabilities
Wenn Sie alle Module auf einmal aktualisieren möchten, geben Sie ein:
- npm up
Der npm-Befehl uninstall
kann Module aus Ihren Projekten entfernen. Das bedeutet, dass das Modul nicht länger im Ordner node_modules
installiert sein wird. Auch wird es in den Dateien package.json
und package-lock.json
nicht mehr zu sehen sein.
Die Entfernung von Abhängigkeiten aus einem Projekt ist eine normale Aktivität im Zyklus der Softwareentwicklung. Vielleicht löst eine Abhängigkeit ein Problem nicht so wie zuvor angepriesen oder es bietet keine zufriedenstellenden Entwicklungsergebnisse. In diesen Fällen kann es besser sein, die Abhängigkeit zu deinstallieren und Ihr eigenes Modul zu erstellen.
Stellen Sie sich vor, dass axios
nicht das Entwicklungsergebnis bietet, das Sie sich für die Erstellung von HTTP-Anfragen vorgestellt haben. Desinstallieren Sie axios
mit dem uninstall
- oder un
-Befehl, indem Sie Folgendes eingeben:
- npm un axios
Ihre Ausgabe wird der folgenden ähneln:
Outputnpm WARN locator@1.0.0 No repository field.
removed 5 packages and audited 176 packages in 1.488s
found 0 vulnerabilities
Sie gibt nicht ausdrücklich an, dass axios
entfernt wurde. Um zu überprüfen, ob es deinstalliert wurde, listen Sie erneut die Abhängigkeiten auf:
- npm ls --depth 0
Jetzt sehen wir, dass nur eslint
installiert ist:
Output└── eslint@6.7.1
Das zeigt, dass Sie das Paket axios
erfolgreich desinstalliert haben.
npm bietet einen audit
-Befehl, um auf potenzielle Sicherheitsmängel in Ihren Abhängigkeiten zu verweisen. Um den Prüfbefehl audit in Aktion zu sehen, installieren Sie eine veraltete Version des Moduls request, indem Sie Folgendes ausführen:
- npm i request@2.60.0
Wenn Sie diese veraltete Version von request
installieren, erhalten Sie eine Ausgabe, die der folgenden ähnelt:
Output+ request@2.60.0
added 54 packages from 49 contributors and audited 243 packages in 7.26s
found 6 moderate severity vulnerabilities
run `npm audit fix` to fix them, or `npm audit` for details
npm teilt Ihnen mit, dass Sie Schwachstellen in Ihren Abhängigkeiten haben. Um weitere Informationen zu erhalten, prüfen Sie Ihr gesamtes Projekt mit:
- npm audit
Der Befehl audit
zeigt in der Ausgabe Tabellen, in denen Sicherheitsmängel hervorgehoben werden:
Output === npm audit security report ===
# Run npm install request@2.88.0 to resolve 1 vulnerability
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate │ Memory Exposure │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package │ tunnel-agent │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ request │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path │ request > tunnel-agent │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info │ https://npmjs.com/advisories/598 │
└───────────────┴──────────────────────────────────────────────────────────────┘
# Run npm update request --depth 1 to resolve 1 vulnerability
┌───────────────┬──────────────────────────────────────────────────────────────┐
│ Moderate │ Remote Memory Exposure │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Package │ request │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Dependency of │ request │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ Path │ request │
├───────────────┼──────────────────────────────────────────────────────────────┤
│ More info │ https://npmjs.com/advisories/309 │
└───────────────┴──────────────────────────────────────────────────────────────┘
...
Sie können den Pfad der Schwachstelle sehen und manchmal bietet npm Ihnen Möglichkeiten, sie zu beheben. Sie können wie vorgeschlagen den Befehl zur Aktualisierung oder den Unterbefehl fix
des audit
ausführen. Geben Sie Folgendes in Ihre Shell ein:
- npm audit fix
Sie sehen eine ähnliche Ausgabe:
Output+ request@2.88.0
added 19 packages from 24 contributors, removed 32 packages and updated 12 packages in 6.223s
fixed 2 of 6 vulnerabilities in 243 scanned packages
4 vulnerabilities required manual review and could not be updated
npm konnte zwei der Pakete sicher aktualisieren und Ihre Schwachstellen um die gleiche Anzahl verringern. Sie haben jedoch immer noch vier Schwachstellen in Ihren Abhängigkeiten. Der Befehl audit fix
korrigiert nicht immer jedes Problem. Obwohl eine Version eines Moduls eine Sicherheitsschwachstelle aufweisen kann, könnte eine Aktualisierung auf eine Version mit einer anderen API den Code weiter oben im Abhängigkeitenbaum aufbrechen.
Sie können den Parameter --force
auf folgende Weise verwenden, um sicherzustellen, dass die Schwachstellen nicht mehr vorhanden sind:
- npm audit fix --force
Wie bereits erwähnt, wird dies nicht empfohlen, solange Sie sich nicht sicher sind, dass die Funktionalität hiervon nicht beeinträchtigt wird.
In diesem Tutorial haben Sie verschiedene Übungen durchlaufen, die zeigen, wie Node.js-Module in Paketen organisiert sind und wie diese Pakete von npm verwaltet werden. Sie haben in einem Node.js-Projekt npm-Pakete als Abhängigkeiten verwendet, indem Sie eine package.json
-Datei erstellt und verwaltet haben. Diese Datei beinhaltet eine Aufzeichnung der Metadaten Ihres Projekts einschließlich der Module, die Sie installiert haben. Neben dem Auflisten Ihres Abhängigkeitenbaums Ihrer Projekte sowie dem Prüfen und Aktualisieren veralteter Module haben Sie das npm-CLI-Tool zum Installieren, Aktualisieren und Entfernen von Modulen verwendet.
In Zukunft können Sie Module verwenden, um vorhandenen Code einzusetzen und dadurch die Entwicklungszeit beschleunigen, da Sie die Funktionalität nicht wiederholen müssen. Sie werden zudem in der Lage sein, eigene npm-Module zu erstellen, die wiederum von anderen über npm-Befehle verwaltet werden. Experimentieren Sie als Nächstes mit dem, was Sie in diesem Tutorial gelernt haben, indem Sie einige der vielen existierenden Pakete installieren und testen. Sehen Sie sich an, was das Ökosystem bietet, um die Problemlösung zu erleichtern. Sie könnten zum Beispiel TypeScript, eine übergeordnete Programmiersprache von JavaScript, ausprobieren oder Ihre Website mit Cordova in mobile Anwendungen verwandeln. Wenn Sie mehr über Node.js lernen möchten, lesen Sie unsere anderen Node.js-Tutorials.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!