Sự khác biệt giữa npx và npm?


517

Tôi mới bắt đầu học React và Facebook giúp đơn giản hóa việc thiết lập ban đầu bằng cách cung cấp dự án làm sẵn sau đây .

Nếu tôi phải cài đặt dự án bộ xương, tôi phải gõ npx create-react-app my-appdòng lệnh.

Tôi đã tự hỏi tại sao Facebook trong Github có npx create-react-app my-apphơn npm create-react-app my-app?


23
create-react-applà một máy phát điện. npxđi vào internet , tải gói tạm thời để nó có thể thực hiện nó ( np x ). Những gì bạn nhận được (và muốn) là đầu ra, được lưu cục bộ, nơi bạn đã chạy lệnh.
vsync

Câu trả lời:


644

Giới thiệu npx: một người chạy gói npm

NPM- Quản lý các gói nhưng không làm cho cuộc sống dễ dàng thực hiện bất kỳ.
NPX- Một công cụ để thực hiện các gói Node.

NPXđi kèm với NPMphiên bản5.2+

NPMtự nó không chỉ đơn giản là chạy bất kỳ gói. nó không chạy bất kỳ gói nào trong thực tế. Nếu bạn muốn chạy gói bằng NPM, bạn phải chỉ định gói đó trong package.jsontệp của mình .

Khi các tệp thực thi được cài đặt thông qua các gói NPM, NPM liên kết với chúng:

  1. cài đặt cục bộ có "liên kết" được tạo tại ./node_modules/.bin/thư mục.
  2. cài đặt toàn cầu có "liên kết" được tạo từ bin/thư mục toàn cầu (ví dụ /usr/local/bin) trên Linux hoặc %AppData%/npmtrên Windows.

Tài liệu bạn nên đọc


NPM:

Người ta có thể cài đặt một gói cục bộ trên một dự án nhất định:

npm install some-package

Bây giờ hãy nói rằng bạn muốn NodeJS thực thi gói đó từ dòng lệnh:

$ some-package

Những điều trên sẽ thất bại . Chỉ cài đặt trên toàn cầu gói có thể được thực hiện bằng cách gõ tên của họ chỉ .

Để sửa lỗi này và để nó chạy, bạn phải nhập đường dẫn cục bộ:

$ ./node_modules/.bin/some-package

Về mặt kỹ thuật, bạn có thể chạy gói được cài đặt cục bộ bằng cách chỉnh sửa packages.jsontệp của mình và thêm gói đó trong scriptsphần:

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

Sau đó chạy tập lệnh bằng cách sử dụng npm run-script(hoặc npm run):

npm run some-package

NPX:

npxsẽ kiểm tra xem có <command>tồn tại trong $PATHhoặc trong các nhị phân dự án cục bộ hay không và thực hiện nó. Vì vậy, với ví dụ trên, nếu bạn muốn thực thi gói được cài đặt cục bộ, some-packagetất cả những gì bạn cần làm là gõ:

npx some-package

Một ưu điểm lớn khác npxlà khả năng thực thi gói chưa được cài đặt trước đó:

$ npx create-react-app my-app

Ví dụ trên sẽ tạo ra một bản reacttóm tắt ứng dụng trong đường dẫn mà lệnh đã chạy và đảm bảo rằng bạn luôn sử dụng phiên bản mới nhất của trình tạo hoặc công cụ xây dựng mà không phải nâng cấp mỗi khi bạn sử dụng nó.


Câu hỏi liên quan:

  1. Làm thế nào để sử dụng gói được cài đặt cục bộ trong node_modules?
  2. NPM: làm thế nào để nguồn ./node_modules/.bin thư mục?
  3. Làm thế nào để bạn chạy một tệp js bằng cách sử dụng tập lệnh npm?

2
Vì vậy, phản ứng không sử dụng node.js, phải không? Tại sao nó có sẵn thông qua 'npm' (trình quản lý gói nút)?
winklerrr

3
Vài năm trước, đã có Bower để quản lý gói frontend, nhưng nó được sử dụng rất nhiều để ủng hộ npm. Trong một số lý do, bạn chỉ có thể sử dụng một trình quản lý gói duy nhất cho tất cả mọi thứ liên quan đến javascript và bạn cũng có thể sử dụng các độ phân giải chung để phát triển các dự án frontend. Bạn có thể kiểm tra phản hồi này để biết thêm chi tiết. Về phản ứng: không, nó không trực tiếp sử dụng nút, mặc dù bạn cũng có thể sử dụng nó trong nút! (ví dụ: kết xuất phía máy chủ)
RecuencoJones

1
@RecuencoJones - Bạn đã nhận xét câu trả lời của tôi thay vì OP
vsync

1
Có, tôi đã quên đề cập đến @winklerrr, tôi đã giải quyết nhận xét của anh ấy
RecuencoJones

1
Tôi nghĩ rằng tính năng hữu ích nhất là NPX cài đặt gói khi nó chưa được cài đặt. Nếu không, hãy thêm ./node_modules/.binvào $ PATH và NPX của bạn là không cần thiết.
Ron E

78

npx là một trình chạy gói npm (x có lẽ là viết tắt của eXecute). Việc sử dụng thông thường là tải xuống và chạy gói tạm thời hoặc dùng thử.

tạo-Reac-app là gói npm dự kiến ​​chỉ được chạy một lần trong vòng đời của dự án. Do đó, nên sử dụng npx để cài đặt và chạy nó trong một bước duy nhất.

Như đã đề cập trong trang man https://www.npmjs.com/package/npx , npx có thể chạy các lệnh trong PATH hoặc từ node_modules / .bin theo mặc định.

Lưu ý: Với một số hoạt động đào, chúng ta có thể thấy rằng ứng dụng tạo phản ứng trỏ đến tệp Javascript (có thể là /usr/lib/node_modules/create-react-app/index.js trên các hệ thống Linux) được thực thi trong môi trường nút . Đây chỉ đơn giản là một công cụ toàn cầu thực hiện một số kiểm tra. Thiết lập thực tế được thực hiện bởi các tập lệnh phản ứng, có phiên bản mới nhất được cài đặt trong dự án. Tham khảo https://github.com/facebook/create-react-app để biết thêm thông tin.


2
Việc sử dụng thông thường là thường xuyên chạy phiên bản đã được cài đặt cục bộ hoặc toàn cầu vì nó là để tải xuống và chạy gói.

69

NPM là trình quản lý gói, bạn có thể cài đặt các gói node.js bằng NPM

NPX là một công cụ để thực thi các gói node.js.

Không quan trọng bạn cài đặt gói đó trên toàn cầu hay cục bộ. NPX sẽ tạm thời cài đặt nó và chạy nó. NPM cũng có thể chạy các gói nếu bạn định cấu hình tệp pack.json và đưa nó vào phần tập lệnh.

Vì vậy, hãy nhớ điều này, nếu bạn muốn kiểm tra / chạy gói nút một cách nhanh chóng mà không cần cài đặt NPX cục bộ hoặc toàn cầu.

np M - Quản lý

np X - Thực thi - dễ nhớ


Giải thích ngắn gọn và rõ ràng
Barış Serkan AKIN

Tốt hơn nhiều so với các blog dài tôi đã đi qua.
Mohan Gundlapalli

Bạn có thể giải thích một chút về "tạm thời". Bạn có nghĩa là các nhị phân bị vứt đi sau khi thực hiện lệnh, buộc npx phải tải lại các nhị phân mỗi lần?
Jim Aho

49

NPX:

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

Các nhà phát triển web có thể có hàng tá dự án trên các máy phát triển của họ và mỗi dự án có một bộ phụ thuộc riêng được cài đặt npm. Vài năm trước, lời khuyên thông thường để xử lý các ứng dụng CLI như Grunt hoặc Gulp là cài đặt chúng cục bộ trong từng dự án và trên toàn cầu để chúng có thể dễ dàng chạy từ dòng lệnh.

Nhưng cài đặt trên toàn cầu gây ra nhiều vấn đề như nó đã giải quyết. Các dự án có thể phụ thuộc vào các phiên bản khác nhau của các công cụ dòng lệnh và gây ô nhiễm hệ điều hành với nhiều công cụ CLI dành riêng cho phát triển cũng không tuyệt vời. Ngày nay, hầu hết các nhà phát triển thích cài đặt các công cụ cục bộ và để nó ở đó.

Các phiên bản công cụ cục bộ cho phép các nhà phát triển lấy các dự án từ GitHub mà không phải lo lắng về sự không tương thích với các phiên bản công cụ được cài đặt toàn cầu. NPM chỉ có thể cài đặt các phiên bản địa phương và bạn vẫn ổn. Nhưng các cài đặt cụ thể của dự án không phải là không có vấn đề của chúng: làm thế nào để bạn chạy đúng phiên bản của công cụ mà không chỉ định vị trí chính xác của nó trong dự án hoặc chơi xung quanh với các bí danh?

Đó là vấn đề npx giải quyết. Một công cụ mới có trong NPM 5.2, npx là một tiện ích nhỏ đủ thông minh để chạy đúng ứng dụng khi được gọi từ bên trong một dự án.

Ví dụ, nếu bạn muốn chạy phiên bản dự án cục bộ của mocha, bạn có thể chạy npx mocha bên trong dự án và nó sẽ làm những gì bạn mong đợi.

Một lợi ích phụ hữu ích của npx là nó sẽ tự động cài đặt các gói npm chưa được cài đặt. Vì vậy, như Kat Marchán, người tạo ra công cụ chỉ ra, bạn có thể chạy npx benny-hill mà không phải đối phó với Benny Hill gây ô nhiễm môi trường toàn cầu.

Nếu bạn muốn lấy npx cho một vòng quay, hãy cập nhật lên phiên bản mới nhất của npm.


Nếu bạn đang sử dụng nvm-windows, bạn có thể sẽ không nhận được npx với npm, nhưng cần phải cài đặt thủ công! npm i -g npx
Neil

1
NPM can just install local versions- không chính xác. npmcó thể cài đặt toàn cầu và đó là một thông lệ.
vsync

1
Một giới thiệu tuyệt vời về NPX có thể được tìm thấy ở đây: Medium.com/@maybekatz/ , của Kat Marchán.
Jeff Hu

1
@vsync Tôi tin rằng điều này nên được hiểu là "NPM có thể chỉ cần cài đặt các phiên bản địa phương và bạn vẫn ổn." thay vì ngụ ý một giới hạn.
YipYip

37

npx chạy một lệnh của gói mà không cài đặt nó một cách rõ ràng.

Trường hợp sử dụng:

  • Bạn không muốn cài đặt các gói không phải trên toàn cầu cũng như cục bộ.
  • Bạn không được phép cài đặt nó trên toàn cầu.
  • Chỉ muốn kiểm tra một số lệnh.

Cú pháp:

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

Gói là tùy chọn:

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

Ví dụ:

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

Thông tin thêm về command:


18

Định nghĩa đơn giản:

npm - Trình quản lý gói Javascript

npx - Thực thi nhị phân gói npm


7

Đây là một ví dụ về NPX đang hoạt động: npx Coway xin chào

Nếu bạn gõ nó vào thiết bị đầu cuối bash của bạn, bạn sẽ thấy kết quả. Lợi ích của việc này là npx đã tạm thời cài đặt coway. Không có ô nhiễm gói vì coway không được cài đặt vĩnh viễn. Điều này là tuyệt vời cho một gói mà bạn muốn tránh ô nhiễm gói.

Như đã đề cập trong các câu trả lời khác, npx cũng rất hữu ích trong trường hợp (với npm) gói cần được cài đặt sau đó được cấu hình trước khi chạy. Ví dụ, thay vì sử dụng npm để cài đặt và sau đó định cấu hình tệp json.package và sau đó gọi lệnh chạy được cấu hình, chỉ sử dụng npx thay thế. Một ví dụ thực tế: npx create-Reac-app my-app


3
Nó cài đặt nó ở đâu và loại bỏ nó sau khi lệnh kết thúc hoặc nó lưu bộ đệm trong một khoảng thời gian hoặc luôn kiểm tra xem bạn có phiên bản mới nhất của gói không?
redOc / 1013

@ redOc / 1013 có một số bộ nhớ đệm, nhưng npx cũng yêu cầu đăng ký npm cho phiên bản mới nhất mỗi lần, vì vậy bộ nhớ đệm không giúp quá nhiều về tốc độ. Và nó mở rộng và sau đó làm sạch phụ thuộc mỗi lần.
Simon B.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.