Yarn vs npm: Mọi thứ bạn cần biết

27 tháng 07, 2017 – 11247 lượt xemBài viết được dịch từ : sitepoint.com

Yarn là một công cụ quản lý package JavaScript, được xây dựng bởi Facebook, Google, Exponent và Tilde. Mục đích của nó là giải quyết các vấn đề, mà các team ở những công ty trên đã gặp phải khi sử dụng npm, đó là:

  • Việc cài đặt các package không đủ nhanh và nhất quán.
  • Các lo ngại về bảo mật, như việc npm cho phép các package chạy code trong quá trình cài đặt.

Nhưng, yarn không cố gắng nỗ lực để sửa chữa thay thế hoàn thế trọn vẹn npm. Nó chỉ là một công cụ để thiết lập những modules ĐK trên npm. Không có biến hóa gì về cách ĐK – bạn vẫn hoàn toàn có thể setup và xuất bản những package như thông thường .Vậy mọi người có nên sử dụng yarn ? Có thể bạn sẽ không khi nào gặp phải những yếu tố với npm. Vì vậy, bài viết này sẽ so sánh npm và Yarn, để bạn hoàn toàn có thể quyết định hành động cái nào tương thích với mình nhất .

Yarn vs npm: Sự khác biệt về chức năng

Nhìn thoáng qua Yarn và npm khá giống nhau. Nhưng khi xem xét kỹ hơn tất cả chúng ta sẽ nhận ra cái làm cho Yarn độc lạ .

yarn.lock file

package.json là file mà cả npm và Yarn sử dụng để theo dõi và quản lý các dependencies của dự án, version của các dependency không phải lúc nào cũng là một số chính xác. Thay vào đó, bạn có thể định nghĩa một khoảng các version. Với cách này, bạn có thể chỉ định một phiên bản chính và phụ cho một package, nhưng vẫn cho phép npm cài đặt bản vá mới nhất có thể fix một vài bug.

Trong điều kiện lý tưởng như semantic versioning, bản vá lỗi sẽ không bao gồm bất kỳ thay đổi nào. Nhưng điều này không phải lúc nào cũng đúng. Cùng một file package.json nhưng trên hai máy khác nhau, có thể cài đặt các phiên bản khác nhau của cùng một package, điều này có thể dẫn tới các bug.

Để tránh tình trạng trên, một phiên bản chính xác được thiết lập trong lock file. Bất cứ khi nào một module được cài đặt, Yarn sẽ tạo (hoặc cập nhật) một yarn.lock file. Cách này đảm bảo các máy khác nhau cài đặt chính xác một package, trong khi vẫn có một khoảng các phiên bản đã được cho phép được định nghĩa trong package.json.

Trong npm, lệnh npm shrinkwrap sẽ tạo ra một lock file, và npm install sẽ đọc file này trước khi đọc package.json, tương tự cách Yarn đọc yarn.lock trước tiên. Điểm khác biệt quan trọng ở đây là Yarn luôn luôn tạo và cập nhật yarn.lock, trong khi npm không tạo lock file bởi mặc định và chỉ cập nhật npm-shrinkwrap.json khi nó tồn tại.

Cài đặt song song

Bất cứ khi nào npm hoặc Yarn setup một package, nó thực thi một chuỗi những task. Trong npm, những task được thực thi trên mỗi package và tuần tự, có nghĩa là nó sẽ chờ một package được setup hoàn tất rồi mới chuyển tới cái tiếp theo. Yarn triển khai những task song song, điều này tăng hiệu suất .Để so sánh, tôi đã setup express pakage sử dụng cả npm và Yarn không có shrinkwrap / lock file và đã clean cache. Với tổng số 42 package được setup .

  • nmp: 9 giây
  • Yarn: 1.37 giây

Tôi không hề tin vào mắt mình. Lặp lại những bước trên cũng mang lại tác dụng tương tự như. Sau đó tôi setup gulp package, với 195 dependencies .

  • npm: 11 giây
  • Yarn: 7.81 giây

Hình như sự độc lạ phụ thuộc vào vào số lượng package được setup. Dù thế nào đi nữa, Yarn vẫn nhanh hơn .

Kết quả rõ ràng hơn

Bởi mặc định npm rất rườm rà. Ví dụ, nó liệt kê tất cả các packages và các dependencies đã cài đặt khi chạy npm install . Yarn là một trường hợp khác, nó không liệt kê tất cả. Khi thông tin có thể thu được thông qua các lệnh khác, nó sẽ liệt kê ít thông tin hơn với các emojis phù hợp (trừ khi bạn đang sử dụng Windows).

Yarn vs npm: Khác biệt về lệnh

Ngoài sự độc lạ công dụng, Yarn cũng có sự độc lạ về lệnh. Một vài lệnh npm bị vô hiệu, 1 số ít khác được chỉnh sửa và một vài lệnh mới được thêm vào .

yarn global

Không giống npm, các cài đặt global được thực hiện với cờ -g hoặc –global, các lệnh Yarn cần bắt đầu với global.

Tiền tố global chỉ làm việc với yarn add, yarn bin, yarn lsyarn remove. Ngoại trừ yarn add, các lệnh còn lại đều tương tương với npm.

yarn install

Lệnh npm install sẽ cài đặt các dependency từ file package.json và cho phép bạn thêm các package mới. Còn yarn install chỉ cài đặt các dependency trong yarn.lock hoặc package.json theo thứ tự đó.

yarn add[-dev]

Giống như npm  install , yarn add cho phép bạn thêm và cài đặt một dependency. Nó tự động lưu một tham chiếu tới package trong file package.json, tương tự cờ –save của npm. Còn nếu thêm cờ –dev, thì sẽ thêm package như một developer dependency, giống như cờ –save-dev của npm.

yarn licenses [ls|generate-disclaimer]

Tại thời điểm viết bài, không có lệnh npm nào tương đương. yarn licenses ls liệt kê tất cả các package theo thứ tự alphabetical và licence của chúng. Còn yarn licenses generate-disclaimer sẽ trả lại danh sách các licenses đã được sắp xếp từ tất cả các package.

yarn why

Lệnh này sẽ tìm ra nguyên do tại sao một package được setup trong dự án Bất Động Sản. Bạn đã thêm nó, hay nó là một dependency của một package được bạn cài cài đặt .

yarn upgrade [package]

Lệnh này sẽ cập nhật các package tới phiên bản mới nhất được thiết lập trong file package.json và tạo lại yarn.lock file. Tương tự npm update.

Điều thú vị là khi chỉ định một package cụ thể, nó sẽ cập nhật package tới phiên bản mới nhất và cập nhật trong cả package.json

yarn generate-lock-entry

Lệnh yarn generate-lock-entry tạo ra một yarn.lock file dựa trên các dependency thiết lập trong file package.json. Tương tự với npm shrinkwrap.  Lệnh này lên được sử dụng thận trọng, vì nó tạo ra lock file và sẽ tự động cập nhật file này khi thêm hoặc cập nhật thông qua yarn add yarn upgrade.

Tính ổn định và tin cậy

Yarn nhận được nhiều issue report trong ngày tiên phong phát hành, nhưng tỉ lệ những issue được xử lý cũng rất đáng kinh ngạc. Cả hai điều này cho thấy, hội đồng thao tác rất tích cực để tìm và vô hiệu những bug. Nhìn vào số lượng và kiểu issue, hoàn toàn có thể coi Yarn đã không thay đổi cho phần nhiều người dùng, nhưng vẫn chưa tương thích cho một vài trường hợp đặc biệt quan trọng .

Chú ý rằng, mặc dù một công cụ quản lý package thường là nhân tố quan trọng trong dự án, nhưng nó chỉ là một công cụ. Nếu có điều gì đó sai, thì việc cài đặt lại các package không phải là quá khó khăn.

Tương lai

Có lẽ bạn đã biết câu truyện giữa Node. js và io.js. Nhắc lại một chút ít : io.js là một nhánh của Node. js, được tạo bởi một vài contributor chính của Node. js sau những sự không tương đồng về quản trị dự án Bất Động Sản. io.js chọn quản trị dự án Bất Động Sản theo hướng mở. Chưa đầy một năm sau cả 2 team đã đi đến một thỏa thuận hợp tác, io.js sẽ được merge trở lại vào Node. js. Điều này đã bổ trợ cho Node. js nhiều tính năng tuyệt vời .Tôi đang nhìn thấy điều tương tự như với npm và Yarn. Mặc dù Yarn không phải là một nhánh của npm, nhưng nó cải tổ nhiều hạn chế của npm. Thật tuyệt nếu npm học hỏi từ Yarn và nhu yếu Facebook, Google và những contributor khác của Yarn giúp cải tổ nó. Mặc dù còn quá sớm để nói điều này sẽ xảy ra, nhưng tôi kỳ vọng nó sẽ xảy ra .

Kết luận

Yarn  có một số điểm tốt hơn khi so sánh với npm. Chúng ta có một lock file mặc định, việc cài đặt các package cũng nhanh hơn và chúng tự động lưu trữ trong package.json. Bạn có thể thử nghiệm Yarn trên một dự án, và xem nó nó phù hợp với bạn hay không.