pnpm là gì? Trình quản lý package nhanh và tiết kiệm cho Node.js

pnpm là gì?

pnpm là trình quản lý package nhanh và tiết kiệm ổ đĩa cho hệ sinh thái Node.js. Khác với npm và Yarn, pnpm lưu trữ các dependency trong một global store dùng chung, liên kết chúng vào từng project bằng hard links, nhờ đó tiết kiệm hàng GB ổ đĩa khi bạn làm việc với nhiều dự án cùng lúc.

Được phát triển bởi Zoltan Kochan từ năm 2016, pnpm hiện là lựa chọn mặc định của nhiều dự án lớn như Next.js, Vite, Vue, Astro, Prisma, Turborepo, Material UI và SvelteKit. Với hơn 590 triệu lượt tải mỗi tháng trên npm registry, pnpm đang dần thay thế npm trong các monorepo hiện đại.

Banner pnpm với các hộp package và logo pnpm trên nền gỗ

Vì sao pnpm nhanh và tiết kiệm hơn npm?

Cơ chế cốt lõi của pnpm là content-addressable store: mọi file dependency được lưu một lần trong global store, định danh theo hash nội dung. Nếu 100 dự án cùng dùng chung một dependency, chỉ có một bản copy duy nhất tồn tại trên ổ đĩa.

Khi một version mới chỉ thay đổi 1 trong 100 file, pnpm chỉ thêm đúng 1 file đó vào store. Với npm, mỗi dự án lại tải toàn bộ dependency về thư mục node_modules riêng — lãng phí rất nhiều dung lượng.

So sánh hiệu năng (benchmark chính thức)

Kịch bản npm pnpm Yarn Yarn PnP
Cài đặt sạch 27.3s 7.6s 6.9s 2.9s
Không có gì thay đổi (no-op) 1.0s 0.5s 4.6s n/a
Cập nhật 6.3s 7.7s 5.3s 2.6s

pnpm nhanh hơn npm khoảng 3.6 lần khi cài đặt sạch, nhờ kiến trúc 3 giai đoạn: resolve → tính toán cấu trúc → link (thay vì resolve → fetch → ghi toàn bộ như npm).

Không gian làm việc lập trình với laptop hiển thị code JavaScript

Strict node_modules: khác biệt quan trọng nhất

npm và Yarn cổ điển hoisting dependency lên phẳng — mọi package đều nằm ở node_modules gốc, khiến code của bạn có thể sử dụng package mà không khai báo trong package.json (gọi là phantom dependencies).

pnpm sử dụng cấu trúc nghiêm ngặt: chỉ các dependency trực tiếp được symlink vào node_modules gốc. File thật nằm trong node_modules/.pnpm/<name>@<version>/node_modules/<name>. Node.js vẫn resolve được nhờ real path, nhưng bạn không thể dùng package chưa khai báo — phát hiện lỗi sớm, tránh những bug khó chịu khi chuyển môi trường.

Workspace và monorepo

pnpm có hỗ trợ monorepo tích hợp sẵn qua file pnpm-workspace.yaml. Bạn có thể:

  • Chạy lệnh đệ quy trên tất cả package: pnpm run build –recursive
  • Lọc package cụ thể: pnpm –filter @app/web build
  • Dùng giao thức workspace:* — tự động chuyển thành semver khi publish

Không cần cài thêm Lerna hay Yarn workspaces — pnpm xử lý monorepo ngay từ hộp. Các dự án lớn như Vercel và Turborepo chọn pnpm vì lý do này.

Cài đặt và các lệnh cơ bản

# Cài đặt pnpm
npm install -g pnpm

# Cài dependency
pnpm install
pnpm add react
pnpm add -D typescript

# Chạy script
pnpm run dev
pnpm exec eslint src

# Chạy package không cần cài (giống npx)
pnpm dlx create-vite my-app

Màn hình terminal với dòng lệnh cài đặt package

Bảo mật tốt hơn

Từ phiên bản v11, pnpm mặc định chặn postinstall script của dependency trừ khi được allowlist (lệnh pnpm approve-builds). Tarball được xác minh toàn vẹn, peer dependencies tự cài — giảm đáng kể nguy cơ supply chain attack.

Hạn chế của pnpm

  • Một số tooling không tương thích cấu trúc symlink — cần đổi nodeLinker=hoisted
  • Một số package trong hệ sinh thái dựa vào hoisting sẽ báo lỗi khi migrate
  • Không có versioning tích hợp — cần Changesets hoặc Rush
  • pnpm update chậm hơn npm trong benchmark chính thức

Các lệnh nâng cao của pnpm

pnpm không chỉ đơn giản là thêm/xóa package. Một số lệnh nâng cao thường dùng trong dự án thực tế:

  • pnpm patch <package>: tạo bản sửa đổi cục bộ cho dependency — hữu ích khi upstream có bug cần fix tạm mà chưa release
  • pnpm dedupe: tối ưu lại tree dependency, gỡ bỏ các bản sao thừa — tiết kiệm thêm dung lượng
  • pnpm why <package>: xem tại sao một package tồn tại trong project, ai phụ thuộc vào nó — rất hữu ích khi audit dependency
  • pnpm store prune: dọn dẹp global store, xóa các phiên bản không còn dùng ở bất kỳ project nào
  • pnpm sbom: tạo Software Bill of Materials — yêu cầu bắt buộc trong một số dự án doanh nghiệp
  • pnpm approve-builds: duyệt các build script của dependency — tính năng bảo mật mới từ v11, chặn side-effect khi cài package mới

Ngoài ra, CI/CD pipeline nên dùng –frozen-lockfile để đảm bảo bản cài giống hệt developer, tránh drift giữa các môi trường. Pnpm cũng hỗ trợ reproducible builds qua lockfile — bạn có thể yên tâm rằng pnpm install trên máy nào cũng cho ra cùng kết quả.

Khi nào nên dùng pnpm?

  • Làm monorepo nhiều package — pnpm là lựa chọn số một hiện nay
  • Máy ít dung lượng, cần tiết kiệm ổ đĩa
  • CI/CD muốn cài đặt nhanh với lockfile đông cứng (–frozen-lockfile)
  • Team muốn code nghiêm ngặt, không phantom dependencies

Với dự án nhỏ đơn lẻ, npm vẫn ổn — nhưng nếu bạn đang bắt đầu dự án mới hoặc quản lý nhiều dự án, pnpm là lựa chọn đáng cân nhắc ngay từ đầu.

Tham khảo thêm:

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

JWT là gì? Hướng dẫn xác thực API cho lập trình viên

JWT là gì? JWT (JSON Web Token) là một tiêu chuẩn mở được IETF ban hành theo RFC 7519 vào tháng 5 năm 2015, dùng để truyền tải dữ liệu…

Xem thêm

Clean Code là gì? Nguyên tắc viết code sạch

Clean Code hay viết code sạch là triết lý phát triển phần mềm nhấn mạnh việc viết code rõ ràng, dễ đọc và dễ bảo trì. Thuật ngữ này trở…

Xem thêm

Web Scraping với Python: Hướng dẫn thu thập dữ liệu web cho người mới

Web scraping là kỹ thuật tự động tải trang web và trích xuất dữ liệu có cấu trúc như giá sản phẩm, tin tức hay bài đánh giá bằng script,…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất