Package Manager là gì? Nên sử dụng npm hay Yarn cho dự án?

 

So sánh npm và Yarn

Trong hướng dẫn này, chúng ta sẽ so sánh Yarn và npm - hai trình quản lý gói (package manager) phổ biến nhất. Chúng ta sẽ đặt chúng cạnh nhau và khám phá những lợi ích và bất lợi tương ứng của chúng để giúp bạn nên chọn cái nào cho các dự án của mình.

Package Manager là gì?

Nhớ lại ngày xưa, một trình soạn thảo văn bản đơn giản là đủ cho các nhà phát triển tạo lập và quản lý phần lớn các dự án của mình. Nhưng đến nay, Web đã thay đổi mạnh mẽ. Ngày nay, ngay cả một dự án khá đơn giản cũng có hàng trăm hoặc hàng nghìn tập lệnh, với các phụ thuộc (dependency) lồng vào nhau một cách phức tạp, đơn giản là không thể quản lý nếu không có một số loại công cụ tự động. Và đây là nơi mà các trình quản lý gói (package manager) vào cuộc.

Package manager là một công cụ tự động xử lý các phần phụ thuộc (dependency) của dự án theo nhiều cách khác nhau. Ví dụ: với sự trợ giúp của trình quản lý gói, chúng ta có thể cài đặt, gỡ cài đặt, cập nhật và nâng cấp gói, xác định cấu hình cài đặt của dự án, chạy tập lệnh, v.v. Tất cả công việc khó khăn và tẻ nhạt đều do trình quản lý gói thực hiện, chỉ để lại cho chúng ta phần thú vị - coding.

npm là viết tắt của Node Package Manager. Công cụ được phát hành tận từ năm 2010, và khởi đầu một kỷ nguyên mới trong công nghệ phát triển web. Cho đến lúc đó, các phần phụ thuộc của dự án được tải và quản lý theo cách thủ công. npm là cây đũa thần đã đẩy Web lên một tầm cao mới.

npm gồm 3 phần chính:

  • website quản lý các mặt về npm
  • registry giúp truy cập cơ sở dữ liệu gói JavaScript công cộng đa dạng
  • command-line interface (CLI) Giao Diện Dòng Lệnh tương tác với npm thông qua terminal 

Tuy nhiên, khi hầu hết mọi người nói về npm, họ thường nhắc đến thành phần cuối cùng - công cụ CLI. CLI có sẵn dưới dạng trình quản lý gói mặc định với mỗi lần cài đặt Node mới. Điều này có nghĩa là bạn có thể bắt đầu sử dụng nó ngay lập tức.

Yarn là viết tắt của Yet Another Resource Negotiator. Trình quản lý gói Yarn là một giải pháp thay thế cho npm, được Facebook phát hành vào tháng 10 năm 2016. Mục tiêu ban đầu của Yarn là giải quyết các nhược điểm của npm, chẳng hạn như các vấn đề về hiệu suất và bảo mật. Yarn nhanh chóng được định vị là một công cụ an toàn, nhanh chóng và đáng tin cậy giúp quản lý phần phụ thuộc của JavaScript.

Nhưng nhóm npm đã học được bài học của mình và nhanh chóng lấp đầy khoảng trống của npm bằng cách triển khai các tính năng còn thiếu.

Hãy điểm qua mốt số mốc thời gian để xem thử thay đổi gì đã diễn ra nhé:

  • 2010: npm được phát hành hỗ trợ cho Node.
  • 2016: Yarn được phát hành. Nó cho thấy hiệu suất lớn hơn nhiều so với npm. Nó cũng tạo ra một tệp yarn.lock giúp chia sẻ và sao chép chính xác các bản sao của repos một cách dễ dàng và dễ đoán hơn nhiều.
  • 2017: npm 5 được phát hành. Nó cung cấp tính năng tự động tạo tệp package-lock.json tương tứng cho yarn.lock.
  • 2018: npm 6 được phát hành với bảo mật được cải thiện. Bấy giờ npm đã có thể kiểm tra các lỗ hổng bảo mật trước khi các phần phụ thuộc được cài đặt.
  • 2020: Yarn 2 và npm 7 được phát hành. Cả hai gói đều đi kèm với các tính năng mới tuyệt vời, như chúng ta sẽ thấy ở phần sau của hướng dẫn này.
  • 2021: Yarn 3 được phát hành với nhiều cải tiến khác nhau.

Ngày nay, cả hai trình quản lý gói này đều là những người cùng tham gia cuộc đua quản lý gói, cung cấp các tính năng và khả năng tương tự nhau. Nhưng vẫn có một số khác biệt giúp chúng ta xác định nên sử dụng công cụ nào.

Trong phần còn lại của hướng dẫn này, chúng ta sẽ khám phá những điểm tương đồng và khác biệt chính giữa npm và Yarn.

Yarn vs npm: So sánh cài đặt

Chúng ta sẽ bắt đầu phần so sánh bằng quá trình cài đặt cho cả npm và Yarn.

Phần chính: trình quản lý gói

Như đã nhắc đến ở trên, npm được cài đặt sẵn với Node, vì vậy không cần phải cài đặt npm theo cách thủ công.

Ngược lại, Yarn cần được cài đặt riêng. Đầu tiên, chúng ta cần cài đặt Yarn ở cấp global:

npm install -g yarn

Sau đó, chúng ta có thể sử dụng nó trên theo từng dự án bằng cách thiết lập phiên bản mong muốn bên trong dự án. Chúng ta thực hiện điều đó bằng cách chạy lệnh yarn set version trong thư mục gốc của dự án:

yarn set version berry

Trong trường hợp này, berry là phiên bản ta cần thiết đặt.

Nếu chúng ta muốn cập nhật lên phiên bản mới nhất, chạy lệnh:

yarn set version latest

Với Yarn, chúng ta có thể sử dụng một phiên bản khác nhau cho mỗi dự án.

Để làm tương tự với npm, chúng ta sẽ cần cài sẵn nvm (Node Version Manager). Đây là cách cài đặt nhiều phiên bản Node với nvm.

Cài đặt phần phụ thuộc cho dự án

Bây giờ, hãy xem cách cài đặt các phần phụ thuộc của dự án.

Khi chúng ta chạy npm install, các phần phụ thuộc được cài đặt lần lượt từng cái một. Log trong terminal có nhiều thông tin nhưng hơi khó đọc.

Để cài đặt các gói với Yarn, chúng ta sẽ chạy lệnh yarn. Yarn cài đặt các gói song song, đó là một trong những lý do khiến nó nhanh hơn npm. Nếu đang sử dụng Yarn 1, bạn sẽ thấy nhật ký đầu ra của sợi sạch, dễ phân biệt bằng mắt và ngắn gọn. Chúng cũng được đặt ở dạng cây để dễ hiểu. Nhưng điều này đã được thay đổi trong phiên bản 2 và 3, nơi các bản ghi không trực quan và con người có thể đọc được.

Đến đây, chúng ta đã thấy rằng npm và Yarn có các lệnh khác nhau để cài đặt các gói. Trong phần tiếp theo, chúng ta sẽ khám phá thêm các lệnh khác nữa.

So sánh lệnh của npm và Yarn

npm và Yarn có nhiều lệnh giống nhau, nhưng cũng có nhiều lệnh không giống. Đầu tiên chúng ta hãy khám phá một số lệnh giống hệt nhau:

  • npm init | yarn init: tạo gói mới
  • npm run | yarn run: chạy kịch bản được xác định trong package.json
  • npm test | yarn test: =kiểm tra một gói
  • npm publish | yarn publish: phát hành 1 gói
  • npm cache clean | yarn cache clean: xóa tất cả dữ liệu trong thư mục bộ nhớ đệm

Các lệnh này giúp việc chuyển đổi giữa hai trình quản lý trở nên dễ dàng, nhưng có một số lệnh không giống nhau có thể gây nhầm lẫn. Cùng xem thử nhé:

  • npm install | yarn: cài phần phụ thuộc
  • npm install [package] | yarn add [package]: cài đặt gói
  • npm install --save-dev [package] | yarn add - -dev [package]: cài đặt gói dưới dạng 1 phần phụ thuộc phát triển
  • npm uninstall [package] | yarn remove [package]: gỡ cài đặt một gói
  • npm uninstall --save-dev [package] | yarn remove [package]: gỡ cài đặt một gói phụ thuộc phát triển
  • npm update | yarn upgrade: cập nhật các phần phụ thuộc
  • npm update [package] | yarn upgrade [package]: update a package

Yarn cũng có một số lệnh riêng không có trong npm. Ví dụ: lệnh why hiển thị lý do tại sao một gói là cần thiết: nó có thể là một phần phụ thuộc, một mô-đun gốc hoặc một phần phụ thuộc của dự án.

Yarn vs npm: Tốc độ và hiệu năng

Bất cứ khi nào Yarn hoặc npm cần cài đặt một gói, chúng sẽ thực hiện một loạt tác vụ. Trong npm, các tác vụ này được thực hiện theo từng gói và tuần tự, có nghĩa là nó sẽ đợi một gói được cài đặt đầy đủ trước khi chuyển sang bước tiếp theo. Ngược lại, Yarn thực hiện song song các tác vụ này, giúp tăng hiệu suất.

Cả hai nhà trình quản lý này đều cung cấp cơ chế lưu vào bộ nhớ đệm, và Yarn dường như làm điều đó tốt hơn một chút. Bằng cách triển khai mô hình zero-install, như chúng ta sẽ thấy trong phần so sánh các tính năng, nó có khả năng cài đặt các gói gần như không mất thời gian. Nó lưu vào bộ nhớ cache mọi gói và lưu trên ổ đĩa, vì vậy trong lần cài đặt tiếp theo của gói này, bạn thậm chí không cần phải có kết nối internet vì gói được cài đặt ngoại tuyến từ đĩa.

Mặc dù Yarn có một số ưu điểm, nhưng tốc độ của Yarn và npm, trong các phiên bản cuối cùng của chúng, khá tương đương nhau. Vì vậy, chúng ta không thể xác định người chiến thắng rõ ràng ở đây.

Yarn vs npm: so sánh bảo mật

Một trong những phần bị chỉ trích nhiều về npm liên quan đến bảo mật. Các phiên bản npm trước đây có một vài lỗ hổng bảo mật nghiêm trọng.

Kể từ phiên bản 6, npm kiểm tra các gói trong quá trình cài đặt và cho bạn biết nếu nó tìm thấy bất kỳ lỗ hổng nào. Chúng ta có thể thực hiện việc kiểm tra này theo cách thủ công bằng cách chạy npm audit lên các gói đã cài đặt. Nếu tìm thấy bất kỳ lỗ hổng nào, npm sẽ đưa ra các khuyến nghị bảo mật.

npm audit reporting insecure packages

Như bạn có thể thấy trong ảnh chụp màn hình ở trên, chúng ta có thể chạy npm audit fix để sửa các lỗ hổng của gói và các cây phụ thuộc sẽ được sửa nếu có thể.

Cả Yarn và npm đều sử dụng cryptographic hash algorithm để đảm bảo tính toàn vẹn của các gói.

Yarn vs npm: so sánh tính năng

Cũng giống như các lệnh, một số tính năng sẽ giống nhau giữa npm và Yarn, trong khi cũng có một số khác biệt. Đầu tiên chúng ta hãy khám phá các tính năng chung mà hai trình quản lý gói này chia sẻ.

Tạo Lock File

Trong package.json, tệp mà cả npm và Yarn sử dụng để theo dõi các phần phụ thuộc của dự án, số phiên bản không phải lúc nào cũng chính xác. Thay vào đó, bạn có thể xác định một loạt các phiên bản. Bằng cách này, bạn có thể chọn một phiên bản chính và phụ cụ thể của một gói, nhưng vẫn cho phép npm cài đặt bản vá mới nhất mà có thể sửa một số lỗi.

Trong một thế giới lý tưởng của lập phiên bản ngữ nghĩa, các bản vá lỗi sẽ không bao gồm bất kỳ thay đổi đột phá nào. Nhưng thật không may, điều này không phải lúc nào cũng đúng như vậy. Chiến lược được sử dụng bởi npm có thể dẫn đến việc hai machine sẽ có cùng một tệp package.json, nhưng có các phiên bản khác nhau của một gói được cài đặt - điều này có thể sẽ gây ra lỗi.

Để tránh phiên bản gói không khớp, một phiên bản đã cài đặt chính xác được ghim xuống trong tệp khóa gói. Mỗi khi một mô-đun được thêm vào, npm và Yarn sẽ tạo (hoặc cập nhật) một tệppackage-lock.json và yarn.lock tương ứng. Bằng cách này, bạn có thể đảm bảo một máy khác cài đặt đúng cùng một gói, trong khi vẫn có một loạt các phiên bản được cho phép do tệp package.json xác định.

Sử dụng workspaces

Workspace cho phép bạn có một monorepo để quản lý các phần phụ thuộc trong nhiều dự án. Điều này có nghĩa là bạn có một gói gốc cấp cao nhất, trong đó có nhiều gói con được gọi là workspace.

Chạy Script từ xa 

Lệnh npx được sử dụng để chạy các tập lệnh từ ./node_modules/.bin. Nó cũng cho phép bạn thực thi các gói từ npm registry mà không cần cài đặt chúng trong phần phụ thuộc dự án của bạn. Ví dụ: bạn có thể tạo một ứng dụng React mới bằng cách chạy như sau:

npx create-react-app my-app

Trong Yarn, bạn có thể đạt được kết quả tương tự bằng cách sử dụng lệnh dlx tương đương:

yarn dlx create-react-app my-app

Các tính năng khác mà chúng ta sẽ khám phá sau đây sẽ chỉ có ở Yarn.

Zero installs

Zero installs lưu trữ bộ nhớ cache trong đường dẫn dự án của bạn, trong thư mục .yarn. Khi bạn sử dụng các lệnh như yarn hoặc yarn add <package>, Yarn sẽ tạo tệp .pnp.cjs. Tệp này chứa cấu trúc phân cấp cho dependency được Node sử dụng để tải các gói dự án của bạn. Vì vậy, bạn có thể truy cập chúng gần như không có thời gian.

Plug’n’Play

Plug’n’Play là một chiến lược cài đặt thay thế. Thay vì tạo đường dẫn node_modules và để việc phân giải cho Node, Yarn tạo một tệp .pnp.cjs duy nhất giúp kết nối các gói đến vị trí của chúng trên ổ đĩa và đến danh sách dependency của chúng. Tính năng này có thể giúp khởi động dự án nhanh hơn, cây dependency được tối ưu hóa tốt hơn, thời gian cài đặt nhanh hơn và tất nhiên loại bỏ sự cần thiết của thư mục node_modules.

Licenses

Yarn được đóng gói với một trình kiểm tra giấy phép tích hợp có thể hữu ích trong các tình huống khác nhau khi bạn đang phát triển ứng dụng.

Yarn vs npm: nên chọn trình quản lý gói nào

Chúng ta đã đề cập đến những điểm giống và khác nhau của npm và Yarn, nhưng vẫn chưa xác định được package manager nào tốt hơn và cái nào chúng ta nên chọn. Như mọi khi, câu trả lời phụ thuộc vào mong muốn và yêu cầu của mỗi người.

Nhìn chung, hãy đúc kết lại thành những ý sau:

  • Chọn npm nếu bạn hài lòng với quy trình làm việc hiện tại của mình, bạn không muốn cài đặt công cụ bổ sung và bạn không có nhiều dung lượng ổ đĩa.

  • Chọn Yarn nếu bạn muốn có một số tính năng tuyệt vời như Plug’n’Play, bạn cần một số chức năng bị thiếu trong npm và bạn có đủ dung lượng đĩa.

Nếu bạn vẫn khó đưa ra quyết định rõ ràng giữa npm và Yarn, thì bạn có thể xem thử pnpm, nó cố gắng kết hợp những gì tốt nhất từ cả hai trình quản lý gói và anh lớn thứ ba trong nhóm quản lý gói.

Yarn vs npm: lời kết

Chúng ta đã thấy tầm quan trọng của trình quản lý gói đối với việc lập trình web hiện nay và đã so sánh hai đối thủ phổ biến nhất trên thị trường. Cả hai đều có những ưu điểm và khuyết điểm, và để lựa chọn tốt nhất cho bạn, bạn cần phải có một ý tưởng rõ ràng về yêu cầu của mình. Cách tốt nhất để quyết định cái nào phù hợp hơn với bạn là thử cả hai và xem cái nào hoạt động tốt hơn.

Theo Sitepoint

Nhận xét

Bài đăng phổ biến