VPS

pnpm: tiết kiệm ổ đĩa và cài gói nhanh hơn

Thanh Nguyễn Đăng 9 phút đọc 5 khối lệnh

pnpm: tiết kiệm ổ đĩa và cài gói nhanh hơn
Mục lục bài viết
  1. Cách lưu khác nhau ở đâu
  2. Cấu trúc chặt hơn và vì sao đó là điều tốt
  3. Rất hợp với monorepo
  4. Chuyển đổi và những chỗ vướng
  5. Lợi ích rõ nhất ở đâu
  6. Khi nào việc đổi trình quản lý gói thực sự đáng
  7. Cấu trúc chặt hơn nghĩa là gì trong thực tế
  8. Chuyển đổi và kiểm tra
  9. Ba chỗ hay vướng
  10. Câu hỏi thường gặp
  11. Bài viết liên quan

Trả lời nhanh: pnpm khác các trình quản lý gói khác ở cách lưu: nó giữ một kho chung cho cả máy và tạo liên kết vào từng dự án, thay vì chép lại toàn bộ thư viện cho mỗi dự án. Hai kết quả rất thực tế: tiết kiệm ổ đĩa rất nhiều khi bạn có nhiều dự án, và cài nhanh hơn vì gói đã có trong kho thì không phải tải lại. Đổi lại, cấu trúc thư mục thư viện chặt chẽ hơn nên vài gói viết ẩu có thể vướng.

Mười dự án web trên một máy dễ dàng chiếm chục GB chỉ riêng thư viện, và phần lớn là các gói giống hệt nhau được chép đi chép lại. Đây là bài toán mà một cách lưu khác giải quyết gọn, và nó cũng làm cho việc cài nhanh hơn đáng kể.

Cách lưu khác nhau ở đâu

Cách truyền thống chép toàn bộ thư viện vào thư mục của từng dự án. Mười dự án cùng dùng một thư viện là mười bản sao trên đĩa.

Cách của pnpm: tải một lần vào kho chung của máy, rồi mỗi dự án chỉ có liên kết trỏ tới đó. Về mặt sử dụng thì không khác gì, mã nguồn của bạn vẫn nhập thư viện như bình thường.

TerminalCách lưu khác nhau ở đâubash
# Cai va dungnpm install -g pnpmpnpm install # Xem kho chung dang chiem bao nhieupnpm store pathdu -sh $(pnpm store path) # Don cac goi khong con du an nao dungpnpm store prune

Lệnh cuối đáng chạy định kỳ, vì kho chung cũng phình theo thời gian khi bạn nâng phiên bản thư viện. Nó nằm gọn trong danh sách dọn dẹp ở bài dọn rác build.

Cấu trúc chặt hơn và vì sao đó là điều tốt

Cách truyền thống đặt mọi thư viện phẳng trong một thư mục, nên mã của bạn nhập được cả những gói mà bạn không khai báo, chỉ vì một thư viện khác kéo chúng về.

Đây là nguồn của một lỗi rất khó chịu: ứng dụng chạy tốt trên máy bạn nhưng hỏng trên máy chủ, vì trên đó cây phụ thuộc khác đi một chút và gói ngầm kia không còn ở chỗ cũ.

pnpm chỉ cho bạn nhập những gói đã khai báo. Ban đầu điều này gây phiền vì bạn phát hiện dự án đang phụ thuộc ngầm vào vài gói. Nhưng phát hiện lúc chuyển đổi rẻ hơn nhiều so với phát hiện lúc triển khai.

Cách sửa cũng đơn giản: khai báo tường minh những gói bạn thật sự dùng. Sau bước đó, dự án của bạn chắc chắn hơn ở mọi môi trường.

Rất hợp với monorepo

Với repo chứa nhiều gói, pnpm có cơ chế quản lý sẵn:

TerminalRất hợp với monorepobash
# pnpm-workspace.yamlpackages:  - 'apps/*'  - 'packages/*'
TerminalRất hợp với monorepobash
# Cai cho toan bo repopnpm install # Chay lenh trong mot goi cu thepnpm --filter web dev # Chay cho moi goipnpm -r build

Các gói trong repo tham chiếu lẫn nhau bằng liên kết chứ không phải bản sao, nên sửa một gói dùng chung là các gói khác thấy ngay mà không cần bước phát hành nội bộ.

Kết hợp với công cụ điều phối build để tránh làm lại việc đã làm thì bộ đôi này là cấu hình phổ biến cho monorepo hiện nay, chi tiết ở bài riêng trong cụm.

Chuyển đổi và những chỗ vướng

TerminalChuyển đổi và những chỗ vướngbash
# Xoa thu muc cu va file khoa curm -rf node_modules package-lock.jsonpnpm import      # tao file khoa moi tu file khoa cu neu canpnpm install

Ba chỗ hay vướng:

  • Gói phụ thuộc ngầm. Như đã nói ở trên, sẽ báo lỗi không tìm thấy. Cách sửa là khai báo tường minh.
  • Gói mong cấu trúc phẳng. Vài công cụ cũ giả định mọi thư viện nằm phẳng trong một thư mục. Có cấu hình để nới cho các gói đó, dùng khi cần chứ đừng nới đại trà.
  • Ảnh Docker. Nhớ sửa lệnh cài trong file dựng ảnh và chép đúng file khóa mới, nếu không bản dựng sẽ dùng phiên bản khác máy bạn.

Với dự án đang chạy ổn định và không có vấn đề về dung lượng hay tốc độ cài, việc chuyển đổi không cấp bách. Đây là thay đổi hợp lý nhất khi bắt đầu dự án mới hoặc khi bạn đang dọn lại hạ tầng.

Lợi ích rõ nhất ở đâu

Máy dev nhiều dự án. Đây là nơi tiết kiệm dung lượng thể hiện rõ nhất. Với người làm nhiều dự án cùng lúc, khác biệt tính bằng nhiều GB.

Máy CI. Giữ kho chung giữa các lượt build thì việc cài gói nhanh hơn hẳn, theo cách bố trí trong bài về cache build.

Máy chủ nhỏ. Khi dung lượng có hạn, việc không nhân bản thư viện cho từng dự án là khác biệt thật.

Về tốc độ, phần lớn lợi ích đến từ việc không phải tải lại, nên nó rõ nhất ở lần cài thứ hai trở đi. Lần đầu tiên trên máy trắng thì thời gian tương đương, và lúc đó tốc độ mạng cùng tốc độ ổ đĩa quyết định, như phân tích ở bài npm install chậm.

Khi nào việc đổi trình quản lý gói thực sự đáng

Tình huốngCó đáng đổi khôngLý do
Một dự án nhỏ, một người làmKhông gấpPhần tiết kiệm được nhỏ hơn thời gian xử lý các trục trặc khi chuyển
Nhiều dự án cùng dùng chung nhiều thư việnĐángCùng một phiên bản thư viện chỉ lưu một lần trên ổ đĩa
Kho mã gộp nhiều gói conRất đángĐây là chỗ khác biệt lớn nhất về cả tốc độ lẫn dung lượng
Máy chủ tích hợp liên tục cài lại phụ thuộc mỗi lần chạyĐángThời gian cài giảm rõ khi giữ được bộ nhớ đệm giữa các lần chạy

Cấu trúc chặt hơn nghĩa là gì trong thực tế

Cách lưu phẳng của trình quản lý gói cũ khiến mã của bạn gọi được cả những thư viện mà bạn không hề khai báo, chỉ vì chúng tình cờ nằm ở đó do một gói khác kéo về. Mã chạy được trên máy bạn rồi hỏng trên máy khác. Cấu trúc chặt chặn đúng chỗ này: gọi gói không khai báo thì lỗi ngay tại chỗ, không đợi tới lúc phát hành.

Cái giá phải trả là vài gói cũ viết theo giả định lưu phẳng sẽ báo lỗi khi chuyển. Đó là lỗi thật đã tồn tại sẵn, chỉ là trước đây bị che đi.

Chuyển đổi và kiểm tra

TerminalChuyển đổi và kiểm trabash
# 1. Xoa sach dau vet cua trinh quan ly curm -rf node_modules package-lock.json # 2. Cai lai tu daupnpm install # 3. Cho no bao cac goi bi goi ma khong khai baopnpm install --strict-peer-dependencies # 4. Chay day du truoc khi mungpnpm run buildpnpm test # 5. Kiem dung luong that su tiet kiem duocdu -sh node_modulespnpm store path     # noi luu chung, dung nham lan voi thu muc du an

Ba chỗ hay vướng

  • Ảnh chứa máy chủ: tệp mô tả ảnh phải cài trình quản lý gói mới trước khi cài phụ thuộc, nếu không bản dựng sẽ hỏng ở bước đầu.
  • Kịch bản tự động cũ: mọi nơi còn gọi lệnh của trình quản lý cũ đều phải sửa, kể cả trong tệp cấu hình của hệ thống tích hợp liên tục.
  • Hai tệp khóa cùng tồn tại: quên xóa tệp khóa cũ là cách chắc chắn để hai người trong đội cài ra hai bộ phiên bản khác nhau.

Câu hỏi thường gặp

pnpm có tương thích với mọi dự án không?

Phần lớn thì có. Chỗ vướng thường là gói phụ thuộc ngầm mà dự án bạn đang dùng mà không khai báo, và vài công cụ cũ giả định cấu trúc thư mục phẳng. Cả hai đều có cách xử lý.

Tiết kiệm được bao nhiêu dung lượng?

Tùy số dự án và mức trùng lặp thư viện giữa chúng. Với người làm nhiều dự án web cùng lúc, con số thường tính bằng nhiều GB vì các thư viện phổ biến không còn bị chép lại cho từng dự án.

Có nên chuyển dự án đang chạy không?

Không cấp bách nếu mọi thứ đang ổn. Đây là thay đổi hợp lý nhất khi bắt đầu dự án mới, khi dựng lại hạ tầng, hoặc khi bạn đang gặp vấn đề thật về dung lượng và tốc độ cài.

Dùng trên máy chủ có lưu ý gì?

Nhớ sửa lệnh cài trong file dựng ảnh Docker và chép đúng file khóa mới. Trên máy CI, hãy giữ kho chung giữa các lượt build thay vì để nó bị xóa sau mỗi lượt.

Chia sẻ:Facebook

Thanh Nguyễn

TND

Tư vấn bản quyền, VPS và máy chủ kèm hóa đơn VAT, hợp đồng đầy đủ cho doanh nghiệp.