Trong quá trình phát triển các dự án, việc quản lý packages là phần quan trọng để đảm bảo hoạt động trơn tru, ổn định. pnpm đang thu hút nhiều sự chú ý bởi các developer nhờ tiết kiệm dung lượng đĩa và tăng tốc độ xử lý.
Vậy pnpm là gì, và nó có phải là trình quản lý gói hiệu quả nhất cho Nodejs? Hãy cùng mình tìm hiểu về pnpm, những ưu điểm của mà nó mang lại là gì nhé.
1. Package manager là gì?
Trước khi đi vào chi tiết về pnpm, bạn cần hiểu rõ vai trò của các trình quản lý gói trong quá trình phát triển phần mềm. Các công cụ này giúp tự động hóa quá trình cài đặt, cập nhật và quản lý các thư viện bên ngoài (packages) trong một dự án. Nhờ đó, developer có thể tận dụng mã nguồn đã được viết sẵn, thay vì phải viết lại từ đầu, giúp tăng năng suất và chất lượng mã.
Mặc dù npm và yarn đã có mặt trong nhiều năm, nhưng chúng không phải là không có nhược điểm:
- Sử dụng không hiệu quả dung lượng ổ đĩa: khi cài đặt các dự án lớn với nhiều gói phụ thuộc,
node_modules
có thể trở nên rất lớn. - Thời gian cài đặt lâu: với các dự án có nhiều gói, việc cài đặt có thể mất nhiều thời gian.
- Xung đột phiên bản: quản lý các phiên bản khác nhau của cùng một gói trong các dự án phức tạp có thể gây ra xung đột.
2. pnpm là gì?
pnpm là viết tắt của "Performant npm", là một package manager (quản lý gói) với mục tiêu là cải thiện hiệu suất và tiết kiệm dung lượng ổ đĩa. Ý tưởng của pnpm là sử dụng content-addressable store để lưu trữ các gói, giúp nó trở nên hiệu quả trong việc quản lý dung lượng đĩa và tốc độ, đặc biệt đối với các dự án lớn có nhiều thư viện phụ thuộc lẫn nhau.
Không giống như npm và yarn, nơi mà các gói bị sao chép vào từng thư mục node_modules
của mỗi dự án, thay vì sao chép gói, pnpm lưu trữ chúng ở một vị trí toàn cục trên máy. Khi một dự án yêu cầu một package cụ thể, pnpm sử dụng hard-link từ store tới thư mục node_modules
của dự án. Điều này giúp giảm đáng kể dung lượng ổ đĩa sử dụng vì các gói dùng chung không bị lưu trữ nhiều lần.
3. Các tính năng nổi bật của pnpm
3.1 Tiết kiệm dung lượng ổ đĩa
Một trong những điểm mạnh nhất của pnpm là khả năng tiết kiệm dung lượng ổ đĩa. Các công cụ quản lý gói truyền thống như npm và yarn sao chép các gói vào từng dự án, dẫn đến việc lặp lại nhiều lần nếu cùng một gói được sử dụng ở nhiều dự án.
pnpm khắc phục điều này bằng cách sử dụng một store lưu trữ toàn cục, đảm bảo rằng mỗi thư viện chỉ lưu trữ một lần duy nhất trên ổ đĩa của bạn, dù có bao nhiêu dự án sử dụng nó. Nên thư mục node_modules
nhỏ hơn nhiều, đặc biệt là khi bạn làm việc với nhiều dự án có các thư viện phụ thuộc giống nhau.
3.2 Tốc độ cài đặt nhanh
Vì pnpm liên kết cứng các gói từ store toàn cục, quá trình cài đặt diễn ra nhanh hơn rất nhiều. pnpm không cần phải tải lại hay sao chép gói mỗi lần cài đặt cho một dự án mới, giúp giảm thiểu việc sử dụng mạng và CPU.
Ngoài ra, pnpm còn tối ưu hóa việc cài đặt các thư viện phụ thuộc ngang hàng (peer dependencies), giúp xử lý nhanh hơn so với các trình quản lý gói khác, vốn thường gặp phải các xung đột hoặc chậm trễ khi xử lý các thư viện này.
3.3 Quản lý gói nghiêm ngặt
pnpm quản lý cấu trúc node_modules
của dự án. Mỗi gói (ví dụ như express) chỉ có thể sử dụng những thư viện phụ thuộc mà nó đã yêu cầu và khai báo rõ ràng trong tệp package.json
. Khác với cách mà npm và yarn - thường cho phép các gói truy cập vào các thư viện gián tiếp được cài đặt thông qua một gói khác. Sự nghiêm ngặt này giúp dự án của bạn trở nên dễ bảo trì hơn và tránh những phụ thuộc ẩn khó phát hiện.
Ví dụ, nếu express cần dùng thư viện cookie, thì cookie phải được khai báo là phụ thuộc của express. pnpm sẽ đảm bảo rằng express chỉ có thể truy cập cookie mà không truy cập được bất kỳ thư viện nào khác nếu chúng không được khai báo. Điều này giúp ngăn chặn việc sử dụng các thư viện phụ thuộc một cách gián tiếp.
3.4 Deterministic installations
pnpm cung cấp tính năng deterministic installations, nghĩa là cấu trúc của thư mục node_modules
sẽ giống nhau mỗi khi bạn cài đặt, bất kể môi trường nào.
Quan trọng khi sử dụng các đường dẫn triển khai CI/CD. Với file khóa pnpm-lock.yaml
, pnpm đảm bảo rằng các thư viện phụ thuộc luôn nhất quán.
4. So sánh npm, yarn và pnpm
Dưới đây là bảng so sánh ngắn gọn giữa npm, yarn và pnpm
pnpm | npm | Yarn | |
---|---|---|---|
Sử dụng dung lượng đĩa | Sử dụng liên kết cứng, tránh trùng lặp | Sao chép gói vào từng dự án | Giảm bớt trùng lặp |
Tốc độ (Khi cài đặt lại) | Nhanh: Sử dụng store toàn cục | Chậm: Tải lại và sao chép gói | Nhanh hơn npm nhưng chậm hơn pnpm |
Quản lý phụ thuộc | Ngăn truy cập vào các phụ thuộc chưa khai báo | Cho phép truy cập vào các phụ thuộc chưa khai báo | Giống như npm |
Hỗ trợ Monorepo | Hỗ trợ tích hợp với pnpm workspaces | Cần công cụ bên ngoài để quản lý monorepo | Hỗ trợ monorepo với yarn workspaces |
Cài đặt nhất quán | Đảm bảo cài đặt nhất quán giữa các môi trường | Không phải lúc nào cũng nhất quán | Đảm bảo cài đặt nhất quán với lockfile |
5. Hướng dẫn cài đặt và sử dụng pnpm
5.1 Cài đặt pnpm
- Using Corepack: chạy lệnh sau (nhớ cấp quyền nhé):
corepack enable pnpm
- Using npm
npm install -g pnpm
5.2 Sử dụng pnpm
pnpm cung cấp các lệnh tương tự như npm, nên các bạn rất dễ dàng nhớ
- Cài đặt gói:
pnpm install <package_name>
- add package:
pnpm add <package_name>
- remove package:
pnpm remove <package_name>
6. Khi nào nên sử dụng pnpm
- Với các dự án lớn hoặc monorepo có nhiều phụ thuộc, pnpm giúp tiết kiệm dung lượng và quản lý phụ thuộc hiệu quả.
- Nếu bạn muốn tránh xung đột phiên bản và đảm bảo môi trường nhất quán.
- Khi bạn ưu tiên tốc độ cài đặt và hiệu suất
- Bạn cần cân nhắc điều này: một số packages hoặc công cụ có thể không tương thích hoàn toàn với cấu trúc
node_modules
của pnpm.
7. Kết luận
Với những cải tiến về hiệu suất, tiết kiệm dung lượng và tính nghiêm ngặt trong quản lý gói, pnpm là lựa chọn tuyệt vời cho những dự án Nodejs lớn đặc biệt đối với các dự án monorepo.
Các bài viết liên quan:
Bài viết liên quan
Giới thiệu Kiến trúc Backend for Frontend (BFF)
Nov 16, 2024 • 10 min read
Flask là gì? Hướng dẫn tạo Ứng dụng Web với Flask
Nov 15, 2024 • 7 min read
Webhook là gì? So sánh Webhook và API
Nov 15, 2024 • 8 min read
Spring Boot là gì? Hướng dẫn Khởi tạo Project Spring Boot với Docker
Nov 14, 2024 • 6 min read
Two-Factor Authentication (2FA) là gì? Vì sao chỉ Mật khẩu thôi là chưa đủ?
Nov 13, 2024 • 7 min read
Test-Driven Development (TDD) là gì? Hướng dẫn thực hành TDD
Nov 13, 2024 • 6 min read