Xin chào tất cả mọi người! Tôi chắc rằng bạn đã thấy sử dụng các trình quản lý gói khác nhau, ví dụ: các dự án Node.js (mặc định) npm sợi pnpm Bản thân tôi đã nhìn thấy điều đó và làm việc với tất cả những điều trên, nhưng tôi luôn có một câu hỏi trong đầu - điều gì thúc đẩy mọi người/nhóm sử dụng hoặc thay vì ? Ưu điểm là gì? Có bất kỳ khuyết điểm nào không? sợi pnpm npm Chà… Hãy cùng tìm hiểu nhé! Quy tắc so sánh hiệu suất Tôi quyết định so sánh , và về “tốc độ” của chúng… npm sợi pnpm Bạn sẽ thấy 3 biện pháp dưới đây: Tạo một tập tin khóa mà không có bất kỳ bộ đệm nào. Cài đặt các phần phụ thuộc từ các tệp khóa hiện có mà không cần bất kỳ bộ đệm nào. Cài đặt các phần phụ thuộc từ các tệp khóa hiện có bằng bộ đệm chung. Có hai loại bộ đệm: Toàn cầu. Thường được lưu trữ trong thư mục chính của người dùng (fe, ). ~/.yarn/berry/cache Địa phương. Được lưu trữ trong thư mục dự án (fe, ). <project-dir>/.yarn Mặc dù & là những trường hợp sử dụng phổ biến nhất theo kinh nghiệm của tôi, nhưng tôi cũng lấy để đề phòng (mặc dù đó là một trường hợp rất hiếm gặp). #2 #3 #1 Tôi đã sử dụng một dự án mẫu từ làm ví dụ cho điểm chuẩn. ứng dụng tạo phản ứng npm Đó là trình quản lý gói mặc định cho hệ sinh thái - còn gì để nói nữa? Nó đi kèm với gói cài đặt, vì vậy về cơ bản nó sẵn sàng để sử dụng khi bạn cài đặt trên máy của mình (hoặc trong bất kỳ nhà cung cấp nào nếu bạn thiết lập ở đó). Node.js Node.js CI Node.js Trong tâm trí tôi, đó là một tính năng “pro” rất lớn - bạn không cần phải cài đặt riêng! Không có gì nổi bật ở đó - nó chỉ… hoạt động! Và tôi chưa thấy bất kỳ lỗi lớn nào trong nhiều năm - nó có vẻ khá ổn định và hoàn thành công việc. Các tính năng của tôi đã sử dụng cho đến nay: npm Quản lý các phần phụ thuộc (cài đặt, gỡ bỏ, cập nhật) Xuất bản các gói (riêng tư, công khai) Gói liên kết cục bộ Quản lý không gian làm việc. Quản lý phụ thuộc lưu trữ các phần phụ thuộc trong thư mục của thư mục gốc dự án của bạn. Khá đơn giản. npm node_modules ℹ️ lưu trữ thông tin về cơ quan đăng ký cho các gói được liệt kê - nó hữu ích nếu bạn có các gói từ một phạm vi duy nhất, tức là trong các cơ quan đăng ký khác nhau (ví dụ - Gói & ): package-lock.json RẤT @example-company npm GitHub Bây giờ, hãy xem nó hoạt động như thế nào về tốc độ cài đặt… Tạo gói-lock.json mà không cần bất kỳ bộ đệm nào Phải mất để tạo và cài đặt các phần phụ thuộc mà không cần bất kỳ bộ đệm nào. 1 phút npm package-lock.json Lệnh được sử dụng: npm i Cài đặt phụ thuộc từ package-lock.json mà không cần bất kỳ bộ đệm nào Phải mất để cài đặt các phần phụ thuộc từ mà không cần bất kỳ bộ đệm nào. 18 giây npm package-lock.json Lệnh được sử dụng: npm ci Cài đặt phụ thuộc từ package-lock.json với Global Cache Phải mất để cài đặt các phần phụ thuộc từ với bộ đệm chung. 8 giây npm package-lock.json Lệnh được sử dụng: npm ci Quản lý không gian làm việc Tôi có thể tạo và quản lý các phần phụ thuộc cho toàn bộ không gian làm việc cùng một lúc và cho các dự án cụ thể một cách riêng biệt. một không gian làm việc Nói cách khác - nó hoàn thành công việc mà không có bất kỳ lỗi/vấn đề nào và tài liệu chính thức khá đơn giản. Các tính năng của không gian làm việc mà tôi đã sử dụng cho đến nay: Cài đặt các phần phụ thuộc cho tất cả các dự án trong không gian làm việc. Cài đặt các phần phụ thuộc cho một dự án cụ thể. Chạy đệ quy một tập lệnh cho tất cả các dự án cùng một lúc. sợi Thành thật mà nói, tôi chưa thử nhiều tính năng . Ý tôi là, tôi đã sử dụng nó rất nhiều với mục đích “cài đặt các phần phụ thuộc” khi làm việc trên một số dự án, và chỉ vậy thôi. của sợi không đi kèm với trình cài đặt , vì vậy bạn phải cài đặt riêng. Điều đó có nghĩa là sẽ có một bước bổ sung trong quy trình của bạn - bạn phải thiết lập trước khi cài đặt các phần phụ thuộc dự án của mình. sợi Node.js CI sợi Quản lý phụ thuộc có hai cách tiếp cận để cài đặt các phụ thuộc: sợi “ ” (mặc định) - tạo thư mục và liệt kê các gói trong tệp & . Zero Installs .yarn yarn.lock .pnp.cjs Một cái thông thường - tương tự như , lưu trữ các phần phụ thuộc vào và liệt kê chúng trong tệp . npm node_modules yarn.lock ℹ️ Tệp khóa lưu trữ thông tin về các cơ quan đăng ký cho tất cả các gói được liệt nếu bạn sử dụng phương pháp cài đặt cũ (thông thường). sợi CHỈ kê ⚠️ Hãy nhớ rằng “ ” dường như đang lưu trữ các gói trong bộ đệm cục bộ và cung cấp liên kết đến các tệp khóa của bạn: Zero Installs Điều này có thể quan trọng đối với bạn nếu bạn có đường dẫn hoặc nơi bạn cài đặt các phần phụ thuộc trong một môi trường sạch và sau đó muốn chuyển nó sang môi trường khác (bạn sẽ phải sao chép cả thư mục và bộ đệm cục bộ). Dockerfile CI .yarn Vì phương pháp mặc định cho sợi hiện nay là “ ” và có hiệu suất tốt hơn phương pháp cũ - chúng tôi sẽ chỉ ghi lại điểm chuẩn bằng phương pháp này. Không cài đặt Tạo tập tin khóa mà không cần bất kỳ bộ đệm nào Phải mất để tạo tệp và cài đặt các phần phụ thuộc mà không cần bộ nhớ đệm. 16,5 giây sợi yarn.lock Lệnh được sử dụng: yarn install Cài đặt phụ thuộc từ các tệp khóa hiện có mà không cần bất kỳ bộ đệm nào Phải mất để cài đặt các phần phụ thuộc bằng phương pháp "Không cài đặt" và không có bất kỳ bộ nhớ đệm nào. 11 giây sợi Lệnh được sử dụng: yarn install --frozen-lockfile Cài đặt phụ thuộc từ các tệp khóa hiện có với bộ đệm chung Phải mất để cài đặt các phần phụ thuộc bằng phương pháp “Không cài đặt” và bộ nhớ đệm chung. 8 giây sợi Lệnh được sử dụng: yarn install --frozen-lockfile Quản lý không gian làm việc Tôi có thể tạo và quản lý các phần phụ thuộc cho tất cả các dự án cùng một lúc và cho các dự án cụ thể một cách riêng biệt. một không gian làm việc Các tính năng của không gian làm việc mà tôi đã sử dụng cho đến nay: Cài đặt các phần phụ thuộc cho tất cả các dự án trong không gian làm việc. Cài đặt các phần phụ thuộc cho một dự án cụ thể. Chạy đệ quy một tập lệnh cho tất cả các dự án cùng một lúc. Tài liệu này ổn, nhưng tên lệnh và cờ hơi khó hiểu. Ví dụ: tôi phải thực thi điều này để chạy tập lệnh trong dự án ( ) và lồng nhau : test root . b2b yarn workspaces foreach -A --include '{.,b2b}' run test So sánh với : npm npm run test --workspace=b2b --include-workspace-root pnpm hiện đang được quảng cáo rầm rộ - . pnpm rất nhiều công ty và dự án nguồn mở sử dụng nó Giống như - không đi kèm với trình cài đặt , vì vậy bạn phải cài đặt riêng. Điều đó có nghĩa là sẽ có một bước bổ sung trong quy trình của bạn - bạn sẽ phải thiết lập trước khi cài đặt các phần phụ thuộc dự án của mình. sợi pnpm Node.js CI pnpm Quản lý phụ thuộc được coi là … pnpm “ ” Trình quản lý gói nhanh, hiệu quả về dung lượng ổ đĩa Thật vậy, tôi đồng ý với tuyên bố về mặt quản lý các phần phụ thuộc cục bộ. “hiệu quả về dung lượng ổ đĩa” Theo mặc định, loại bỏ các phần phụ thuộc được chia sẻ trùng lặp. tạo liên kết tượng trưng cho các gói được sử dụng trong nhiều phần phụ thuộc. tức là, nếu gói và sử dụng gói làm phụ thuộc - sẽ lưu gói dưới dạng một bản sao duy nhất và tạo liên kết tượng trưng cho gói và . Bằng cách đó, trình quản lý gói không tạo bản sao cứng và tiết kiệm bộ nhớ trên ổ SSD/HDD của bạn. pnpm pnpm a b c pnpm c a b ℹ️ không lưu trữ thông tin về việc đăng ký các gói được liệt kê. pnpm-lock.yaml ⚠️ Hãy nhớ rằng đôi khi lưu trữ các phần phụ thuộc trong bộ đệm chung, thay vì giữ nó như một dự án. pnpm Tạo pnpm-lock.yaml mà không cần bất kỳ bộ đệm nào Phải mất để tạo và cài đặt các phần phụ thuộc mà không cần bất kỳ bộ đệm nào. 31 giây pnpm pnpm-lock.yaml Lệnh được sử dụng: pnpm install Cài đặt phụ thuộc từ pnpm-lock.yaml mà không cần bộ đệm chung Phải mất để cài đặt các phần phụ thuộc từ mà không cần bộ đệm. 16 giây pnpm pnpm-lock.yaml Lệnh được sử dụng: pnpm i --frozen-lockfile Cài đặt phụ thuộc từ tệp khóa hiện có với bộ đệm chung Phải mất để cài đặt các phần phụ thuộc từ với bộ đệm chung. 5 giây pnpm pnpm-lock.yaml Lệnh được sử dụng: pnpm i --frozen-lockfile Quản lý không gian làm việc Bây giờ, đó là lúc mọi thứ trở nên thực sự thú vị… có rất nhiều tùy chọn cấu hình, nhưng một số chức năng cốt lõi không hoạt động! pnpm Hãy xem lại một số lỗi mà tôi gặp phải: cài đặt pnpm --filter Điều quan trọng là chỉ có thể cài đặt các phần phụ thuộc cho các dự án cụ thể -- điều này khá hữu ích cho monorepos khi bạn tạo các quy trình liên quan đến các dự án cụ thể trong không gian làm việc. tức là, hãy tưởng tượng bạn có trong không gian làm việc của mình: một ứng dụng web, máy chủ phụ trợ, dự án thử nghiệm (thử nghiệm từ đầu đến cuối). Tất cả đều là các dự án riêng biệt, nhưng chúng là một phần của cùng một repo ☝️ npm Bây giờ, bạn muốn một quy trình chỉ chạy thử nghiệm từ đầu đến cuối. Vì vậy, bạn chỉ cần kiểm tra phụ thuộc end-to-end, phải không? Chà, bạn sẽ không thể làm điều đó - đang buộc bạn phải cài đặt các phần phụ thuộc cho toàn bộ không gian làm việc! pnpm lẽ ra chỉ cài đặt các phần phụ thuộc cho các dự án đã chọn, nhưng nó không hoạt động. pnpm install --filter <project-name> Có một lỗi đã xảy ra một năm và gần đây nó đã được đóng lại bằng một bản sửa lỗi không hoạt động. đệ quy-cài đặt=false theo mặc định, cài đặt các phần phụ thuộc cho toàn bộ không gian làm việc (tất cả các dự án) khi bạn chạy pnpm pnpm install Bạn có thể thay thế hành vi này nếu bạn đặt trong trong thư mục gốc của không gian làm việc. recursive-install=false .npmrc NHƯNG . nó lại giới thiệu một lỗi khác đã gần 2 năm rồi Shared-workspace-lockfile=false theo mặc định lưu trữ danh sách phụ thuộc trong một tệp khóa duy nhất (giống như và ). pnpm npm sợi Bạn cũng có thể thay thế hành vi này nếu bạn đặt trong trong thư mục gốc của không gian làm việc của mình. shared-workspace-lockfile=false .npmrc Điều đó sẽ cho phép chúng tôi giữ lại tính năng không gian làm việc và sử dụng cờ để cài đặt các phần phụ thuộc cho một dự án cụ thể. --ignore-workspace Dù sao, cài đặt này có thêm một số vấn đề: và gây ra lỗi trong quy trình của tôi. eslint tsc --noEmit "JavaScript hết bộ nhớ" Hành động GitHub Một số phần phụ thuộc được lưu trữ trong bộ đệm chung và được liên kết tượng trưng trong . node_modules/.pnpm Kết quả so sánh hiệu suất # npm sợi pnpm Tạo một tập tin khóa 60 giây 16,5 giây 31 giây Cài đặt phụ thuộc mà không cần bất kỳ bộ đệm nào 18 giây 11 giây 8 giây Cài đặt phụ thuộc với bộ đệm chung 8 giây 8 giây 5 giây Theo điểm chuẩn ở trên, là trình quản lý gói chậm nhất ☝️ npm Dù sao đi nữa, hãy giải thích những kết quả này… Tạo một tập tin khóa Đó là một trường hợp hiếm hoi. Thông thường, một tệp khóa được tạo khi khởi tạo dự án và sau đó mở rộng khi bạn cài đặt/cập nhật gói. Với ý nghĩ đó - có vẻ như đây không phải là điều quá quan trọng để bạn dựa vào khi chọn trình quản lý gói. Cài đặt phụ thuộc Trong hầu hết các trường hợp, dự án của bạn giữ một danh sách phụ thuộc cụ thể và bạn hiếm khi thêm/xóa thứ gì đó. Rất có thể, đôi khi bạn sẽ thay đổi các phiên bản gói của mình - những thay đổi này rất nhỏ và bạn sẽ sử dụng lại các gói còn lại từ bộ đệm. Nói cách khác, trường hợp sử dụng phổ biến là -- tìm nạp các gói mới từ sổ đăng ký gói và lấy phần còn lại từ bộ đệm. (5-8 giây) nhanh gần gấp đôi so với (8-18 giây) với (8-11 giây) ở giữa. pnpm npm sợi Phần kết luận Sự kiện thực sự là - điều này khá rõ ràng trong bài đánh giá hiện tại! pnpm một trình quản lý gói “nhanh và hiệu quả về ổ đĩa” Tính năng không gian làm việc bị lỗi và một số lỗi vẫn chưa được khắc phục trong nhiều năm. pnpm cả và đều yêu cầu thiết lập bổ sung trong đường ống CI, trong khi thì không. pnpm sợi npm cả và đều không lưu trữ thông tin đăng ký gói trong tệp khóa của chúng, trong khi thì có. pnpm sợi npm Suy nghĩ của tác giả Tôi nghĩ thực hiện công việc tốt nhất nếu yêu cầu của bạn đối với trình quản lý gói chỉ đơn giản như “chỉ cài đặt phần phụ thuộc”. pnpm Mặc dù không đi kèm với trình cài đặt sẵn có, nhưng bạn vẫn có thể dễ dàng thiết lập trong quy trình CI bằng hoặc . pnpm Node.js corepack hành động hiện có Tôi thích hơn, bởi vì: npm nó ổn định (đặc biệt là không gian làm việc), đi kèm với và không yêu cầu thiết lập bổ sung trong quy trình CI, Node.js lưu trữ các cơ quan đăng ký gói trong để bạn có thể cài đặt các phần phụ thuộc với một phạm vi duy nhất từ các cơ quan đăng ký khác nhau. package-lock.json Những ưu điểm này vượt xa số giây về tốc độ và dung lượng ổ đĩa mà tôi tiết kiệm được bằng hoặc . sợi pnpm Tiêu chí của bạn để chọn một người quản lý gói là gì? Đừng ngại ngùng và hãy cho tôi biết suy nghĩ của bạn trong phần bình luận bên dưới! 👇 😊