Nếu bạn từng thắc mắc npm với npx khác nhau như thế nào, hay chúng là gì, thì bài này dành cho bạn. Học Nodejs chắc hẳn bạn đã biết npm rồi, còn npx thì mới hơn chút. Mình cũng từng thắc mắc khi lần đầu thấy npx, còn tưởng người ta gõ nhầm, nhưng thật ra không phải. Vậy nên hôm nay mình sẽ giải thích npm và npx là gì, và chúng khác nhau ra sao.
NPM - Node package manager
NPM là trình quản lý thư viện cho Nodejs, với mục đích chính là tự động hóa việc quản lý các thư viện phụ thuộc. Ví dụ bạn làm web cần jquery, cần bootstrap, thay vì lên mạng tìm tải về hoặc copy link dán vào, thì đã có npm lo, chỉ cần gõ vài dòng lệnh là nó tải về lưu vào project của bạn, xong bạn chỉ việc gọi ra mà xài. Những thư viện bạn cần dùng đó chính là “phụ thuộc” - dependencies, hay còn gọi là packages.
Tất cả dependencies bạn cần sẽ được lưu trong file package.json, và để tải về hết chỉ việc gõ npm install là xong. Dĩ nhiên nó cũng quản lý version hiện tại của từng thư viện, nhờ vậy khi làm team với nhau, project của bạn không bị break vì xung đột version.
NPX - Node package executor
“Node package executor” là tên mình tự đặt đấy :))) Trang chủ chỉ ghi ngắn gọn là > execute npm package binaries.
Npx là công cụ để thực thi các Node package, đi kèm với npm kể từ phiên bản 5.2.
Npx hoạt động như sau, khi bạn gõ npx tên-thư-viện-nào-đó:
- Đầu tiên nó tìm trong
node_modulesxem thư viện này đã có chưa, và có đường dẫn hợp lệ để chạy hay không. Để npx nhận ra một thư viện có thể thực thi được, thư viện đó phải có file nằm trong thư mụcnode_modules/.bin. Muốn có file trong đó thì chính thư viện phải khai báo config trongpackage.jsoncủa nó. (Thực ra npx sẽ ưu tiên tìm trong$PATH- tức biến môi trường của hệ điều hành - trước, nhưng phạm vi bài này mình không đi sâu vào đó).
Ví dụ chỉ định setup bin trong package.json của nodemon, khi cài đặt nó sẽ được npm tạo một file có thể execute trong node_modules/.bin:
1 | "bin": { |
Nếu có và hợp lệ, thực thi luôn file trong thư mục
.bin.Nếu chưa có thư viện, npx sẽ tự cài đặt tạm rồi chạy luôn (trừ khi bạn thêm flag
--no-installthì bước cài đặt này bị bỏ qua). Ví dụnpx nodemon --no-install. Thư viện cài kiểu này không nằm trongnode_modulescủa project, mà được lưu vào cache riêng của npx (thư mục_npx, ví dụ~/.npm/_npxtrên macOS/Linux). Gọi là “tạm” nhưng thực ra npx không tự xóa cache này theo thời gian, muốn dọn phải xóa tay.
Vì sao cần npx và khác biệt giữa nó với npm?
Nếu không có npx, muốn chạy một thư viện bạn phải gõ hết cả đường dẫn ra như vầy node ./node_modules/.bin/example, hoặc khai báo trong scripts của package.json.
1 | { |
Rồi chạy bằng lệnh npm run example.
Npx đơn giản hơn rất nhiều, chỉ cần gõ npx example là xong, không cần khai báo scripts gì cả.
Tóm lại
Đó là khác biệt lớn nhất giữa npm và npx, hãy luôn nhớ rằng hai cái này khác nhau, dùng cho mục đích khác nhau nhé.