ความแตกต่างระหว่าง npx และ npm หรือไม่


517

ฉันได้เริ่มต้นเพียงแค่การเรียนรู้ที่ตอบสนองและ 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

คำตอบ:


644

แนะนำ npx: แพ็คเกจนักวิ่ง npm

NPM- จัดการแพ็คเกจแต่ไม่ทำให้ชีวิตง่ายขึ้นในการดำเนินการใด ๆ
NPX- เครื่องมือสำหรับการดำเนินการแพคเกจโหนด

NPXมาพร้อมกับNPMรุ่น5.2+

NPMด้วยตัวเองไม่เพียง แต่เรียกใช้แพคเกจใด ๆ มันไม่เรียกใช้แพคเกจใด ๆ ในความเป็นจริง หากคุณต้องการเรียกใช้แพคเกจโดยใช้ NPM คุณต้องระบุแพ็คเกจนั้นในpackage.jsonไฟล์ของคุณ

เมื่อติดตั้ง executables ผ่านแพ็คเกจ NPM แล้ว NPM จะเชื่อมโยงไปยังพวกเขา:

  1. การติดตั้งในเครื่องมีการสร้าง "ลิงก์" ใน./node_modules/.bin/ไดเรกทอรี
  2. การติดตั้งทั่วโลกมี "ลิงก์" ที่สร้างจากbin/ไดเรกทอรีทั่วโลก(เช่น/usr/local/bin) บน Linux หรือที่%AppData%/npmบน Windows

เอกสารที่คุณควรอ่าน


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
หลายปีที่ผ่านมามีBowerสำหรับการจัดการบรรจุภัณฑ์ส่วนหน้า ด้วยเหตุผลบางประการคุณสามารถใช้ตัวจัดการแพคเกจเดียวสำหรับทุกสิ่งที่เกี่ยวข้องกับจาวาสคริปต์และคุณสามารถใช้การแก้ปัญหาทั่วไปสำหรับการพัฒนาโครงการส่วนหน้าเช่นกัน คุณสามารถตรวจสอบการตอบสนองนี้สำหรับรายละเอียดเพิ่มเติม เกี่ยวกับการตอบสนอง: ไม่มันไม่ได้ใช้โหนดโดยตรงแม้ว่าคุณจะสามารถใช้มันในโหนดได้เช่นกัน! (เช่นการเรนเดอร์ฝั่งเซิร์ฟเวอร์)
RecuencoJones

1
@RecuencoJones - คุณแสดงความคิดเห็นกับคำตอบของฉันแทน OP
vsync

1
ใช่ฉันลืมพูดถึง @winklerrr ฉันพูดถึงความคิดเห็นของเขา
RecuencoJones

1
ฉันคิดว่าคุณสมบัติที่มีประโยชน์ที่สุดคือการติดตั้งแพคเกจ NPX เมื่อยังไม่ได้ติดตั้ง มิฉะนั้นเพิ่ม./node_modules/.binใน $ PATH และ NPX ของคุณไม่จำเป็นต้องใช้
Ron E

78

npxเป็นนักวิ่งแพ็คเกจ npm (x น่าจะหมายถึง eXecute) การใช้งานทั่วไปคือการดาวน์โหลดและเรียกใช้แพคเกจชั่วคราวหรือสำหรับการทดลอง

create-react-appเป็นแพคเกจ npm ที่คาดว่าจะทำงานเพียงครั้งเดียวในวงจรชีวิตของโครงการ ดังนั้นจึงควรใช้ npx เพื่อติดตั้งและรันในขั้นตอนเดียว

ตามที่ระบุไว้ในหน้าคนhttps://www.npmjs.com/package/npx , npxสามารถเรียกใช้คำสั่งในเส้นทางหรือจาก node_modules / ถังขยะโดยค่าเริ่มต้น

หมายเหตุ: สำหรับการขุดบางส่วนเราสามารถค้นหาว่า create-react-app ชี้ไปที่ไฟล์ 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

ดีกว่าบล็อกที่มีความยาวมาก ๆ
Mohan Gundlapalli

คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับ "ชั่วคราว" ได้ไหม คุณหมายความว่าไบนารีถูกโยนทิ้งไปหลังจากเรียกใช้งานคำสั่งบังคับให้ npx ดาวน์โหลดไบนารีอีกครั้งทุกครั้งหรือไม่
Jim Aho

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 เป็นเครื่องมือขนาดเล็กที่ฉลาดพอที่จะเรียกใช้แอปพลิเคชันที่ถูกต้องเมื่อถูกเรียกจากภายในโครงการ

หากคุณต้องการรันมอคค่าเวอร์ชันโปรเจคท้องถิ่นคุณสามารถรัน npx mocha ภายในโปรเจ็กต์และจะทำสิ่งที่คุณคาดหวัง

ข้อดีข้างเคียงที่มีประโยชน์ของ npx คือมันจะติดตั้งแพ็กเกจ npm โดยอัตโนมัติซึ่งยังไม่ได้ติดตั้ง ดังนั้นในขณะที่ Kat Marchánผู้สร้างเครื่องมือชี้ให้เห็นคุณสามารถเรียกใช้ npx benny-hill โดยไม่ต้องจัดการกับ Benny Hill ที่ก่อให้เกิดมลพิษต่อสิ่งแวดล้อมโลก

หากคุณต้องการสปิน npx ให้อัพเดตเป็น npm เวอร์ชันล่าสุด


หากคุณใช้ nvm-windows คุณอาจจะไม่ได้รับ npx ด้วย npm แต่ต้องติดตั้งด้วยตนเอง! npm i -g npx
Neil

1
NPM can just install local versions- ไม่ถูกต้อง. npmสามารถติดตั้งได้ทั่วโลกและเป็นเรื่องธรรมดา
vsync

1
คุณสามารถพบคำแนะนำที่ดีเกี่ยวกับ NPX ได้ที่นี่: medium.com/@maybekatz/โดย Kat Marchán
Jeff Hu

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:


18

คำจำกัดความง่าย ๆ :

npm - ตัวจัดการแพคเกจ Javascript

npx - เรียกใช้งานไบนารีแพ็กเกจ npm


7

นี่คือตัวอย่างของการดำเนินการ NPX: npx cowsay hello

หากคุณพิมพ์ลงใน terminal bash ของคุณคุณจะเห็นผลลัพธ์ ประโยชน์ของสิ่งนี้คือ npx ติดตั้ง cowsay ชั่วคราว ไม่มีมลพิษบรรจุภัณฑ์เนื่องจาก cowsay ไม่ได้ติดตั้งอย่างถาวร นี่เป็นสิ่งที่ยอดเยี่ยมสำหรับแพ็คเกจที่คุณต้องการหลีกเลี่ยงมลพิษจากบรรจุภัณฑ์

ดังที่ได้กล่าวไว้ในคำตอบอื่น ๆ npx ยังมีประโยชน์อย่างมากในกรณีที่ต้องติดตั้งแพคเกจ (ด้วย npm) จากนั้นจึงกำหนดค่าก่อนใช้งาน เช่นแทนที่จะใช้ npm เพื่อติดตั้งแล้วกำหนดค่าไฟล์ json.package จากนั้นเรียกใช้คำสั่ง run ที่กำหนดค่าเพียงใช้ npx แทน ตัวอย่างจริง: npx create-react-app my-app


3
ติดตั้งอยู่ที่ไหนและลบออกหลังจากคำสั่งเสร็จสิ้นหรือทำการแคชเป็นระยะเวลานานหรือตรวจสอบว่าคุณมีแพ็คเกจรุ่นล่าสุดเสมอหรือไม่
redOctober13

@ redOctober13 มีการแคชบางส่วน แต่ npx ยังขอให้มีการลงทะเบียน npm สำหรับรุ่นใหม่ล่าสุดทุกครั้งดังนั้นการแคชจะไม่ช่วยความเร็วมากเกินไป และจะขยายและทำความสะอาดการอ้างอิงทุกครั้ง
Simon B.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.