Différence entre npx et npm?

517

Je viens de commencer à apprendre React, et Facebook aide à simplifier la configuration initiale en fournissant le projet prêt à l'emploi suivant .

Si je dois installer le projet squelette, je dois taper npx create-react-app my-appen ligne de commande.

Je me demandais pourquoi le Facebook dans Github a npx create-react-app my-appplutôt que npm create-react-app my-app?

Paresh Maniyar
la source
23
create-react-appest un générateur. npxva sur Internet , télécharge le paquet temporairement afin qu'il puisse l'exécuter ( np x ). Ce que vous obtenez (et que vous voulez) est la sortie, qui est enregistrée localement, où vous avez exécuté la commande.
vsync

Réponses:

644

Présentation de npx: un exécuteur de packages npm

NPM- Gérer les paquets , mais ne rend pas la vie facile d' exécuter tout.
NPX- Un outil pour exécuter des packages Node.

NPXest livré avec la NPMversion5.2+

NPMen lui-même n'exécute pas n'importe quel package. en fait, il n'exécute aucun paquet. Si vous souhaitez exécuter un package à l'aide de NPM, vous devez spécifier ce package dans votre package.jsonfichier.

Lorsque les exécutables sont installés via des packages NPM, NPM les relie:

  1. les installations locales ont des "liens" créés dans le ./node_modules/.bin/répertoire.
  2. les installations globales ont des "liens" créés à partir du bin/répertoire global (par exemple /usr/local/bin) sous Linux ou %AppData%/npmsous Windows.

Documentation à lire


NPM:

On pourrait installer un paquet localement sur un certain projet:

npm install some-package

Supposons maintenant que vous souhaitez que NodeJS exécute ce package à partir de la ligne de commande:

$ some-package

Ce qui précède échouera . Seuls les packages installés globalement peuvent être exécutés en tapant uniquement leur nom .

Pour résoudre ce problème et le faire exécuter, vous devez taper le chemin local:

$ ./node_modules/.bin/some-package

Vous pouvez techniquement exécuter un package installé localement en modifiant votre packages.jsonfichier et en ajoutant ce package dans la scriptssection:

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

Exécutez ensuite le script en utilisant npm run-script(ou npm run):

npm run some-package

NPX:

npxvérifiera s'il <command>existe dans $PATHou dans les binaires du projet local et l'exécutera. Ainsi, pour l'exemple ci-dessus, si vous souhaitez exécuter le package installé localement, some-packagetout ce que vous devez faire est de taper:

npx some-package

Un autre avantage majeur de npxest la possibilité d'exécuter un package qui n'a pas été précédemment installé:

$ npx create-react-app my-app

L'exemple ci-dessus va générer un passe- reactpartout d'application dans le chemin d'accès de la commande et garantit que vous utilisez toujours la dernière version d'un générateur ou d'un outil de construction sans avoir à mettre à niveau chaque fois que vous êtes sur le point de l'utiliser.


Questions connexes:

  1. Comment utiliser le package installé localement dans node_modules?
  2. NPM: comment récupérer le dossier ./node_modules/.bin?
  3. Comment exécuter un fichier js à l'aide de scripts npm?
vsync
la source
2
Alors réagissez node.js, n'utilisez pas , non? Pourquoi est-il disponible via 'npm' (le gestionnaire de packages de nœuds)?
winklerrr
3
Il y a quelques années, il y avait Bower pour la gestion des packages frontaux, mais son utilisation a considérablement chuté en faveur de npm. Parmi certaines raisons, vous pouvez simplement utiliser un seul gestionnaire de packages pour tout ce qui concerne le javascript, et vous pouvez également utiliser des résolutions commonjs pour développer des projets frontend. Vous pouvez vérifier cette réponse pour plus de détails. Concernant react: non, il n'utilise pas directement node, bien que vous puissiez aussi l'utiliser en node! (par exemple: rendu côté serveur)
RecuencoJones
1
@RecuencoJones - Vous avez commenté ma réponse au lieu de OP
vsync
1
Oui, j'ai oublié de mentionner @winklerrr, je répondais à son commentaire
RecuencoJones
1
Je pense que la fonctionnalité la plus utile est l'installation par NPX du paquet quand il n'a pas encore été installé. Sinon, ajoutez ./node_modules/.binà votre $ PATH et NPX n'est pas nécessaire.
Ron E
78

npx est un exécuteur de packages npm (x signifie probablement eXecute). L'utilisation typique consiste à télécharger et à exécuter un package temporairement ou pour des essais.

create-react-app est un package npm qui ne devrait être exécuté qu'une seule fois dans le cycle de vie d'un projet. Par conséquent, il est préférable d'utiliser npx pour l'installer et l'exécuter en une seule étape.

Comme mentionné dans la page de manuel https://www.npmjs.com/package/npx , npx peut exécuter des commandes dans le PATH ou à partir de node_modules / .bin par défaut.

Remarque: Avec quelques recherches, nous pouvons constater que create-react-app pointe vers un fichier Javascript (éventuellement vers /usr/lib/node_modules/create-react-app/index.js sur les systèmes Linux) qui est exécuté dans l'environnement de nœud . Il s'agit simplement d'un outil global qui effectue certaines vérifications. La configuration proprement dite se fait par react-scripts, dont la dernière version est installée dans le projet. Consultez https://github.com/facebook/create-react-app pour plus d'informations.

dww
la source
2
L'utilisation typique consiste tout aussi souvent à exécuter la version déjà installée localement ou globalement qu'à télécharger et exécuter un package.
69

NPM est un gestionnaire de packages, vous pouvez installer des packages node.js à l'aide de NPM

NPX est un outil pour exécuter des packages node.js.

Peu importe que vous ayez installé ce package globalement ou localement. NPX l'installera temporairement et l'exécutera. NPM peut également exécuter des packages si vous configurez un fichier package.json et l'incluez dans la section de script.

Souvenez-vous donc de ceci, si vous voulez vérifier / exécuter un paquet de nœuds rapidement sans installer localement ou globalement utiliser NPX.

np M - Gestionnaire

np X - Exécuter - facile à retenir

cherankrish
la source
Explication
Bien mieux que les longs blogs que j'ai parcourus.
Mohan Gundlapalli
Pouvez-vous élaborer un peu sur le "temporairement". Voulez-vous dire que les fichiers binaires sont jetés après l'exécution de la commande, forçant npx à télécharger à nouveau les fichiers binaires à chaque fois?
Jim Aho
49

NPX:

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

Les développeurs Web peuvent avoir des dizaines de projets sur leurs machines de développement, et chaque projet a son propre ensemble particulier de dépendances installées par npm. Il y a quelques années, le conseil habituel pour traiter des applications CLI telles que Grunt ou Gulp était de les installer localement dans chaque projet et également globalement afin qu'elles puissent facilement être exécutées à partir de la ligne de commande.

Mais l'installation à l'échelle mondiale a causé autant de problèmes qu'elle a résolu. Les projets peuvent dépendre de différentes versions des outils de ligne de commande, et polluer le système d'exploitation avec de nombreux outils CLI spécifiques au développement n'est pas non plus génial. Aujourd'hui, la plupart des développeurs préfèrent installer les outils localement et en rester là.

Les versions locales d'outils permettent aux développeurs d'extraire des projets de GitHub sans se soucier des incompatibilités avec les versions d'outils installées globalement. NPM peut simplement installer des versions locales et vous êtes prêt à partir. Mais les installations spécifiques à un projet ne sont pas sans problèmes: comment exécuter la bonne version de l'outil sans spécifier son emplacement exact dans le projet ou jouer avec des alias?

C'est le problème que npx résout. Un nouvel outil inclus dans NPM 5.2, npx est un petit utilitaire suffisamment intelligent pour exécuter la bonne application lorsqu'elle est appelée à partir d'un projet.

Si vous souhaitez exécuter la version locale de mocha du projet, par exemple, vous pouvez exécuter npx mocha à l'intérieur du projet et il fera ce que vous attendez.

Un avantage secondaire utile de npx est qu'il installera automatiquement les packages npm qui ne sont pas déjà installés. Ainsi, comme le fait remarquer le créateur de l'outil, Kat Marchán, vous pouvez exécuter npx benny-hill sans avoir à faire face à la pollution de Benny Hill par l'environnement mondial.

Si vous voulez faire tourner npx, mettez à jour vers la version la plus récente de npm.

Venkat Ch
la source
Si vous utilisez nvm-windows, vous n'obtiendrez probablement pas npx avec npm, mais vous devez l'installer manuellement! npm i -g npx
Neil
1
NPM can just install local versions- Pas correcte. npmpeut installer global et c'est une pratique courante.
vsync
1
Une excellente introduction à NPX peut être trouvée ici: medium.com/@maybekatz/… , par Kat Marchán.
Jeff Hu
1
@vsync Je pense que cela devrait être interprété comme "NPM peut simplement installer des versions locales et vous êtes prêt à partir." plutôt que d'impliquer une limitation.
YipYip
37

npx exécute une commande d'un package sans l'installer explicitement.

Cas d'utilisation:

  • Vous ne voulez pas installer de packages ni globalement ni localement.
  • Vous n'êtes pas autorisé à l'installer globalement.
  • Je veux juste tester certaines commandes.

Syntaxe:

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

Le forfait est facultatif:

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

Par exemple:

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

En savoir plus sur command:

Ninh Pham
la source
18

Définition simple:

npm - Gestionnaire de packages Javascript

npx - Exécute les binaires du package npm

Yassine Qoraiche
la source
7

Voici un exemple de NPX en action: npx cowsay hello

Si vous tapez cela dans votre terminal bash, vous verrez le résultat. L'avantage de ceci est que npx a temporairement installé cowsay. Il n'y a pas de pollution de colis car cowsay n'est pas installé en permanence. C'est idéal pour les colis uniques où vous voulez éviter la pollution des colis.

Comme mentionné dans d'autres réponses, npx est également très utile dans les cas où (avec npm) le package doit être installé puis configuré avant de s'exécuter. Par exemple, au lieu d'utiliser npm pour installer puis configurer le fichier json.package, puis appeler la commande run configurée, utilisez simplement npx à la place. Un exemple réel: npx create-react-app my-app

Risteard
la source
3
Où l'installe-t-il et le supprime-t-il une fois la commande terminée, ou le cache-t-il pendant un certain temps, ou vérifie-t-il toujours que vous disposez de la version la plus récente du package?
redOctober13
@ redOctober13 il y a une certaine mise en cache, mais npx demande également au registre npm la version la plus récente à chaque fois, donc la mise en cache n'aide pas trop avec la vitesse. Et il se développe et nettoie les dépendances à chaque fois.
Simon B.