Unterschied zwischen npx und npm?


517

Ich habe gerade angefangen, React zu lernen, und Facebook hilft bei der Vereinfachung der Ersteinrichtung, indem es das folgende vorgefertigte Projekt bereitstellt .

Wenn ich das Skeleton-Projekt installieren muss, muss ich die npx create-react-app my-appBefehlszeile eingeben.

Ich habe mich gefragt, warum das Facebook in Github npx create-react-app my-appeher hat als npm create-react-app my-app?


23
create-react-appist ein Generator. npxgeht ins Internet und lädt das Paket vorübergehend herunter, damit es ausgeführt werden kann ( np x ). Was Sie erhalten (und wollen), ist die Ausgabe, die lokal gespeichert wird, wo Sie den Befehl ausgeführt haben.
vsync

Antworten:


644

Einführung in npx: ein npm-Paketläufer

NPM- Verwaltet Pakete , macht es aber nicht einfach , Pakete auszuführen .
NPX- Ein Tool zum Ausführen von Node-Paketen.

NPXkommt mit NPMVersion gebündelt5.2+

NPMan sich führt nicht einfach irgendein Paket aus. Tatsächlich wird kein Paket ausgeführt. Wenn Sie ein Paket mit NPM ausführen möchten, müssen Sie dieses Paket in Ihrer package.jsonDatei angeben .

Wenn ausführbare Dateien über NPM-Pakete installiert werden, verlinkt NPM auf diese:

  1. Bei lokalen Installationen werden im ./node_modules/.bin/Verzeichnis "Links" erstellt .
  2. Bei globalen Installationen werden "Links" aus dem globalen bin/Verzeichnis (z. B. /usr/local/bin) unter Linux oder unter %AppData%/npmWindows erstellt.

Dokumentation, die Sie lesen sollten


NPM:

Man könnte ein Paket lokal in einem bestimmten Projekt installieren:

npm install some-package

Angenommen, NodeJS soll dieses Paket über die Befehlszeile ausführen:

$ some-package

Das obige wird fehlschlagen . Nur global installierte Pakete können ausgeführt werden, indem nur ihr Name eingegeben wird .

Um dies zu beheben und ausführen zu lassen, müssen Sie den lokalen Pfad eingeben:

$ ./node_modules/.bin/some-package

Sie können ein lokal installiertes Paket technisch ausführen, indem Sie Ihre packages.jsonDatei bearbeiten und dieses Paket im folgenden scriptsAbschnitt hinzufügen :

{
  "name": "whatever",
  "version": "1.0.0",
  "scripts": {
    "some-package": "some-package"
  }
}

Führen Sie dann das Skript mit npm run-script(oder npm run) aus:

npm run some-package

NPX:

npxprüft, ob <command>in $PATHoder in den lokalen Projekt-Binärdateien vorhanden ist, und führt sie aus. Wenn Sie im obigen Beispiel das lokal installierte Paket ausführen möchten, müssen Sie lediglich Folgendes eingeben some-package:

npx some-package

Ein weiterer großer Vorteil von npxist die Möglichkeit, ein Paket auszuführen, das zuvor nicht installiert wurde:

$ npx create-react-app my-app

Das obige Beispiel generiert eine reactApp-Boilerplate innerhalb des Pfads, in dem der Befehl ausgeführt wurde, und stellt sicher, dass Sie immer die neueste Version eines Generators oder Build-Tools verwenden, ohne jedes Mal ein Upgrade durchführen zu müssen, wenn Sie es verwenden möchten.


Verwandte Fragen:

  1. Wie verwende ich ein lokal in node_modules installiertes Paket?
  2. NPM: Wie wird der Ordner ./node_modules/.bin bezogen?
  3. Wie führe ich eine js-Datei mit npm-Skripten aus?

2
Reagieren Sie also nicht node.js, oder? Warum ist es über 'npm' (den Knotenpaket-Manager) verfügbar?
Winklerrr

3
Vor einigen Jahren gab es Bower für das Frontend-Paketmanagement, aber seine Verwendung fiel drastisch zugunsten von npm. Unter anderem können Sie nur einen einzigen Paketmanager für alles verwenden, was mit Javascript zu tun hat, und Sie können allgemeine Auflösungen auch für die Entwicklung von Frontend-Projekten verwenden. Sie können diese Antwort auf weitere Details überprüfen . In Bezug auf die Reaktion: Nein, der Knoten wird nicht direkt verwendet, obwohl Sie ihn auch im Knoten verwenden können! (zB: serverseitiges Rendern)
RecuencoJones

1
@RecuencoJones - Sie kommentierten meine Antwort anstelle von OP
vsync

1
Ja, ich habe vergessen, @winklerrr zu erwähnen, ich habe seinen Kommentar angesprochen
RecuencoJones

1
Ich denke, die nützlichste Funktion ist die NPX-Installation des Pakets, wenn es noch nicht installiert wurde. Andernfalls fügen Sie ./node_modules/.binIhrem $ PATH hinzu und NPX wird nicht benötigt.
Ron E

78

npx ist ein npm- Paketläufer (x steht wahrscheinlich für eXecute). Die typische Verwendung besteht darin, ein Paket vorübergehend herunterzuladen und auszuführen oder es zu testen.

create-react-app ist ein npm-Paket, das voraussichtlich nur einmal im Lebenszyklus eines Projekts ausgeführt wird. Daher ist es bevorzugt, npx zu verwenden, um es in einem einzigen Schritt zu installieren und auszuführen.

Wie in der Manpage erwähnt https://www.npmjs.com/package/npx , npx können Befehle im Pfad laufen oder von node_modules / .bin standardmäßig.

Hinweis: Beim Graben können wir feststellen, dass create-react-app auf eine Javascript-Datei verweist (möglicherweise auf /usr/lib/node_modules/create-react-app/index.js auf Linux-Systemen), die in der Knotenumgebung ausgeführt wird . Dies ist einfach ein globales Tool, das einige Überprüfungen durchführt. Das eigentliche Setup erfolgt über React-Skripte, deren neueste Version im Projekt installiert ist. Weitere Informationen finden Sie unter https://github.com/facebook/create-react-app .


2
Die typische Verwendung besteht darin, die bereits lokal oder global installierte Version genauso häufig auszuführen wie ein Paket herunterzuladen und auszuführen.

69

NPM ist ein Paketmanager. Sie können node.js-Pakete mit NPM installieren

NPX ist ein Tool zum Ausführen von node.js-Paketen.

Es spielt keine Rolle, ob Sie dieses Paket global oder lokal installiert haben. NPX wird es vorübergehend installieren und ausführen. NPM kann auch Pakete ausführen, wenn Sie eine package.json-Datei konfigurieren und in den Skriptabschnitt aufnehmen.

Denken Sie also daran, wenn Sie ein Knotenpaket schnell überprüfen / ausführen möchten, ohne es lokal oder global zu installieren, verwenden Sie NPX.

np M - Manager

np X - Ausführen - leicht zu merken


Kurz und klar erklären
Barış Serkan AKIN

Weitaus besser als die langen Blogs, die ich durchgesehen habe.
Mohan Gundlapalli

Können Sie etwas näher auf das "vorübergehend" eingehen. Meinen Sie damit, dass die Binärdateien nach Ausführung des Befehls weggeworfen werden und npx gezwungen ist, die Binärdateien jedes Mal erneut herunterzuladen ?
Jim Aho

49

NPX:

Von https://www.futurehosting.com/blog/npx-makes-life-easier-for-node-developers-plus-node-vulnerability-news/ :

Webentwickler können Dutzende von Projekten auf ihren Entwicklungsmaschinen haben, und jedes Projekt hat seinen eigenen Satz von npm-installierten Abhängigkeiten. Vor einigen Jahren bestand der übliche Rat für den Umgang mit CLI-Anwendungen wie Grunt oder Gulp darin, sie lokal in jedem Projekt und auch global zu installieren, damit sie problemlos über die Befehlszeile ausgeführt werden können.

Die globale Installation verursachte jedoch so viele Probleme, wie sie löste. Projekte können von verschiedenen Versionen von Befehlszeilentools abhängen, und die Verschmutzung des Betriebssystems mit vielen entwicklungsspezifischen CLI-Tools ist ebenfalls nicht besonders gut. Heutzutage ziehen es die meisten Entwickler vor, Tools lokal zu installieren und dabei zu belassen.

Mit lokalen Versionen von Tools können Entwickler Projekte aus GitHub abrufen, ohne sich über Inkompatibilitäten mit global installierten Versionen von Tools Gedanken machen zu müssen. NPM kann nur lokale Versionen installieren und Sie können loslegen. Projektspezifische Installationen sind jedoch nicht ohne Probleme: Wie können Sie die richtige Version des Tools ausführen, ohne die genaue Position im Projekt anzugeben oder mit Aliasnamen herumzuspielen?

Das ist das Problem, das npx löst. Npx ist ein neues Tool in NPM 5.2 und ein kleines Dienstprogramm, das intelligent genug ist, um die richtige Anwendung auszuführen, wenn es aus einem Projekt heraus aufgerufen wird.

Wenn Sie beispielsweise die projektlokale Version von Mokka ausführen möchten, können Sie npx-Mokka innerhalb des Projekts ausführen und es wird das tun, was Sie erwarten.

Ein nützlicher Nebeneffekt von npx ist, dass npm-Pakete, die noch nicht installiert sind, automatisch installiert werden. Wie die Entwicklerin des Tools, Kat Marchán, betont, können Sie npx benny-hill ausführen, ohne sich mit Benny Hill befassen zu müssen, der die globale Umwelt verschmutzt.

Wenn Sie npx ausprobieren möchten, aktualisieren Sie auf die neueste Version von npm.


Wenn Sie nvm-windows verwenden, erhalten Sie mit npm wahrscheinlich kein npx, müssen es aber manuell installieren! npm i-g npx
Neil

1
NPM can just install local versions- nicht richtig. npmkann global installiert werden und es ist eine gängige Praxis.
vsync

1
Eine großartige Einführung in NPX finden Sie hier: medium.com/@maybekatz/… , von Kat Marchán.
Jeff Hu

1
@vsync Ich glaube, dies sollte interpretiert werden als "NPM kann einfach lokale Versionen installieren und Sie können loslegen ." anstatt eine Einschränkung zu implizieren.
YipYip

37

npx führt einen Befehl für ein Paket aus, ohne es explizit zu installieren.

Anwendungsfälle:

  • Sie möchten Pakete weder global noch lokal installieren.
  • Sie haben keine Berechtigung, es global zu installieren.
  • Ich möchte nur einige Befehle testen.

Syntax:

npx [options] [-p|--package <package>] <command> [command-arg]...

Paket ist optional:

npx   -p uglify-js         uglifyjs --output app.min.js app.js common.js
      +----------------+   +--------------------------------------------+
      package (optional)   command, followed by arguments

Zum Beispiel:

Start a HTTP Server      : npx http-server
Lint code                : npx eslint ./src
                         # Run uglifyjs command in the package uglify-js
Minify JS                : npx -p uglify-js uglifyjs -o app.min.js app.js common.js
Minify CSS               : npx clean-css-cli -o style.min.css css/bootstrap.css style.css
Minify HTML              : npx html-minifier index-2.html -o index.html --remove-comments --collapse-whitespace
Scan for open ports      : npx evilscan 192.168.1.10 --port=10-9999
Cast video to Chromecast : npx castnow http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/ForBiggerFun.mp4

Mehr zu command:


18

Einfache Definition:

npm - Javascript-Paketmanager

npx - Npm- Paket-Binärdateien ausführen


7

Hier ist ein Beispiel für NPX in Aktion: npx coway hallo

Wenn Sie das in Ihr Bash-Terminal eingeben, sehen Sie das Ergebnis. Dies hat den Vorteil, dass npx vorübergehend coway installiert hat. Es gibt keine Verpackungsverschmutzung, da Cowsay nicht dauerhaft installiert ist. Dies ist ideal für einmalige Pakete, bei denen Sie die Verschmutzung von Paketen vermeiden möchten.

Wie in anderen Antworten erwähnt, ist npx auch in Fällen sehr nützlich, in denen (mit npm) das Paket installiert und dann konfiguriert werden muss, bevor es ausgeführt wird. Anstatt npm zum Installieren und Konfigurieren der Datei json.package zu verwenden und dann den konfigurierten Befehl run aufzurufen, verwenden Sie stattdessen einfach npx. Ein echtes Beispiel: npx create-react-app my-app


3
Wo wird es installiert und entfernt, nachdem der Befehl beendet wurde, oder wird es für einige Zeit zwischengespeichert oder immer überprüft, ob Sie die neueste Version des Pakets haben?
redOctober13

@ redOctober13 Es gibt etwas Caching, aber npx fragt jedes Mal die npm-Registrierung nach der neuesten Version, sodass das Caching nicht allzu schnell hilft. Und es erweitert und bereinigt dann jedes Mal Abhängigkeiten.
Simon B.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.