Perbedaan antara npx dan npm?

517

Saya baru saja mulai belajar Bereaksi, dan Facebook membantu menyederhanakan pengaturan awal dengan menyediakan proyek siap pakai berikut .

Jika saya harus menginstal proyek kerangka saya harus mengetikkan npx create-react-app my-appcommand-line.

Saya bertanya-tanya mengapa Facebook di Github memiliki npx create-react-app my-appbukan npm create-react-app my-app?

Paresh Maniyar
sumber
23
create-react-appadalah generator. npxpergi ke internet , mengunduh paket sementara sehingga dapat menjalankannya ( np x ). Apa yang Anda dapatkan (dan inginkan) adalah output, yang disimpan secara lokal, di mana Anda telah menjalankan perintah.
vsync

Jawaban:

644

Memperkenalkan npx: pelari paket npm

NPM- Mengelola paket tetapi tidak membuat hidup mudah dijalankan .
NPX- Alat untuk menjalankan paket Node.

NPXdibundel dengan NPMversi5.2+

NPMdengan sendirinya tidak hanya menjalankan paket apa pun. itu tidak menjalankan paket apa pun sebenarnya. Jika Anda ingin menjalankan paket menggunakan NPM, Anda harus menentukan paket itu di package.jsonfile Anda .

Ketika executable diinstal melalui paket NPM, NPM menautkannya:

  1. pemasangan lokal memiliki "tautan" yang dibuat di ./node_modules/.bin/direktori.
  2. instalasi global memiliki "tautan" yang dibuat dari bin/direktori global (mis. /usr/local/bin) di Linux atau %AppData%/npmpada Windows.

Dokumentasi yang harus Anda baca


NPM:

Seseorang mungkin menginstal paket secara lokal pada proyek tertentu:

npm install some-package

Sekarang katakanlah Anda ingin NodeJS menjalankan paket itu dari baris perintah:

$ some-package

Di atas akan gagal . Hanya paket yang terinstal secara global yang dapat dijalankan dengan mengetikkan namanya saja .

Untuk memperbaiki ini, dan menjalankannya, Anda harus mengetikkan path lokal:

$ ./node_modules/.bin/some-package

Anda dapat secara teknis menjalankan paket yang diinstal secara lokal dengan mengedit packages.jsonfile Anda dan menambahkan paket itu di scriptsbagian:

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

Kemudian jalankan skrip menggunakan npm run-script(atau npm run):

npm run some-package

NPX:

npxakan memeriksa apakah <command>ada di $PATH, atau dalam binari proyek lokal, dan jalankan. Jadi, untuk contoh di atas, jika Anda ingin menjalankan paket yang diinstal secara lokal, yang some-packageperlu Anda lakukan adalah mengetik:

npx some-package

Keuntungan utama lainnya npxadalah kemampuan untuk mengeksekusi paket yang sebelumnya tidak diinstal:

$ npx create-react-app my-app

Contoh di atas akan menghasilkan reactaplikasi boilerplate di jalur yang telah dijalankan oleh perintah, dan memastikan bahwa Anda selalu menggunakan versi terbaru dari generator atau alat bangun tanpa harus memutakhirkan setiap kali Anda akan menggunakannya.


Pertanyaan-pertanyaan Terkait:

  1. Bagaimana cara menggunakan paket yang diinstal secara lokal di node_modules?
  2. NPM: bagaimana cara mencari folder ./node_modules/.bin?
  3. Bagaimana Anda menjalankan file js menggunakan skrip npm?
vsync
sumber
2
Jadi jangan gunakan reaksi node.js, kan? Mengapa ini tersedia melalui 'npm' (manajer paket node)?
winklerrr
3
Beberapa tahun yang lalu, ada Bower untuk manajemen paket frontend, tetapi penggunaannya secara drastis mendukung npm. Di antara beberapa alasan, Anda bisa menggunakan manajer paket tunggal untuk semua yang terkait dengan javascript, dan Anda dapat menggunakan resolusi commons untuk mengembangkan proyek-proyek frontend juga. Anda dapat memeriksa respons ini untuk perincian lebih lanjut. Mengenai reaksi: tidak, itu tidak langsung menggunakan simpul, meskipun Anda bisa menggunakannya dalam simpul juga! (mis: rendering sisi server)
RecuencoJones
1
@RecuencoJones - Anda mengomentari jawaban saya alih-alih OP
vsync
1
Ya, saya lupa menyebutkan @winklerrr, saya menanggapi komentarnya
RecuencoJones
1
Saya pikir fitur yang paling berguna adalah NPX menginstal paket ketika belum diinstal. Jika tidak, tambahkan ./node_modules/.binke $ PATH dan NPX Anda tidak diperlukan.
Ron E
78

npx adalah pelari paket npm (x mungkin singkatan dari eXecute). Penggunaan khas adalah untuk mengunduh dan menjalankan paket sementara atau untuk uji coba.

create-react-app adalah paket npm yang diharapkan dapat dijalankan hanya sekali dalam siklus hidup proyek. Oleh karena itu, lebih disukai menggunakan npx untuk menginstal dan menjalankannya dalam satu langkah.

Seperti disebutkan dalam halaman manual https://www.npmjs.com/package/npx , npx dapat menjalankan perintah di PATH atau dari node_modules / .bin secara default.

Catatan: Dengan beberapa penggalian, kita dapat menemukan bahwa create-react-app menunjuk ke file Javascript (mungkin ke /usr/lib/node_modules/create-react-app/index.js pada sistem Linux) yang dijalankan dalam lingkungan simpul . Ini hanyalah alat global yang melakukan beberapa pemeriksaan. Pengaturan aktual dilakukan oleh skrip reaksi, yang versi terbarunya dipasang di proyek. Lihat https://github.com/facebook/create-react-app untuk info lebih lanjut.

dww
sumber
2
Penggunaan tipikal adalah sesering menjalankan versi yang sudah diinstal secara lokal atau global seperti halnya mengunduh dan menjalankan suatu paket.
69

NPM adalah manajer paket, Anda dapat menginstal paket node.js menggunakan NPM

NPX adalah alat untuk mengeksekusi paket node.js.

Tidak masalah apakah Anda menginstal paket itu secara global atau lokal. NPX sementara akan menginstalnya dan menjalankannya. NPM juga dapat menjalankan paket jika Anda mengonfigurasi file package.json dan memasukkannya ke dalam bagian skrip.

Jadi ingat ini, jika Anda ingin memeriksa / menjalankan paket node dengan cepat tanpa menginstal secara lokal atau global, gunakan NPX.

np M - Manajer

np X - Jalankan - mudah diingat

cherankrish
sumber
Singkat dan jelas jelaskan
Barış Serkan AKIN
Jauh lebih baik daripada blog panjang yang saya lalui.
Mohan Gundlapalli
Bisakah Anda menguraikan sedikit tentang "sementara". Apakah maksud Anda binari dibuang setelah menjalankan perintah, memaksa npx mengunduh ulang binari setiap kali?
Jim Aho
49

NPX:

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

Pengembang web dapat memiliki lusinan proyek pada mesin pengembangan mereka, dan masing-masing proyek memiliki set dependensi khusus yang terinstal npm. Beberapa tahun yang lalu, saran yang biasa untuk menangani aplikasi CLI seperti Grunt atau Gulp adalah menginstalnya secara lokal di setiap proyek dan juga secara global sehingga mereka dapat dengan mudah dijalankan dari baris perintah.

Tetapi menginstal secara global menyebabkan banyak masalah yang diselesaikan. Proyek mungkin bergantung pada versi alat baris perintah yang berbeda, dan mencemari sistem operasi dengan banyak alat CLI khusus pengembangan juga tidak bagus. Saat ini, sebagian besar pengembang lebih suka memasang alat secara lokal dan membiarkannya begitu saja.

Versi lokal alat memungkinkan pengembang untuk menarik proyek dari GitHub tanpa khawatir tentang ketidaksesuaian dengan versi alat yang diinstal secara global. NPM hanya dapat menginstal versi lokal dan Anda siap melakukannya. Tetapi pemasangan khusus proyek bukan tanpa masalah: bagaimana Anda menjalankan versi alat yang tepat tanpa menentukan lokasi tepatnya di proyek atau bermain-main dengan alias?

Itulah masalah yang diselesaikan npx. Alat baru yang termasuk dalam NPM 5.2, npx adalah utilitas kecil yang cukup pintar untuk menjalankan aplikasi yang tepat ketika dipanggil dari dalam suatu proyek.

Jika Anda ingin menjalankan versi moka proyek-lokal, misalnya, Anda dapat menjalankan npx mocha di dalam proyek dan itu akan melakukan apa yang Anda harapkan.

Manfaat samping yang bermanfaat dari npx adalah bahwa ia akan secara otomatis menginstal paket npm yang belum diinstal. Jadi, seperti yang ditunjukkan oleh pembuat alat ini, Kat Marchán, Anda dapat menjalankan npx benny-hill tanpa harus berurusan dengan Benny Hill yang mencemari lingkungan global.

Jika Anda ingin mengambil npx untuk putaran, perbarui ke versi terbaru dari npm.

Venkat Ch
sumber
Jika Anda menggunakan nvm-windows Anda kemungkinan tidak akan mendapatkan npx dengan npm, tetapi perlu menginstalnya secara manual! npm i -g npx
Neil
1
NPM can just install local versions- tidak benar. npmdapat menginstal global dan ini adalah praktik umum.
vsync
1
Pengantar yang bagus untuk NPX dapat ditemukan di sini: medium.com/@maybekatz/… , oleh Kat Marchán.
Jeff Hu
1
@vsync Saya percaya ini harus ditafsirkan sebagai "NPM cukup menginstal versi lokal dan Anda baik untuk pergi." alih-alih menyiratkan batasan.
YipYip
37

npx menjalankan perintah suatu paket tanpa menginstalnya secara eksplisit.

Gunakan kasing:

  • Anda tidak ingin menginstal paket baik secara global maupun lokal.
  • Anda tidak memiliki izin untuk menginstalnya secara global.
  • Hanya ingin menguji beberapa perintah.

Sintaksis:

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

Paket adalah opsional:

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

Sebagai contoh:

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

Lebih lanjut tentang command:

Ninh Pham
sumber
18

Definisi sederhana:

npm - manajer paket Javascript

npx - Menjalankan binari paket npm

Yassine Qoraiche
sumber
7

Berikut adalah contoh NPX yang sedang beraksi: npx cowsay halo

Jika Anda mengetiknya di terminal bash, Anda akan melihat hasilnya. Manfaatnya adalah npx memasang sementara cowsay. Tidak ada polusi paket karena cowsay tidak diinstal secara permanen. Ini bagus untuk paket satu kali di mana Anda ingin menghindari polusi paket.

Seperti disebutkan dalam jawaban lain, npx juga sangat berguna dalam kasus di mana (dengan npm) paket perlu diinstal kemudian dikonfigurasi sebelum berjalan. Misalnya alih-alih menggunakan npm untuk menginstal dan kemudian mengkonfigurasi file json.package dan kemudian memanggil perintah jalankan yang dikonfigurasi, gunakan saja npx. Contoh nyata: npx create-react-app my-app

Risteard
sumber
3
Di mana ia menginstalnya, dan apakah itu menghapusnya setelah perintah selesai, atau apakah itu menyimpannya untuk jangka waktu yang lama, atau selalu memeriksa apakah Anda memiliki versi terbaru dari paket?
redOktober13
@ redOctober13 ada beberapa caching, tetapi npx juga meminta npm registry untuk versi terbaru setiap saat, jadi caching tidak membantu terlalu banyak dengan kecepatan. Dan itu mengembang dan kemudian membersihkan dependensi setiap waktu.
Simon B.