Bà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 để thay thế hoàn thế hoàn toàn npm. Nó chỉ là một công cụ để cài đặt các modules đăng ký trên npm. Không có thay đổi gì về cách đăng ký - bạn vẫn có thể cài đặt và xuất bản các package như bình thường.
Vậy mọi người có nên sử dụng yarn? Có thể bạn sẽ không bao giờ gặp phải các vấn đề với npm. Vì vậy, bài viết này sẽ so sánh npm và Yarn, để bạn có thể quyết định cái nào phù hợp 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 chúng ta sẽ nhận ra cái làm cho Yarn khác biệt.
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 cài đặt một package, nó thực hiện một chuỗi các task. Trong npm, các 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 cài đặt hoàn tất rồi mới chuyển tới cái tiếp theo. Yarn thực hiện các task song song, điều này tăng hiệu suất.
Để so sánh, tôi đã cài đặt 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 cài đặt.
- nmp: 9 giây
- Yarn: 1.37 giây
Tôi không thể tin vào mắt mình. Lặp lại các bước trên cũng mang lại kết quả tương tự. Sau đó tôi cài đặt gulp package, với 195 dependencies.
- npm: 11 giây
- Yarn: 7.81 giây
Dường như sự khác biệt phụ thuộc vào số lượng package được cài đặt. 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 <package>. 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ự khác biệt chức năng, Yarn cũng có sự khác biệt về lệnh. Một vài lệnh npm bị loại bỏ, một số 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 ls và yarn 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 <package>, yarn add <package> 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 lý do tại sao một package được cài đặt trong dự á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 và yarn upgrade.
Tính ổn định và tin cậy
Yarn nhận được nhiều issue report trong ngày đầu tiên phát hành, nhưng tỉ lệ các issue được giải quyết cũng rất đáng kinh ngạc. Cả hai điều này cho thấy, cộng đồng làm việc rất tích cực để tìm và loại bỏ các bug. Nhìn vào số lượng và kiểu issue, có thể coi Yarn đã ổn định cho phần lớn người dùng, nhưng vẫn chưa phù hợp cho một vài trường hợp đặc biệt.
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 chuyện giữa Node.js và io.js. Nhắc lại một chú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 bất đồng về quản lý dự án. io.js chọn quản trị dự án theo hướng mở. Chưa đầy một năm sau cả 2 team đã đi đến một thỏa thuận, io.js sẽ được merge trở lại vào Node.js. Điều này đã bổ sung 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ự 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 thiện nhiều hạn chế của npm. Thật tuyệt nếu npm học hỏi từ Yarn và yêu cầu Facebook, Google và những contributor khác của Yarn giúp cải thiện nó. Mặc dù còn quá sớm để nói điều này sẽ xảy ra, nhưng tôi hy 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.
Bình luận