Differenza tra npx e npm?


517

Ho appena iniziato a studiare React e Facebook aiuta a semplificare la configurazione iniziale fornendo il seguente progetto già pronto .

Se devo installare il progetto skeleton devo digitare la npx create-react-app my-appriga di comando.

Mi chiedevo perché Facebook ha in Github npx create-react-app my-apppiuttosto che npm create-react-app my-app?


23
create-react-appè un generatore. npxva su Internet , scaricando temporaneamente il pacchetto in modo da poterlo eseguire ( np x ). Quello che ottieni (e vuoi) è l'output, che viene salvato localmente, dove hai eseguito il comando.
vsync,

Risposte:


644

Presentazione di npx: un runner di pacchetti npm

NPM- Gestisce i pacchetti , ma non rende la vita facile l'esecuzione di qualsiasi.
NPX- Uno strumento per l' esecuzione di pacchetti di nodi.

NPXviene fornito in bundle con la NPMversione5.2+

NPMda solo non esegue semplicemente alcun pacchetto. in realtà non esegue alcun pacchetto. Se si desidera eseguire un pacchetto utilizzando NPM, è necessario specificare quel pacchetto nel package.jsonfile.

Quando gli eseguibili sono installati tramite pacchetti NPM, NPM li collega:

  1. le installazioni locali hanno "collegamenti" creati nella ./node_modules/.bin/directory.
  2. le installazioni globali hanno "collegamenti" creati dalla bin/directory globale (ad es. /usr/local/bin) su Linux o %AppData%/npmsu Windows.

Documentazione da leggere


NPM:

Si potrebbe installare un pacchetto localmente su un determinato progetto:

npm install some-package

Ora diciamo che vuoi che NodeJS esegua quel pacchetto dalla riga di comando:

$ some-package

Quanto sopra fallirà . Solo i pacchetti installati a livello globale possono essere eseguiti digitando solo il loro nome .

Per risolvere questo problema e farlo funzionare, devi digitare il percorso locale:

$ ./node_modules/.bin/some-package

È possibile eseguire tecnicamente un pacchetto installato localmente modificando il packages.jsonfile e aggiungendo quel pacchetto nella scriptssezione:

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

Quindi eseguire lo script utilizzando npm run-script(o npm run):

npm run some-package

NPX:

npxcontrollerà se <command>esiste $PATHo nei file binari del progetto locale e lo eseguirà. Quindi, per l'esempio sopra, se si desidera eseguire il pacchetto installato localmente, some-packageè sufficiente digitare:

npx some-package

Un altro grande vantaggio di npxè la possibilità di eseguire un pacchetto che non era stato precedentemente installato:

$ npx create-react-app my-app

L'esempio di cui sopra genererà un reactboilerplate per app all'interno del percorso in cui era stato eseguito il comando e garantisce di utilizzare sempre la versione più recente di un generatore o di uno strumento di creazione senza dover aggiornare ogni volta che si sta per usarlo.


Domande correlate:

  1. Come utilizzare il pacchetto installato localmente in node_modules?
  2. NPM: come sorgente ./node_modules/.bin cartella?
  3. Come si esegue un file js utilizzando gli script npm?

2
Quindi reagire non usa node.js, giusto? Perché è disponibile tramite 'npm' (il gestore pacchetti nodo)?
winklerrr

3
Alcuni anni fa, c'era Bower per la gestione dei pacchetti frontend, ma il suo utilizzo è drasticamente sceso a favore di npm. Tra alcuni motivi, potresti usare un solo gestore di pacchetti per tutto ciò che riguarda javascript e puoi usare risoluzioni commonjs anche per lo sviluppo di progetti frontend. Puoi controllare questa risposta per ulteriori dettagli. Per quanto riguarda la reazione: no, non usa direttamente il nodo, anche se puoi usarlo anche nel nodo! (es. rendering lato server)
RecuencoJones

1
@RecuencoJones - Hai commentato la mia risposta anziché OP
vsync

1
Sì, ho dimenticato di menzionare @winklerrr, mi stavo rivolgendo al suo commento
RecuencoJones,

1
Penso che la caratteristica più utile sia NPX che installa il pacchetto quando non è stato ancora installato. Altrimenti aggiungi ./node_modules/.bina $ PATH e NPX non è necessario.
Ron E

78

npx è un runner di pacchetti npm (x probabilmente sta per eXecute). L'uso tipico è scaricare ed eseguire un pacchetto temporaneamente o per prove.

create- reply -app è un pacchetto npm che dovrebbe essere eseguito una sola volta nel ciclo di vita di un progetto. Pertanto, si preferisce utilizzare npx per installarlo ed eseguirlo in un unico passaggio.

Come menzionato nella pagina man https://www.npmjs.com/package/npx , npx può eseguire comandi nel PATH o da node_modules / .bin per impostazione predefinita.

Nota: con alcuni scavi, possiamo trovare che create-reply-app punta a un file Javascript (possibilmente a /usr/lib/node_modules/create-react-app/index.js su sistemi Linux) che viene eseguito all'interno dell'ambiente del nodo . Questo è semplicemente uno strumento globale che esegue alcuni controlli. La configurazione effettiva viene eseguita da reazioni-script, la cui ultima versione è installata nel progetto. Fare riferimento a https://github.com/facebook/create-react-app per maggiori informazioni.


2
L'uso tipico è altrettanto spesso per eseguire la versione già installata localmente o globalmente come lo è per scaricare ed eseguire un pacchetto.

69

NPM è un gestore di pacchetti, è possibile installare i pacchetti node.js utilizzando NPM

NPX è uno strumento per eseguire pacchetti node.js.

Non importa se il pacchetto è stato installato a livello globale o locale. NPX lo installerà temporaneamente ed eseguirà. NPM può anche eseguire pacchetti se si configura un file package.json e lo si include nella sezione script.

Quindi ricorda questo, se vuoi controllare / eseguire rapidamente un pacchetto di nodi senza installare localmente o globalmente usare NPX.

np M - Manager

np X - Esegui - facile da ricordare



Molto meglio dei lunghi blog che ho passato.
Mohan Gundlapalli,

Puoi approfondire un po 'il "temporaneamente". Vuoi dire che i binari vengono eliminati dopo aver eseguito il comando, costringendo npx a scaricare di nuovo i binari ogni volta?
Jim Aho,

49

NPX:

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

Gli sviluppatori Web possono avere dozzine di progetti sulle loro macchine di sviluppo e ogni progetto ha il suo set specifico di dipendenze installate da npm. Qualche anno fa, il consueto consiglio per gestire le applicazioni della CLI come Grunt o Gulp era di installarle localmente in ciascun progetto e anche a livello globale in modo che potessero essere facilmente eseguite dalla riga di comando.

Ma l'installazione a livello globale ha causato tanti problemi quanti ne ha risolti. I progetti possono dipendere da diverse versioni degli strumenti da riga di comando e l'inquinamento del sistema operativo con molti strumenti CLI specifici per lo sviluppo non è eccezionale. Oggi, la maggior parte degli sviluppatori preferisce installare strumenti localmente e lasciarlo a quello.

Le versioni locali degli strumenti consentono agli sviluppatori di estrarre progetti da GitHub senza preoccuparsi delle incompatibilità con le versioni degli strumenti installate a livello globale. NPM può semplicemente installare versioni locali e sei a posto. Ma le installazioni specifiche del progetto non sono prive di problemi: come si esegue la versione corretta dello strumento senza specificare la sua posizione esatta nel progetto o giocare con gli alias?

Questo è il problema che npx risolve. Un nuovo strumento incluso in NPM 5.2, npx è una piccola utility abbastanza intelligente da eseguire l'applicazione giusta quando viene chiamata da un progetto.

Ad esempio, se si desidera eseguire la versione locale del progetto mocha, è possibile eseguire npx mocha all'interno del progetto e farà ciò che ci si aspetta.

Un utile vantaggio di npx è che installerà automaticamente i pacchetti npm che non sono già installati. Quindi, come sottolinea Kat Marchán, il creatore dello strumento, puoi eseguire npx benny-hill senza dover affrontare Benny Hill inquinando l'ambiente globale.

Se vuoi prendere npx per un giro, aggiorna alla versione più recente di npm.


Se stai usando nvm-windows probabilmente non otterrai npx con npm, ma dovrai installarlo manualmente! npm i -g npx
Neil

1
NPM can just install local versions- Non corretto. npmpuò installare globale ed è una pratica comune.
vsync,

1
Una grande introduzione a NPX può essere trovata qui: medium.com/@maybekatz/… , di Kat Marchán.
Jeff Hu,

1
@vsync Credo che questo dovrebbe essere interpretato come "NPM può semplicemente installare versioni locali e sei a posto". piuttosto che implicare una limitazione.
YipYip

37

npx esegue un comando di un pacchetto senza installarlo esplicitamente.

Casi d'uso:

  • Non si desidera installare pacchetti né globalmente né localmente.
  • Non sei autorizzato a installarlo a livello globale.
  • Voglio solo testare alcuni comandi.

Sintassi:

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

Il pacchetto è opzionale:

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

Per esempio:

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

Maggiori informazioni su command:


18

Definizione semplice:

npm - Gestore di pacchetti Javascript

npx - Esegue i binari del pacchetto npm


7

Ecco un esempio di NPX in azione: ciao cpay npx

Se lo digiti nel tuo terminale bash vedrai il risultato. Il vantaggio è che npx ha installato temporaneamente Cowsay. Non vi è alcun inquinamento del pacchetto poiché Cowsay non è installato in modo permanente. Questo è ottimo per i pacchetti unici in cui si desidera evitare l'inquinamento dei pacchetti.

Come menzionato in altre risposte, npx è anche molto utile nei casi in cui (con npm) il pacchetto deve essere installato e configurato prima di essere eseguito. Ad esempio, invece di utilizzare npm per installare e quindi configurare il file json.package e quindi chiamare il comando di esecuzione configurato, utilizzare invece npx. Un vero esempio: npx create-reply-app my-app


3
Dove lo installa e lo rimuove al termine del comando o lo memorizza nella cache per un certo periodo di tempo o verifica sempre di disporre della versione più recente del pacchetto?
rosso ottobre 13

@ redOctober13 c'è un po 'di memorizzazione nella cache, ma npx richiede anche al registro di npm la versione più recente ogni volta, quindi la memorizzazione nella cache non aiuta molto con la velocità. E si espande e poi pulisce le dipendenze ogni volta.
Simon B.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.