npm và npx - Sự khác nhau là gì?

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-đó:

  1. Đầu tiên nó tìm trong node_modules xem 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ục node_modules/.bin. Muốn có file trong đó thì chính thư viện phải khai báo config trong package.json củ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
2
3
"bin": {
"nodemon": "./bin/nodemon.js"
}
  1. Nếu có và hợp lệ, thực thi luôn file trong thư mục .bin.

  2. 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-install thì 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 trong node_modules của project, mà được lưu vào cache riêng của npx (thư mục _npx, ví dụ ~/.npm/_npx trê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
2
3
4
5
6
7
{
"name": "myproject",
"version": "1.0.0",
"scripts": {
"example": "./node_modules/.bin/example"
}
}

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é.

Liên kết

 MỜI MÌNH LY CÀ PHÊ
 Comments
Comment plugin failed to load
Loading comment plugin