Npm là gì? Hướng dẫn cài đặt và sử dụng chi tiết

Chào bạn, tôi là Bùi Mạnh Đức đây. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu sâu hơn về một công cụ quan trọng trong lập trình nhé!

Giới thiệu về npm và vai trò của nó trong lập trình

Trong thế giới phát triển phần mềm hiện đại, đặc biệt là với JavaScript là gì, npm đã trở thành một công cụ không thể thiếu đối với mọi lập trình viên. Nó giống như một người trợ lý đắc lực, giúp bạn quản lý các “mảnh ghép” mã nguồn một cách hiệu quả. Tuy nhiên, nhiều lập trình viên mới, đặc biệt là những người đang làm quen với Node.js là gì, vẫn còn khá bỡ ngỡ về khái niệm npm là gì và làm thế nào để tận dụng tối đa sức mạnh của nó. Liệu bạn có từng cảm thấy lúng túng khi bắt đầu một dự án mới và không biết quản lý các thư viện ra sao không?

Đừng lo lắng, bài viết này sẽ là kim chỉ nam của bạn. Chúng tôi sẽ cung cấp một cái nhìn tổng quan, chi tiết và dễ hiểu nhất về npm, từ khái niệm cơ bản, lịch sử hình thành, cho đến cách cài đặt và sử dụng trong các dự án thực tế. Chúng ta sẽ cùng nhau khám phá các lệnh cơ bản, lợi ích vượt trội khi dùng npm, những lưu ý quan trọng và cả việc so sánh nó với các trình quản lý gói phổ biến khác như Yarn hay pnpm. Hãy cùng bắt đầu hành trình chinh phục công cụ mạnh mẽ này nhé!

Khái niệm npm là gì và lịch sử phát triển

Để sử dụng thành thạo bất kỳ công cụ nào, việc hiểu rõ nguồn gốc và bản chất của nó là bước đầu tiên và quan trọng nhất. Với npm, điều này cũng không ngoại lệ. Việc nắm vững khái niệm và lịch sử sẽ giúp bạn có một nền tảng vững chắc hơn.

Hình minh họa

npm là gì?

npm là viết tắt của cụm từ Node Package Manager. Đúng như tên gọi, đây là trình quản lý gói (package manager) mặc định cho môi trường Node.js. Bạn có thể hình dung npm như một kho ứng dụng khổng lồ, nhưng thay vì chứa các phần mềm cho người dùng cuối, nó chứa hàng triệu “gói” (packages) mã nguồn mở mà các lập trình viên có thể tái sử dụng cho dự án của mình.

Vai trò chính của npm trong hệ sinh thái Node.js là tự động hóa quá trình cài đặt, cập nhật, cấu hình và gỡ bỏ các thư viện (hay còn gọi là dependencies) mà dự án của bạn cần đến. Thay vì phải tự tay tải từng thư viện về và tích hợp vào dự án một cách thủ công, bạn chỉ cần một vài dòng lệnh đơn giản là npm sẽ lo phần còn lại. Điều này giúp tiết kiệm thời gian, giảm thiểu lỗi và chuẩn hóa quy trình làm việc nhóm.

Lịch sử phát triển npm

npm ra đời vào năm 2010, được tạo ra bởi Isaac Z. Schlueter. Sự phát triển của nó gắn liền với sự bùng nổ của Node.js. Ban đầu, Node.js chưa có một cơ chế quản lý gói chính thức, gây ra nhiều khó khăn cho lập trình viên trong việc chia sẻ và tái sử dụng code. npm được sinh ra để giải quyết chính vấn đề này.

Kể từ khi ra mắt, npm đã nhanh chóng trở thành một phần không thể tách rời của cộng đồng Node.js. Kho lưu trữ gói của nó phát triển với tốc độ chóng mặt, từ vài nghìn gói trong những ngày đầu lên đến hơn 2 triệu gói ở thời điểm hiện tại. Nó không chỉ là công cụ quản lý gói lớn nhất thế giới mà còn là một cộng đồng sôi động nơi các lập trình viên chia sẻ và hợp tác với nhau, góp phần thúc đẩy sự phát triển chung của toàn bộ ngành công nghiệp phần mềm.

Cách cài đặt và sử dụng npm trong Node.js

Sau khi đã hiểu npm là gì, bước tiếp theo là cài đặt và bắt đầu sử dụng nó. Tin vui là quá trình này vô cùng đơn giản, bởi npm được tích hợp sẵn cùng với Node.js. Hãy cùng xem các bước cụ thể nhé.

Hình minh họa

Hướng dẫn cài đặt npm

npm được phân phối cùng với Node.js, điều này có nghĩa là khi bạn cài đặt Node.js, bạn cũng sẽ tự động có npm. Đây là một lợi thế lớn, giúp bạn tiết kiệm thời gian và công sức thiết lập môi trường. Nếu máy tính của bạn chưa có Node.js, hãy truy cập trang chủ của Node.js, tải về phiên bản phù hợp với hệ điều hành của bạn (Windows, macOS, hoặc Linux) và tiến hành cài đặt theo các bước hướng dẫn.

Sau khi cài đặt xong, bạn có thể dễ dàng kiểm tra xem Node.js và npm đã được cài đặt thành công hay chưa bằng cách mở Terminal (trên macOS/Linux) hoặc Command Prompt/PowerShell (trên Windows) và gõ các lệnh sau:

Để kiểm tra phiên bản Node.js:

node -v

Để kiểm tra phiên bản npm:

npm -v

Nếu cả hai lệnh đều trả về số phiên bản, xin chúc mừng, bạn đã sẵn sàng để sử dụng npm!

Các bước sử dụng npm cơ bản

Bây giờ, hãy cùng thực hiện những thao tác đầu tiên với npm trong một dự án. Quá trình này thường bắt đầu bằng việc khởi tạo dự án và sau đó là quản lý các gói cần thiết.

1. Khởi tạo dự án với npm init

Đầu tiên, hãy tạo một thư mục mới cho dự án của bạn. Sau đó, mở terminal và di chuyển vào thư mục đó. Tại đây, bạn chạy lệnh sau:

npm init

Lệnh này sẽ khởi tạo một quy trình hỏi đáp, yêu cầu bạn nhập một số thông tin cơ bản về dự án như tên gói (package name), phiên bản (version), mô tả (description), điểm bắt đầu (entry point),… Bạn có thể nhấn Enter để chấp nhận các giá trị mặc định. Sau khi hoàn tất, npm sẽ tạo ra một tệp tin quan trọng tên là package.json trong thư mục dự án. Tệp này chính là “chứng minh thư” của dự án, chứa mọi thông tin và danh sách các thư viện phụ thuộc.

Nếu muốn bỏ qua các câu hỏi và tạo nhanh tệp package.json với các giá trị mặc định, bạn có thể dùng lệnh:

npm init -y

2. Cài đặt và gỡ bỏ gói npm

Giả sử dự án của bạn cần sử dụng thư viện Lodash, một thư viện tiện ích rất phổ biến. Để cài đặt nó, bạn chỉ cần chạy lệnh:

npm install lodash

Sau khi lệnh chạy xong, bạn sẽ thấy một thư mục mới tên là node_modules được tạo ra. Đây là nơi chứa mã nguồn của Lodash và các thư viện mà nó phụ thuộc. Đồng thời, tệp package.json cũng được cập nhật với thông tin về Lodash trong mục dependencies.

Khi bạn không cần dùng một gói nào đó nữa, việc gỡ bỏ cũng rất đơn giản. Ví dụ, để gỡ Lodash:

npm uninstall lodash

Lệnh này sẽ xóa gói Lodash khỏi thư mục node_modules và cập nhật lại tệp package.json.

Các lệnh cơ bản của npm và quản lý gói

Việc nắm vững các lệnh cơ bản và hiểu cách npm quản lý các gói sẽ giúp bạn làm việc hiệu quả hơn rất nhiều. Đây là nền tảng để bạn có thể tự tin vận hành các dự án từ nhỏ đến lớn.

Hình minh họa

Các lệnh phổ biến

Ngoài init, install, và uninstall mà chúng ta đã tìm hiểu, npm còn cung cấp nhiều lệnh hữu ích khác để quản lý dự án. Dưới đây là một số lệnh bạn sẽ thường xuyên sử dụng:

  • npm install (hoặc npm i): Khi bạn tải một dự án có sẵn từ người khác, dự án đó thường không bao gồm thư mục node_modules. Bạn chỉ cần chạy lệnh npm install trong thư mục gốc của dự án, npm sẽ đọc tệp package.json và tự động cài đặt tất cả các thư viện cần thiết.
  • npm update <package_name>: Dùng để cập nhật một gói cụ thể lên phiên bản mới nhất (tuân thủ theo quy tắc phiên bản trong package.json). Nếu không có tên gói, npm update sẽ cố gắng cập nhật tất cả các gói.
  • npm list (hoặc npm ls): Hiển thị cây thư viện phụ thuộc của dự án. Lệnh này giúp bạn xem tất cả các gói đã được cài đặt và mối quan hệ giữa chúng.
  • npm search <keyword>: Tìm kiếm các gói trên kho lưu trữ npm dựa trên từ khóa.
  • npm install <package_name> --save-dev (hoặc -D): Cài đặt một gói chỉ dành cho môi trường phát triển (ví dụ: các công cụ kiểm thử, build code…). Gói này sẽ được thêm vào mục devDependencies trong package.json.
  • npm install <package_name> -g: Cài đặt một gói ở chế độ toàn cục (globally). Các gói này thường là các công cụ dòng lệnh (CLI) bạn muốn sử dụng ở bất kỳ đâu trên máy tính, ví dụ như nodemon hay create-react-app.

Quản lý phiên bản và dependencies

Hiểu cách npm quản lý các phiên bản và thư viện phụ thuộc (dependencies) là chìa khóa để tránh các xung đột và đảm bảo dự án hoạt động ổn định. Hai tệp tin cốt lõi trong việc này là package.jsonpackage-lock.json.

package.json

Như đã đề cập, đây là tệp tin cấu hình chính của dự án. Trong đó, hai mục quan trọng nhất là dependenciesdevDependencies.

  • dependencies: Chứa danh sách các gói cần thiết để ứng dụng có thể chạy trên môi trường production. Ví dụ: React JS là gì, Framework là gì, Lodash.
  • devDependencies: Chứa danh sách các gói chỉ cần thiết trong quá trình phát triển và kiểm thử. Ví dụ: Jest (thư viện test), Webpack là gì (công cụ build), ESLint (công cụ kiểm tra lỗi code).

Bạn sẽ thấy các phiên bản gói thường có ký tự ^ hoặc ~ ở trước, ví dụ "lodash": "^4.17.21". Đây là các quy tắc của Semantic Versioning (SemVer), cho phép npm tự động cập nhật các phiên bản vá lỗi hoặc tính năng nhỏ mà không làm hỏng dự án.

package-lock.json

Nếu package.json chỉ định một khoảng phiên bản cho phép, thì package-lock.json lại ghi lại chính xác phiên bản của từng gói đã được cài đặt, bao gồm cả các gói phụ thuộc của chúng. Tệp này được tạo tự động khi bạn chạy npm install.

Mục đích của package-lock.json là đảm bảo tính nhất quán. Khi một thành viên khác trong nhóm hoặc hệ thống CI/CD chạy npm install, họ sẽ cài đặt chính xác cùng một phiên bản của mọi thư viện như bạn, ngăn chặn các lỗi “It works on my machine” (Nó chạy trên máy tôi) không mong muốn. Vì vậy, bạn luôn nên commit tệp package-lock.json vào hệ thống quản lý mã nguồn (như Git).

Lợi ích khi sử dụng npm trong quản lý thư viện phần mềm

Việc áp dụng npm vào quy trình làm việc không chỉ là một thói quen tốt mà còn mang lại những lợi ích to lớn, giúp nâng cao hiệu suất và chất lượng của dự án. Hãy cùng điểm qua những ưu điểm vượt trội mà npm mang lại.

Hình minh họa

1. Tự động hóa cài đặt và cập nhật các thư viện

Đây là lợi ích rõ ràng nhất. Trước khi có các trình quản lý gói như npm, lập trình viên phải tự tìm kiếm, tải về các tệp thư viện, sau đó đặt chúng vào đúng thư mục trong dự án. Quá trình này không chỉ tốn thời gian mà còn rất dễ xảy ra sai sót. Với npm, bạn chỉ cần một lệnh npm install. Mọi việc từ tìm kiếm, tải về, giải nén và đặt vào thư mục node_modules đều được tự động hóa. Việc cập nhật thư viện lên phiên bản mới cũng trở nên đơn giản hơn bao giờ hết, giúp bạn dễ dàng tiếp cận các bản vá lỗi và tính năng mới.

2. Hỗ trợ cộng đồng đa dạng và kho gói phong phú

npm là kho lưu trữ gói phần mềm lớn nhất thế giới. Điều này có nghĩa là gần như mọi vấn đề bạn gặp phải trong lập trình đều đã có người khác giải quyết và đóng gói thành một thư viện có sẵn trên npm. Từ các framework front-end như React JS là gì, Angular là gì, Vuejs là gì, đến các framework back-end như Express, NestJS, hay các thư viện tiện ích cho việc xử lý ngày tháng, thao tác mảng, gửi email… tất cả đều có mặt.

Sự phong phú này giúp bạn không phải “phát minh lại bánh xe”. Thay vào đó, bạn có thể tập trung vào việc giải quyết các bài toán logic cốt lõi của doanh nghiệp, tận dụng sức mạnh của cộng đồng để tăng tốc độ phát triển sản phẩm.

3. Tăng hiệu suất và chuẩn hóa quy trình phát triển

npm giúp chuẩn hóa cấu trúc dự án và quy trình làm việc nhóm. Tệp package.json hoạt động như một tài liệu sống, ghi lại tất cả các thư viện mà dự án cần. Bất kỳ ai tham gia vào dự án chỉ cần chạy npm install là đã có một môi trường làm việc đồng nhất. Tệp package-lock.json còn đi xa hơn, đảm bảo mọi người đều sử dụng chính xác cùng một phiên bản của mỗi thư viện, loại bỏ các xung đột tiềm tàng.

Thêm vào đó, tính năng npm scripts cho phép bạn định nghĩa các lệnh tùy chỉnh để tự động hóa các tác vụ lặp đi lặp lại như khởi động server, chạy kiểm thử, build dự án… Điều này không chỉ giúp tăng hiệu suất cá nhân mà còn đảm bảo toàn bộ đội ngũ tuân theo một quy trình chung, giúp dự án trở nên chuyên nghiệp và dễ bảo trì hơn.

Một số lưu ý khi sử dụng npm trong dự án thực tế

Khi đã nắm vững những kiến thức cơ bản, việc áp dụng npm vào các dự án thực tế đòi hỏi bạn phải chú ý đến một vài khía cạnh quan trọng để đảm bảo dự án vận hành trơn tru, bảo mật và dễ dàng bảo trì. Dưới đây là những lưu ý bạn không nên bỏ qua.

Hình minh họa

1. Quản lý version và xung đột phụ thuộc

Một trong những thách thức lớn nhất khi làm việc với nhiều thư viện là “dependency hell” (địa ngục phụ thuộc). Điều này xảy ra khi gói A yêu cầu gói C phiên bản 1.0, nhưng gói B lại yêu cầu gói C phiên bản 2.0. npm đã có nhiều cải tiến để giải quyết vấn đề này, nhưng bạn vẫn cần cẩn trọng.

Hãy luôn kiểm tra tệp package-lock.json để biết chính xác phiên bản nào đang được cài đặt. Khi cập nhật các gói, hãy làm điều đó một cách cẩn thận, từng gói một nếu cần, và chạy lại bộ kiểm thử (test suite) để đảm bảo không có gì bị hỏng. Sử dụng lệnh npm list để xem cây phụ thuộc và phát hiện các xung đột tiềm tàng.

2. Sử dụng scripts để tối ưu workflow

Đừng chỉ dừng lại ở npm install. Hãy tận dụng tối đa mục scripts trong tệp package.json. Đây là nơi bạn có thể định nghĩa các “bí danh” cho những dòng lệnh dài và phức tạp. Ví dụ, thay vì phải nhớ và gõ npx webpack --config webpack.config.js, bạn có thể tạo một script build.

"scripts": {
  "start": "node server.js",
  "dev": "nodemon server.js",
  "build": "webpack --config webpack.config.js",
  "test": "jest"
}

Giờ đây, bạn chỉ cần chạy npm run dev để khởi động server với nodemon hoặc npm run build để build dự án. Điều này không chỉ tiện lợi mà còn giúp các thành viên mới trong nhóm dễ dàng nắm bắt quy trình làm việc của dự án.

3. Bảo mật và kiểm tra các packages trước khi sử dụng

Kho gói npm khổng lồ là một lợi thế, nhưng cũng đi kèm với rủi ro về bảo mật. Bất kỳ ai cũng có thể xuất bản một gói lên npm, và đôi khi các gói này có thể chứa mã độc hoặc có những lỗ hổng bảo mật nghiêm trọng. Trước khi thêm một thư viện mới vào dự án, đặc biệt là những gói ít tên tuổi, hãy dành thời gian kiểm tra.

Hãy xem số lượt tải hàng tuần, số lượng issue trên GitHub, và thời gian cập nhật gần nhất của nó. Quan trọng hơn, hãy thường xuyên chạy lệnh:

npm audit

Lệnh này sẽ quét toàn bộ dự án của bạn và báo cáo về các lỗ hổng bảo mật đã được biết đến trong các thư viện bạn đang dùng. Nếu phát hiện lỗ hổng, npm audit fix có thể tự động khắc phục phần lớn trong số chúng. Đây là một bước không thể thiếu để bảo vệ ứng dụng và người dùng của bạn.

So sánh npm với các trình quản lý gói khác

Mặc dù npm là trình quản lý gói mặc định và phổ biến nhất, nhưng nó không phải là lựa chọn duy nhất. Hai đối thủ cạnh tranh lớn nhất là Yarn và pnpm, mỗi công cụ đều có những ưu và nhược điểm riêng. Hiểu rõ sự khác biệt giữa chúng sẽ giúp bạn đưa ra lựa chọn phù hợp nhất cho dự án của mình.

Hình minh họa

npm vs Yarn: Cuộc đua về tốc độ và sự ổn định

Yarn là gì (Yet Another Resource Negotiator) được Facebook ra mắt vào năm 2016 để giải quyết những vấn đề về tốc độ và tính nhất quán của npm thời bấy giờ. Yarn đã giới thiệu một số khái niệm đột phá:

  • Tốc độ: Yarn thực hiện cài đặt các gói song song và sử dụng cơ chế cache toàn cục, giúp các lần cài đặt sau này nhanh hơn đáng kể so với npm phiên bản cũ.
  • Tệp yarn.lock: Tương tự như package-lock.json của npm, tệp này đảm bảo mọi môi trường cài đặt đều có cùng một cây phụ thuộc, mang lại tính nhất quán cao.

Tuy nhiên, đội ngũ npm đã không ngừng cải tiến. Từ phiên bản 5 trở đi, npm đã tích hợp package-lock.json và cải thiện đáng kể tốc độ cài đặt, thu hẹp khoảng cách với Yarn. Hiện tại, sự khác biệt về hiệu suất giữa npm và Yarn không còn quá lớn. Yarn vẫn được yêu thích trong một số cộng đồng nhờ vào các tính năng như Workspaces (quản lý nhiều dự án trong một repo) và Plug’n’Play (cơ chế tải gói mà không cần thư mục node_modules).

npm vs pnpm: Cuộc cách mạng về dung lượng lưu trữ

pnpm (performant npm) lại tiếp cận vấn đề theo một hướng hoàn toàn khác: tối ưu hóa dung lượng đĩa cứng. Khi bạn dùng npm hoặc Yarn, mỗi dự án sẽ có một thư mục node_modules riêng biệt, chứa các bản sao của cùng một thư viện. Nếu bạn có 10 dự án cùng dùng React, bạn sẽ có 10 bản sao của React trên máy, gây lãng phí dung lượng.

pnpm giải quyết vấn đề này một cách thông minh:

  • Kho lưu trữ toàn cục: pnpm lưu trữ tất cả các gói trong một kho duy nhất trên máy tính của bạn.
  • Hard Links: Khi một dự án cần một gói, thay vì sao chép, pnpm sẽ tạo một “hard link” từ kho lưu trữ toàn cục đến thư mục node_modules của dự án đó. Hard link chỉ là một con trỏ đến tệp gốc, vì vậy nó không tốn thêm dung lượng.

Nhờ cơ chế này, pnpm không chỉ tiết kiệm dung lượng đĩa cứng một cách đáng kinh ngạc mà còn có tốc độ cài đặt rất nhanh. Cấu trúc node_modules của pnpm cũng chặt chẽ hơn, giúp ngăn chặn việc các gói có thể truy cập vào những thư viện mà chúng không khai báo phụ thuộc.

Ưu điểm và nhược điểm từng công cụ

  • npm:
    • Ưu điểm: Mặc định đi kèm Node.js, cộng đồng lớn nhất, tương thích tốt, không cần cài đặt thêm.
    • Nhược điểm: Có thể chậm hơn và tốn dung lượng hơn so với các đối thủ.
  • Yarn:
    • Ưu điểm: Tốc độ tốt, các tính năng mạnh mẽ như Workspaces, cộng đồng vẫn rất lớn mạnh.
    • Nhược điểm: Cần cài đặt riêng, sự khác biệt về tốc độ không còn quá lớn như trước.
  • pnpm:
    • Ưu điểm: Tiết kiệm dung lượng đĩa cứng vượt trội, tốc độ cài đặt rất nhanh, quản lý phụ thuộc chặt chẽ.
    • Nhược điểm: Ít phổ biến hơn, có thể gặp vấn đề tương thích với một số công cụ cũ không được thiết kế cho cấu trúc node_modules của pnpm.

Đối với người mới bắt đầu, gắn bó với npm là lựa chọn an toàn và đơn giản nhất. Khi các dự án của bạn trở nên lớn hơn hoặc bạn gặp vấn đề về hiệu suất hay dung lượng, việc xem xét chuyển sang Yarn hoặc pnpm là một ý tưởng hay.

Các vấn đề thường gặp khi sử dụng npm

Trong quá trình làm việc với npm, không phải lúc nào mọi thứ cũng suôn sẻ. Bạn có thể sẽ gặp phải một số lỗi hoặc vấn đề phổ biến. Hiểu rõ nguyên nhân và cách khắc phục sẽ giúp bạn tiết kiệm rất nhiều thời gian và bớt đi sự bực bội.

Hình minh họa

Lỗi khi cài đặt gói

Đây là một trong những vấn đề phổ biến nhất, đặc biệt là với người mới. Lỗi cài đặt có thể xuất phát từ nhiều nguyên nhân khác nhau.

Nguyên nhân:

  • Lỗi kết nối mạng: npm cần tải các gói từ kho lưu trữ trực tuyến. Nếu kết nối Internet của bạn không ổn định, bị chặn bởi tường lửa hoặc proxy của công ty, quá trình tải về sẽ thất bại. Lỗi thường có thông báo như ETIMEDOUT hoặc ECONNRESET.
  • Lỗi quyền truy cập (Permission errors): Đặc biệt trên macOS và Linux, nếu bạn cài đặt các gói toàn cục (-g) mà không có quyền quản trị, bạn sẽ gặp lỗi EACCES. Điều này là do npm đang cố gắng ghi vào các thư mục hệ thống mà người dùng thông thường không có quyền.
  • Gói không tồn tại hoặc sai tên: Đôi khi chỉ đơn giản là bạn gõ sai tên gói. Lỗi thường thấy là 404 Not Found.

Cách xử lý:

  • Kiểm tra kết nối mạng: Đảm bảo bạn có thể truy cập Internet. Nếu đang dùng mạng công ty, hãy hỏi quản trị viên về cấu hình proxy cho npm.
  • Xử lý lỗi quyền: Cách nhanh nhất là sử dụng sudo ở đầu lệnh (ví dụ: sudo npm install -g nodemon), nhưng đây không phải là cách được khuyến khích vì lý do bảo mật. Cách tốt hơn là cấu hình lại npm để sử dụng một thư mục khác mà không cần quyền root, hoặc sử dụng một trình quản lý phiên bản Node.js như nvm.
  • Kiểm tra lại tên gói: Hãy chắc chắn rằng bạn đã gõ đúng tên gói. Bạn có thể dùng lệnh npm search <tên_gói> để tìm kiếm và xác nhận.
  • Xóa cache và thử lại: Đôi khi cache của npm bị lỗi. Bạn có thể thử xóa cache bằng lệnh npm cache clean --force rồi chạy lại npm install.

Vấn đề xung đột phiên bản

Xung đột phiên bản là một vấn đề phức tạp hơn, xảy ra khi các thư viện khác nhau trong dự án của bạn yêu cầu các phiên bản không tương thích của cùng một gói phụ thuộc.

Hình minh họa

Nguyên nhân:

Giả sử dự án của bạn dùng gói A và gói B. Gói A cần lodash@^3.0.0, trong khi gói B lại cần lodash@^4.0.0. Khi đó, npm phải quyết định cài đặt phiên bản nào, và điều này có thể gây ra lỗi không tương thích. Mặc dù các phiên bản npm gần đây xử lý việc này khá tốt bằng cách tạo cây phụ thuộc lồng nhau, vấn đề vẫn có thể phát sinh.

Cách khắc phục:

  • Sử dụng npm list để kiểm tra: Chạy npm list để xem cây phụ thuộc. Lệnh này sẽ hiển thị các cảnh báo UNMET PEER DEPENDENCY nếu có xung đột.
  • Cập nhật các gói: Đôi khi, chỉ cần cập nhật các gói chính (AB trong ví dụ trên) lên phiên bản mới nhất là có thể giải quyết được vấn đề, vì phiên bản mới có thể đã cập nhật yêu cầu phụ thuộc của chúng.
  • Sử dụng overrides (npm v8+): Nếu bạn dùng npm phiên bản 8 trở lên, bạn có thể sử dụng mục “overrides” trong package.json để ép buộc một phiên bản cụ thể của một gói phụ thuộc lồng nhau. Đây là một giải pháp mạnh mẽ nhưng cần sử dụng cẩn thận.
  • Tìm một thư viện thay thế: Nếu xung đột không thể giải quyết, bạn có thể phải xem xét việc tìm một thư viện thay thế cho một trong các gói gây ra xung đột.

Best Practices khi sử dụng npm

Để trở thành một người dùng npm thông thái và chuyên nghiệp, việc tuân thủ các quy tắc và thực hành tốt nhất (best practices) là vô cùng quan trọng. Những thói quen này không chỉ giúp dự án của bạn sạch sẽ, an toàn mà còn tối ưu hóa hiệu suất làm việc.

Hình minh họa

1. Luôn cập nhật phiên bản npm mới nhất

Đội ngũ phát triển npm liên tục tung ra các phiên bản mới với những cải tiến về hiệu suất, bảo mật và các tính năng hữu ích. Việc sử dụng một phiên bản npm lỗi thời có thể khiến bạn bỏ lỡ những cải tiến quan trọng và gặp phải các lỗi đã được khắc phục. Hãy thường xuyên chạy lệnh sau để cập nhật npm lên phiên bản mới nhất:

npm install -g npm@latest

2. Thiết lập file .npmrc cho cấu hình dự án

Tệp .npmrc là một tệp cấu hình cho phép bạn tùy chỉnh hành vi của npm cho từng dự án hoặc cho toàn bộ hệ thống. Ví dụ, nếu cả nhóm của bạn muốn luôn luôn lưu gói vào dependencies với phiên bản chính xác thay vì dùng ^, bạn có thể thêm tệp .npmrc vào gốc dự án với nội dung:

save-exact=true

Bạn cũng có thể dùng tệp này để cấu hình các thông tin nhạy cảm như token truy cập vào các kho lưu trữ gói riêng tư, giúp giữ cho tệp package.json luôn sạch sẽ và an toàn.

3. Tránh cài đặt gói toàn cục nếu không cần thiết

Việc cài đặt gói toàn cục (-g) rất tiện lợi cho các công cụ dòng lệnh (CLI) mà bạn dùng thường xuyên (như nodemon, http-server). Tuy nhiên, hãy hạn chế thói quen này. Việc cài đặt các thư viện của dự án (như lodash, express) ở chế độ toàn cục là một ý tưởng tồi. Nó làm cho dự án của bạn phụ thuộc vào các gói có trên máy tính của bạn, gây khó khăn cho việc cộng tác và triển khai. Một người khác khi tải dự án của bạn về sẽ không thể chạy được vì thiếu phụ thuộc được khai báo trong package.json.

Nguyên tắc vàng: Chỉ cài đặt toàn cục các gói là ứng dụng dòng lệnh. Mọi thứ khác mà code của bạn require() hoặc import(), hãy cài đặt cục bộ vào dự án.

4. Kiểm tra bảo mật các packages trước khi dùng

Đây là một bước cực kỳ quan trọng đã được nhắc đến, nhưng cần phải nhấn mạnh lại. Đừng mù quáng tin tưởng vào bất kỳ gói nào trên npm. Trước khi npm install một gói mới, hãy dành vài phút để:

  • Kiểm tra trang GitHub của nó: Nó có được bảo trì tích cực không? Có nhiều issue đang mở không?
  • Xem số lượt tải hàng tuần trên trang npmjs.com: Một gói phổ biến thường đáng tin cậy hơn.
  • Sau khi cài đặt, hãy chạy npm audit để quét các lỗ hổng đã biết.

Hãy tạo thói quen chạy npm audit định kỳ, ví dụ như một phần của quy trình DevOps là gì, để đảm bảo dự án của bạn luôn được bảo vệ khỏi các mối đe dọa bảo mật mới.

Kết luận

Qua bài viết chi tiết này, chúng ta đã cùng nhau thực hiện một hành trình khám phá toàn diện về npm. Từ việc trả lời câu hỏi “npm là gì?” đến tìm hiểu lịch sử, cách cài đặt, các lệnh cơ bản, và những lợi ích vượt trội mà nó mang lại. npm không chỉ đơn thuần là một trình quản lý gói; nó là xương sống của hệ sinh thái Node.js và là một công cụ thiết yếu giúp chuẩn hóa, tự động hóa và tăng tốc quy trình phát triển phần mềm hiện đại.

Việc nắm vững npm, từ quản lý dependencies qua package.jsonpackage-lock.json đến việc áp dụng các best practices như kiểm tra bảo mật và tối ưu workflow bằng scripts, sẽ giúp bạn xây dựng các ứng dụng một cách hiệu quả, an toàn và chuyên nghiệp hơn. Đừng ngần ngại thử nghiệm, tìm hiểu sâu hơn và áp dụng những kiến thức này vào các dự án thực tế của bạn.

Hy vọng rằng bài viết của Bùi Mạnh Đức đã cung cấp cho bạn một nền tảng vững chắc và cái nhìn rõ ràng về npm. Để tiếp tục nâng cao kỹ năng, bạn hãy tìm hiểu thêm các tài liệu nâng cao về quản lý dự án Node.js, các tính năng mới của npm, hoặc khám phá các công cụ thay thế như Yarn và pnpm để có sự lựa chọn tốt nhất cho nhu cầu của mình. Chúc bạn thành công trên con đường lập trình!

5/5 - (1 Đánh giá)
Tác giả

Mạnh Đức

Có cao nhân từng nói rằng: "Kiến thức trên thế giới này đầy rẫy trên internet. Tôi chỉ là người lao công cần mẫn đem nó tới cho người cần mà thôi !"

Chia sẻ
Bài viết liên quan