Різниця між npx і npm?


516

Я щойно почав вивчати React, і Facebook допомагає у спрощенні початкової настройки, надаючи наступний готовий проект .

Якщо мені доведеться встановити проект скелета, я маю набрати npx create-react-app my-appв командному рядку.

Мені було цікаво, чому у Facebook в Github є, npx create-react-app my-appа не npm create-react-app my-app?


23
create-react-appє генератором. npxйде в Інтернет , тимчасово завантажуючи пакет, щоб він міг його виконати ( np x ). Що ви отримуєте (і хочете), це вихід, який зберігається локально, де ви виконали команду.
vsync

Відповіді:


643

Представляємо npx: бігунок пакету npm

NPM- Керує пакетами, але не робить життя легким виконанням .
NPX- Інструмент для виконання пакетів Node.

NPXпоставляється в комплекті з NPMверсією5.2+

NPMсам по собі не запускає жоден пакет. він фактично не запускає жодного пакету. Якщо ви хочете запустити пакет за допомогою NPM, ви повинні вказати його у своєму package.jsonфайлі.

Коли виконувані файли встановлюються через пакети NPM, NPM посилається на них:

  1. локальні установки мають "посилання", створені в ./node_modules/.bin/каталозі.
  2. глобальні встановлення мають "посилання", створені з глобального bin/каталогу (наприклад /usr/local/bin) на Linux або в %AppData%/npmWindows.

Документацію, яку ви повинні прочитати


NPM:

Можна встановити пакет локально для певного проекту:

npm install some-package

Тепер скажімо, що ви хочете, щоб NodeJS виконав цей пакет з командного рядка:

$ some-package

Сказане не вдасться . Лише встановлені в усьому світі пакети можна виконати, ввівши лише їх ім'я .

Щоб виправити це та запустити його, потрібно ввести локальний шлях:

$ ./node_modules/.bin/some-package

Ви можете технічно запустити локально встановлений пакет, відредагувавши свій packages.jsonфайл і додавши його в scriptsрозділі:

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

Потім запустіть скрипт, використовуючи npm run-script(або npm run):

npm run some-package

NPX:

npxперевірить, чи <command>існує в $PATHлокальних бінарних файлах проекту, чи виконає його. Отже, для наведеного вище прикладу, якщо ви хочете виконати локально встановлений пакет, some-packageвсе, що вам потрібно зробити, це набрати:

npx some-package

Ще одна головна перевага npx- можливість виконувати пакет, який раніше не був встановлений:

$ npx create-react-app my-app

Наведений вище приклад генерує reactкотло для додатків у межах шляху, за яким пройшла команда, і гарантує, що ви завжди використовуєте останню версію генератора чи інструменту побудови, не потребуючи оновлення кожного разу, коли ви збираєтесь його використовувати.


Пов’язані запитання:

  1. Як використовувати пакет, встановлений локально в node_modules?
  2. NPM: як джерело ./node_modules/.bin папки?
  3. Як запустити файл js за допомогою сценаріїв npm?

2
Тож реагуйте не використовуйте node.js, правда? Чому він доступний через 'npm' (менеджер пакетів вузлів)?
winklerrr

3
Декілька років тому з'явився Бауер для управління пакетними пакетами, але його використання різко припало на користь npm. Серед деяких причин, ви можете просто використовувати єдиний менеджер пакунків для всього, що стосується javascript, і ви можете використовувати роздільні рішення commonjs для розробки проектів інтерфейсів. Ви можете перевірити цю відповідь для отримання більш детальної інформації. Щодо реагування: ні, він не використовує безпосередньо вузол, хоча ви можете використовувати його і у вузлі! (наприклад: надання серверної сторони)
RecuencoJones

1
@RecuencoJones - Ви прокоментували мою відповідь замість ОП
vsync

1
Так, я забув згадати @winklerrr, я звертався до його коментаря
RecuencoJones

1
Я думаю, що найкориснішою особливістю є встановлення пакету NPX, коли він ще не встановлений. В іншому випадку додайте ./node_modules/.binдо $ PATH і NPX не потрібен.
Рон Е

78

npx - бігунок пакету npm (x, ймовірно, означає eXecute). Типовим способом є завантаження та запуск пакета тимчасово або для випробувань.

create-react-app - це пакет npm, який, як очікується, буде запущений лише один раз у життєвому циклі проекту. Отже, бажано використовувати npx для її установки та запуску в один крок.

Як згадується на сторінці man https://www.npmjs.com/package/npx , npx може запускати команди в PATH або з node_modules / .bin за замовчуванням.

Примітка. Деяким копанням ми можемо виявити, що додаток create-react вказує на файл Javascript (можливо, на /usr/lib/node_modules/create-react-app/index.js в системах Linux), який виконується в середовищі вузла . Це просто глобальний інструмент, який робить деякі перевірки. Фактична настройка виконується за допомогою react-скриптів, остання версія яких встановлена ​​в проекті. Для отримання додаткової інформації див. Https://github.com/facebook/create-react-app .


2
Типове використання - це так само часто для запуску вже встановленої версії локально або глобально, як і для завантаження та запуску пакета.

69

NPM - менеджер пакетів, ви можете встановити node.js пакети за допомогою NPM

NPX - це інструмент для виконання пакетів node.js.

Не має значення, встановили ви цей пакет глобально чи локально. NPX тимчасово встановить його та запустить. NPM також може запускати пакети, якщо налаштувати файл package.json і включити його в розділ сценарію.

Тому пам’ятайте про це, якщо ви хочете швидко перевірити / запустити пакет вузлів, не встановлюючи локально чи глобально, використовуйте NPX.

np M - менеджер

np X - Виконати - легко запам’ятати


Коротке та чітке пояснення
Barış Serkan AKIN

Набагато краще, ніж тривалі блоги, через які я пройшов.
Мохан Гундлапаллі

Чи можете ви детальніше розібратися на "тимчасово". Ви маєте на увазі, що двійкові файли викидаються після виконання команди, змушуючи npx кожен раз перевантажувати двійкові файли ?
Джим Ахо

49

NPX:

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

Веб-розробники можуть мати десятки проектів на своїх розробних машинах, і кожен проект має свій певний набір встановлених npm залежностей. Кілька років тому звичайною порадою для роботи з такими програмами CLI, як Grunt або Gulp, було встановлення їх локально у кожному проекті, а також глобально, щоб їх можна було легко запустити з командного рядка.

Але встановлення глобально спричинило стільки проблем, скільки вирішено. Проекти можуть залежати від різних версій інструментів командного рядка, і забруднення операційної системи безліччю інструментів CLI, що стосуються розробки, теж не чудово. Сьогодні більшість розробників вважають за краще встановлювати інструменти локально та залишати це при цьому.

Локальні версії інструментів дозволяють розробникам витягувати проекти з GitHub, не турбуючись про несумісність із глобально встановленими версіями інструментів. NPM може просто встановити локальні версії, і ви готові йти. Але специфічні для проекту установки не без проблем: як запустити правильну версію інструменту, не вказуючи його точне місце розташування в проекті або граючи з псевдонімами?

Ось ця проблема вирішує npx. Новий інструмент, включений до NPM 5.2, npx - це невелика утиліта, яка досить розумна, щоб запустити потрібну програму, коли вона викликається з проекту.

Якщо ви хотіли запустити проектну локальну версію mocha, наприклад, ви можете запустити npx mocha всередині проекту, і він зробить те, що ви очікуєте.

Корисна побічна перевага npx полягає в тому, що він автоматично встановлює npm-пакети, які ще не встановлені. Отже, як вказує творець інструменту Кат Марган, ви можете запускати npx Benny-Hill, не маючи справу з Benny Hill, що забруднює глобальне середовище.

Якщо ви хочете взяти npx для віджимання, оновіть до останньої версії npm.


Якщо ви використовуєте nvm-windows, ви, ймовірно, не отримаєте npx з npm, але вам потрібно встановити його вручну! npm i -g npx
Ніл

1
NPM can just install local versions- не вірно. npmможе встановити глобальний, і це звичайна практика.
vsync

1
Чудовий вступ до NPX можна знайти тут: medium.com/@maybekatz/… , Кат Марчан.
Джефф Ху

1
@vsync Я вважаю, що це слід інтерпретувати як "NPM може просто встановити локальні версії, і ви готові йти". а не передбачає обмеження.
YipYip

37

npx запускає команду пакета, не встановлюючи його явно.

Користувачі:

  • Ви не хочете встановлювати пакети ні глобально, ні локально.
  • Ви не маєте дозволу встановлювати його в усьому світі.
  • Просто хочу перевірити деякі команди.

Синтаксис:

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

Пакет не є обов'язковим:

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

Наприклад:

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

Більше про command:



7

Ось приклад NPX в дії: npx cowsay hello

Якщо ви введете це в баш-термінал, ви побачите результат. Перевага цього в тому, що npx тимчасово встановив коровай. Забруднення упаковки немає, оскільки корова не встановлена ​​постійно. Це відмінно підходить для разових пакетів, коли ви хочете уникнути забруднення упаковки.

Як згадується в інших відповідях, npx також дуже корисний у випадках, коли (з npm) пакет потрібно встановити, а потім налаштувати перед запуском. Наприклад, замість того, щоб використовувати npm для установки, а потім налаштувати файл json.package, а потім викликати налаштовану команду run, просто використовуйте npx. Реальний приклад: npx create-react-app my-app


3
Де він встановлений і чи видаляє його після завершення команди, чи кеширує її протягом певного проміжку часу, або завжди перевіряє, чи є у вас найновіша версія пакета?
redO жовтня13

@ redO жовтня13 є деяке кешування, але npx також щоразу запитує реєстр npm для новітньої версії, тому кешування не надто допомагає зі швидкістю. І вона щоразу розширюється, а потім очищає залежності.
Саймон Б.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.