Różnica między npx a npm?

516

Właśnie zacząłem uczyć się React, a Facebook pomaga uprościć początkową konfigurację, udostępniając następujący gotowy projekt .

Jeśli muszę zainstalować szkielet projektu, muszę wpisać npx create-react-app my-appw wierszu polecenia.

Zastanawiałem się, dlaczego Facebook w Github ma npx create-react-app my-appraczej npm create-react-app my-app?

Paresh Maniyar
źródło
23
create-react-appjest generatorem. npxidzie do Internetu , tymczasowo pobiera pakiet, aby go wykonać ( np. x ). To, co dostajesz (i chcesz), to wyjście, które jest zapisywane lokalnie w miejscu, w którym uruchomiłeś polecenie.
vsync,
Temat
RBT

Odpowiedzi:

643

Przedstawiamy npx: program uruchamiający pakiety npm

NPM- Zarządza pakiety ale nie ułatwia życia wykonujący każdy.
NPX- Narzędzie do wykonywania pakietów Node.

NPX jest w pakiecie z NPM wersją5.2+

NPMsam w sobie nie uruchamia żadnego pakietu. tak naprawdę nie uruchamia żadnego pakietu. Jeśli chcesz uruchomić pakiet za pomocą NPM, musisz określić ten pakiet w swoim package.jsonpliku.

Gdy pliki wykonywalne są instalowane za pośrednictwem pakietów NPM, NPM prowadzi do nich linki:

  1. lokalnyinstalacje mają „linki” utworzone w ./node_modules/.bin/katalogu.
  2. instalacje globalne mają „łącza” utworzone z bin/katalogu globalnego (np. /usr/local/bin) w systemie Linux lub w%AppData%/npm systemie Windows.

Dokumentacja, którą powinieneś przeczytać


NPM:

Można zainstalować pakiet lokalnie w określonym projekcie:

npm install some-package

Powiedzmy teraz, że chcesz, aby NodeJS wykonał ten pakiet z wiersza poleceń:

$ some-package

Powyższe nie powiedzie się . Tylko globalnie zainstalowane pakiety można wykonać, wpisując ich nazwę tylko .

Aby to naprawić i uruchomić, musisz wpisać ścieżkę lokalną:

$ ./node_modules/.bin/some-package

Możesz technicznie uruchomić lokalnie zainstalowany pakiet, edytując packages.jsonplik i dodając ten pakiet w scriptssekcji:

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

Następnie uruchom skrypt za pomocą npm run-script(lub npm run):

npm run some-package

NPX:

npxsprawdzi, czy <command>istnieje w $PATHlokalnych plikach binarnych projektu, czy też go uruchomi. Tak więc, w powyższym przykładzie, jeśli chcesz uruchomić pakiet zainstalowany lokalnie, some-packagewszystko co musisz zrobić, to wpisać:

npx some-package

Kolejną ważną zaletąnpx jest możliwość wykonania pakietu, który nie był wcześniej zainstalowany:

$ npx create-react-app my-app

Powyższy przykład generowania reactaplikacji Gotowa w ścieżce, w której uruchomiono polecenie, i zapewnia, że ​​zawsze używasz najnowszej wersji generatora lub narzędzia do budowania bez konieczności aktualizacji za każdym razem, gdy będziesz go używać.


Powiązane pytania:

  1. Jak korzystać z pakietu zainstalowanego lokalnie w module node_modules?
  2. NPM: jak zdobyć folder ./node_modules/.bin?
  3. Jak uruchomić plik js przy użyciu skryptów npm?
vsync
źródło
2
Więc reaguj nie używaj node.js, prawda? Dlaczego jest dostępny przez „npm” (menedżer pakietów węzłów)?
winklerrr
3
Kilka lat temu istniało Bower do zarządzania pakietami frontendowymi, ale jego użycie drastycznie spadło na korzyść npm. Między innymi możesz użyć jednego menedżera pakietów do wszystkiego, co jest związane z javascript, a także możesz używać rozdzielczości commonjs do tworzenia projektów frontendowych. Możesz sprawdzić tę odpowiedź w celu uzyskania dalszych szczegółów. Jeśli chodzi o reakcję: nie, nie używa bezpośrednio węzła, chociaż można go również używać w węźle! (np. renderowanie po stronie serwera)
RecuencoJones
1
@RecuencoJones - Skomentowałeś moją odpowiedź zamiast OP
vsync
1
Tak, zapomniałem wspomnieć o @winklerrr, odpowiadałem na jego komentarz
RecuencoJones
1
Myślę, że najbardziej użyteczną funkcją jest instalacja pakietu NPX, gdy jeszcze nie został zainstalowany. W przeciwnym razie dodaj ./node_modules/.bindo $ PATH, a NPX nie będzie potrzebny.
Ron E
78

npx jest programem uruchamiającym pakiety npm (x prawdopodobnie oznacza eXecute). Typowym zastosowaniem jest pobieranie i uruchamianie pakietu tymczasowo lub na potrzeby prób.

Utwórz aplikację reagującą to pakiet npm, który ma być uruchamiany tylko raz w cyklu życia projektu. Dlatego zaleca się stosowanie npx do zainstalowania i uruchomienia go w jednym kroku.

Jak wspomniano na stronie podręcznika https://www.npmjs.com/package/npx , npx może domyślnie uruchamiać polecenia w PATH lub z node_modules / .bin.

Uwaga: po pewnym kopaniu możemy odkryć, że create-reag-app wskazuje na plik JavaScript (prawdopodobnie na /usr/lib/node_modules/create-react-app/index.js w systemach Linux), który jest wykonywany w środowisku węzła . Jest to po prostu globalne narzędzie, które sprawdza niektóre elementy. Właściwa konfiguracja odbywa się za pomocą skryptów reagujących, których najnowsza wersja jest zainstalowana w projekcie. Więcej informacji można znaleźć na https://github.com/facebook/create-react-app .

dww
źródło
2
Typowym zastosowaniem jest równie często uruchamianie wersji już zainstalowanej lokalnie lub globalnie, jak pobieranie i uruchamianie pakietu.
69

NPM to menedżer pakietów, możesz zainstalować pakiety node.js za pomocą NPM

NPX to narzędzie do uruchamiania pakietów node.js.

Nie ma znaczenia, czy zainstalowałeś ten pakiet globalnie czy lokalnie. NPX zainstaluje go tymczasowo i uruchomi. NPM może również uruchamiać pakiety, jeśli skonfigurujesz plik package.json i umieścisz go w sekcji skryptu.

Więc pamiętaj o tym, jeśli chcesz szybko sprawdzić / uruchomić pakiet węzła bez instalowania lokalnego lub globalnego, użyj NPX.

np. M - Manager

np X - Wykonaj - łatwy do zapamiętania

cherankrish
źródło
Krótkie i jasne wyjaśnienie
Barış Serkan AKIN
Znacznie lepiej niż długie blogi, które przeglądałem.
Mohan Gundlapalli
Czy możesz trochę rozwinąć „tymczasowo”. Czy masz na myśli, że pliki binarne są wyrzucane po wykonaniu polecenia, zmuszając npx do ponownego pobierania plików binarnych za każdym razem?
Jim Aho
49

NPX:

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

Programiści WWW mogą mieć dziesiątki projektów na swoich komputerach programistycznych, a każdy projekt ma swój własny zestaw zależności zainstalowanych npm. Kilka lat temu zwykłą radą do radzenia sobie z aplikacjami CLI, takimi jak Grunt lub Gulp, było instalowanie ich lokalnie w każdym projekcie, a także globalnie, aby można je było łatwo uruchomić z wiersza polecenia.

Ale instalacja na całym świecie spowodowała tyle problemów, ile udało się rozwiązać. Projekty mogą zależeć od różnych wersji narzędzi wiersza polecenia, a zanieczyszczenie systemu operacyjnego wieloma narzędziami CLI przeznaczonymi dla programistów również nie jest świetne. Obecnie większość programistów woli instalować narzędzia lokalnie i na tym pozostawia.

Lokalne wersje narzędzi pozwalają programistom pobierać projekty z GitHub bez obawy o niezgodność z zainstalowanymi na całym świecie wersjami narzędzi. NPM może po prostu zainstalować wersje lokalne i możesz zacząć. Ale instalacje specyficzne dla projektu nie są bezproblemowe: jak uruchomić odpowiednią wersję narzędzia bez określania jego dokładnej lokalizacji w projekcie lub korzystania z aliasów?

To jest problem, który rozwiązuje npx. Nowe narzędzie zawarte w NPM 5.2, npx to małe narzędzie, które jest wystarczająco inteligentne, aby uruchomić odpowiednią aplikację, gdy zostanie wywołana z projektu.

Jeśli chcesz na przykład uruchomić lokalną wersję mokki dla projektu, możesz uruchomić npx mokkę wewnątrz projektu i zrobi to, czego oczekujesz.

Przydatną zaletą npx jest to, że automatycznie zainstaluje pakiety npm, które nie zostały jeszcze zainstalowane. Jak podkreśla twórca narzędzia, Kat Marchán, możesz uruchomić npx Benny-Hill bez konieczności radzenia sobie z zanieczyszczeniem globalnego środowiska przez Benny Hill.

Jeśli chcesz wziąć npx na spin, zaktualizuj do najnowszej wersji npm.

Venkat Ch
źródło
Jeśli używasz nvm-windows, prawdopodobnie nie dostaniesz npx z npm, ale musisz zainstalować go ręcznie! npm i -g npx
Neil,
1
NPM can just install local versions- niepoprawne. npmmożna zainstalować globalnie i jest to powszechna praktyka.
vsync
1
Świetne wprowadzenie do NPX można znaleźć tutaj: medium.com/@maybekatz/... , autor: Kat Marchán.
Jeff Hu
1
@vsync Uważam, że należy to interpretować jako „NPM może po prostu zainstalować wersje lokalne i możesz zacząć”. zamiast sugerować ograniczenie.
YipYip
37

npx uruchamia polecenie pakietu bez jawnej instalacji.

Przypadków użycia:

  • Nie chcesz instalować pakietów globalnie ani lokalnie.
  • Nie masz uprawnień do zainstalowania go globalnie.
  • Po prostu chcę przetestować niektóre polecenia.

Składnia:

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

Pakiet jest opcjonalny:

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

Na przykład:

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

Więcej o command:

Ninh Pham
źródło
18

Prosta definicja:

npm - menedżer pakietów Javascript

npx - Wykonaj pliki binarne pakietu npm

Yassine Qoraiche
źródło
7

Oto przykład działania NPX: npx cowsay hello

Jeśli wpiszesz to w swoim terminalu bash, zobaczysz wynik. Zaletą tego jest to, że npx tymczasowo zainstalował cowsay. Brak zanieczyszczenia pakietu, ponieważ krowa nie jest zainstalowana na stałe. Jest to idealne rozwiązanie dla jednorazowych pakietów, w których chcesz uniknąć zanieczyszczenia pakietu.

Jak wspomniano w innych odpowiedziach, npx jest również bardzo przydatny w przypadkach, gdy (z npm) pakiet musi zostać zainstalowany, a następnie skonfigurowany przed uruchomieniem. Np. Zamiast używać npm do zainstalowania, a następnie skonfigurowania pliku json.package, a następnie wywołania skonfigurowanego polecenia uruchomienia, po prostu użyj npx. Prawdziwy przykład: npx create-reag-app moja-aplikacja

Risteard
źródło
3
Gdzie go instaluje i czy usuwa po zakończeniu polecenia, czy buforuje go przez pewien czas, czy zawsze sprawdza, czy masz najnowszą wersję pakietu?
redOctober13
@ redOctober13 jest trochę buforowania, ale npx pyta również rejestr npm o najnowszą wersję za każdym razem, więc buforowanie nie pomaga zbyt szybko. I rozszerza się, a następnie czyści zależności za każdym razem.
Simon B.