0
0
Lập trình
TT

Pnpm: Trình quản lý gói Node.js nhanh và tiết kiệm dung lượng

Đăng vào 4 tháng trước

• 6 phút đọc

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ì:

  1. 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.
  2. Thêm liên kết cứng/sym từ node_modules của dự án trở lại kho chứa đó.
  3. 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)

  1. 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
  1. 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
  1. Nhập lockfile (tùy chọn)
  • Từ npm hoặc yarn: pnpm import
  1. Cài đặt các phụ thuộc
  • pnpm install
  1. Cập nhật các lệnh và tài liệu
  • Thay thế các lệnh như npm run bằng pnpm run khi cần thiết.
  • Trong monorepos, tạo một pnpm-workspace.yaml vớ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.yaml và 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-hoist cho 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_modules phẳ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 đó.
  • 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 khi pnpm install.
  • 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.

Bảng lệnh tắt (Npm/Yarn → Pnpm)

  • Cài đặt tất cả: npm install / yarn installpnpm install
  • Thêm phụ thuộc sản phẩm: npm i lodash / yarn add lodashpnpm add lodash
  • Thêm phụ thuộc phát triển: npm i -D typescript / yarn add -D typescriptpnpm add -D typescript
  • Xóa: npm uninstall pkg / yarn remove pkgpnpm remove pkg
  • Cập nhật: npm update / yarn upgradepnpm update
  • Chạy tập lệnh: npm run build / yarn buildpnpm run build
  • Workspaces: npm -w pkg run test / yarn workspace pkg testpnpm -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.yaml và 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 -r cho 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.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào