Giới thiệu về Pnpm
Nếu bạn vẫn đang sử dụng Npm hoặc Yarn để cài đặt các phụ thuộc, có thể bạn đang lãng phí thời gian và dung lượng mà không bao giờ lấy lại được. Tôi đã chuyển một dự án lớn sang Pnpm và thấy rằng quạt máy tính xách tay của mình gần như đã nghỉ hưu ngay lập tức. Pnpm không chỉ tăng tốc độ cài đặt mà còn tránh việc sao chép lại các gói giống nhau giữa các dự án, mà không yêu cầu bạn phải làm quen lại với toàn bộ quy trình làm việc của mình.
Tại sao các nhà phát triển chuyển sang Pnpm
- Tốc độ vượt trội: Thường nhanh hơn rõ rệt khi cài đặt lần đầu và trong CI, khoảng cách càng lớn khi dự án phát triển.
- Tiết kiệm dung lượng: Thay vì sao chép cùng một thư viện vào mỗi thư mục
node_modules, Pnpm tái sử dụng một bản sao duy nhất cho nhiều dự án. - Ít bất ngờ hơn: Cấu trúc phụ thuộc chặt chẽ và chính xác hơn giúp ngăn chặn các tình huống “nó chạy trên máy của tôi”.
- Tuyệt vời cho monorepos: Hỗ trợ workspace hàng đầu giúp các dự án đa gói trở nên gọn gàng và đồng nhất.
Theo trang Motivation chính thức, Pnpm lưu trữ các gói trong một kho chứa toàn cầu, có thể truy cập nội dung và liên kết chúng vào từng dự án. Đó là lý do tại sao việc sử dụng dung lượng giảm và tốc độ cài đặt nhanh hơn khi bạn thêm nhiều dự án trên cùng một máy.
Cách Pnpm hoạt động (nói một cách đơn giản)
Các trình quản lý truyền thống sao chép các phụ thuộc vào mỗi thư mục node_modules của dự án. Pnpm thì:
- Tải xuống một phiên bản gói một lần vào một kho chứa toàn cầu trên máy của bạn.
- Thêm liên kết cứng/sym từ
node_modulescủa dự án trở lại kho chứa đó. - Xây dựng một cây phụ thuộc chính xác không phẳng (bạn sẽ thấy một kho ảo dưới
node_modules/.pnpm) phản ánh cách mà các gói thực sự phụ thuộc vào nhau.
Kết quả: giảm I/O đĩa, giảm sự sao chép và cách ly sạch hơn giữa các phụ thuộc trực tiếp và gián tiếp. Nghĩa là ít khoảnh khắc “phụ thuộc đó đến từ đâu?” hơn.
Hiệu suất thực tế: điều gì để mong đợi
Mặc dù kết quả có thể khác nhau tùy theo dự án và thiết lập CI, các bài kiểm tra từ các monorepos lớn cho thấy một mẫu rõ rệt:
- Yarn 2: khoảng 6.5 phút cho bộ nhớ đệm lạnh; khoảng 1.2 phút cho bộ nhớ đệm ấm
- Yarn 3 (tinh chỉnh): khoảng 1.2 phút cho bộ nhớ đệm lạnh; ~45 giây cho bộ nhớ đệm ấm
- Pnpm: khoảng 58 giây cho bộ nhớ đệm lạnh; ~24 giây cho bộ nhớ đệm ấm
Những con số này đến từ một nghiên cứu trường hợp chi tiết; hiệu suất của bạn có thể khác. Tuy nhiên, xu hướng vẫn giữ nguyên: Pnpm nổi bật trong các tình huống thiếu bộ nhớ đệm và duy trì tốc độ nhanh với bộ nhớ đệm ấm.
So sánh nhanh: Pnpm vs Npm vs Yarn
| Danh mục | Pnpm | Npm | Yarn |
|---|---|---|---|
| Tốc độ cài đặt | Rất nhanh (lạnh và ấm) | Tốt, nhưng chậm hơn trên các đồ thị lớn | Nhanh; Yarn 3 có thể rất cạnh tranh |
| Sử dụng dung lượng | Tối thiểu bản sao thông qua kho toàn cầu + liên kết | Bản sao mỗi dự án | Bản sao mỗi dự án (trừ khi sử dụng chế độ nâng cao) |
Cấu trúc node_modules |
Lồng nhau, chính xác; kho ảo dưới .pnpm |
Phẳng hoisted | Phẳng hoisted theo mặc định |
| Cách ly phụ thuộc | Chặt chẽ, tránh phụ thuộc ma | Có thể cho phép truy cập không được khai báo thông qua hoisting | Có thể cho phép truy cập không được khai báo thông qua hoisting |
| Workspaces/monorepos | Được tích hợp và thân thiện | Được hỗ trợ | Được hỗ trợ, mạnh mẽ |
| Đường cong học tập | Nhẹ; cấu trúc/lệnh mới | Rất quen thuộc | Quen thuộc; các tính năng nâng cao làm tăng độ phức tạp |
Bắt đầu với Pnpm (5 bước)
- Cài đặt pnpm toàn cầu
- Sử dụng Npm:
npm install -g pnpm - Hoặc qua Corepack (Node 16.13+):
corepack enable && corepack prepare pnpm@latest --activate
- Dọn dẹp dự án
- Xóa các tài liệu trước đó:
rm -rf node_modules package-lock.json yarn.lock
- Nhập lockfile (tùy chọn)
- Từ npm hoặc yarn:
pnpm import
- Cài đặt các phụ thuộc
pnpm install
- Cập nhật các lệnh và tài liệu
- Thay thế các lệnh như
npm runbằngpnpm runkhi cần thiết. - Trong monorepos, tạo một
pnpm-workspace.yamlvới các glob gói của bạn.
Mẹo chuyên nghiệp: Sử dụng một trình quản lý gói cho mỗi dự án. Cam kết
pnpm-lock.yamlvà tài liệu lựa chọn cho nhóm của bạn.
Những cạm bẫy phổ biến khi di chuyển (và cách khắc phục)
-
Phụ thuộc không được khai báo làm hỏng xây dựng
- Tại sao điều này xảy ra: Cấu trúc chặt chẽ của pnpm chặn quyền truy cập vào các gói bạn không khai báo.
- Cách khắc phục: thêm phụ thuộc thiếu một cách rõ ràng, hoặc (như một biện pháp cuối cùng) sử dụng các tùy chọn hoisting như
public-hoist-pattern/shamefully-hoistcho các công cụ mong đợi một cấu trúc phẳng.
-
Công cụ không theo dõi symlink tốt
- Một số công cụ xây dựng hoặc CLI giả định có một
node_modulesphẳng. Thêm phụ thuộc chính xác vào workspace đang sử dụng, hoặc bật hoisting giới hạn cho gói đó.
- Một số công cụ xây dựng hoặc CLI giả định có một
-
Bộ nhớ đệm CI cảm thấy “không đúng”
- Đảm bảo bạn lưu trữ thư mục kho toàn cầu của pnpm và các đường dẫn
pnpm-store. Luôn khôi phục bộ nhớ đệm trước khipnpm install.
- Đảm bảo bạn lưu trữ thư mục kho toàn cầu của pnpm và các đường dẫn
-
Kí ức cơ bắp của đội ngũ
- Tạo một bí danh địa phương, ví dụ:
alias pn=pnpm, và chia sẻ một bảng lệnh ngắn (xem bên dưới) trong README của bạn.
- Tạo một bí danh địa phương, ví dụ:
Bảng lệnh tắt (Npm/Yarn → Pnpm)
- Cài đặt tất cả:
npm install/yarn install→pnpm install - Thêm phụ thuộc sản phẩm:
npm i lodash/yarn add lodash→pnpm add lodash - Thêm phụ thuộc phát triển:
npm i -D typescript/yarn add -D typescript→pnpm add -D typescript - Xóa:
npm uninstall pkg/yarn remove pkg→pnpm remove pkg - Cập nhật:
npm update/yarn upgrade→pnpm update - Chạy tập lệnh:
npm run build/yarn build→pnpm run build - Workspaces:
npm -w pkg run test/yarn workspace pkg test→pnpm -F pkg run test
Thực hành tốt nhất để áp dụng mượt mà
- Tiêu chuẩn hóa trên pnpm cho mỗi repo; không trộn lẫn các trình quản lý.
- Cam kết
pnpm-lock.yamlvà xem xét nó trong các PR. - Giữ Node và pnpm luôn cập nhật trên các máy phát triển và CI.
- Trong monorepos, xác định rõ các glob workspace và sử dụng
pnpm -rcho các lệnh toàn repo. - Lưu trữ kho pnpm trong CI và khôi phục nó sớm trong pipeline.
Bạn có nên sử dụng Pnpm không?
Chọn công cụ phù hợp với ngữ cảnh của bạn:
- Chọn Pnpm nếu bạn quản lý các dự án lớn hoặc monorepos, muốn cài đặt mới nhanh hơn, hoặc có dung lượng đĩa hạn chế.
- Giữ lại Npm cho sự tương thích tối đa và nếu dự án của bạn nhỏ và đơn giản.
- Xem xét Yarn nếu nhóm của bạn đã tiêu chuẩn hóa trên nó và hưởng lợi từ các tính năng cụ thể của nó.
Đối với nhiều nhóm, một thử nghiệm nhanh là đủ: chuyển đổi một repo, đo thời gian cài đặt (lạnh và ấm), và kiểm tra việc sử dụng dung lượng. Nếu kết quả phản ánh những gì người khác báo cáo, cài đặt nhanh hơn và dung lượng nhỏ hơn, hãy triển khai Pnpm rộng rãi hơn.
Kết luận
Pnpm mang lại tốc độ cài đặt nhanh hơn, giải quyết chính xác và đáng tin cậy các phụ thuộc, và thực sự tiết kiệm dung lượng đĩa. Nếu bạn quản lý nhiều dự án hoặc một monorepo, đây là một trong những lợi ích dễ dàng nhất mà bạn có thể đạt được trong quý này. Hãy thử Pnpm trên một kho lưu trữ đơn, đo lường sự khác biệt và xem liệu nó có xứng đáng để trở thành một phần vĩnh viễn trong bộ công cụ của bạn hay không.