Yarn là một trong những trình quản lý gói (package manager) phổ biến và mạnh mẽ nhất trong hệ sinh thái JavaScript hiện nay. Yarn ra đời nhằm cải thiện những hạn chế của npm như tốc độ cài đặt chậm, lỗi xung đột phiên bản hay thiếu tính ổn định. Với khả năng xử lý nhanh, ghi nhớ dependency hiệu quả, cùng hệ thống quản lý lockfile, Yarn giúp kiểm soát thư viện dễ dàng hơn. Cùng tìm hiểu chi tiết Yarn là gì qua bài viết sau.
Đọc bài viết sau để được giải đáp chi tiết hơn về:
- Yarn là gì? Tại sao nên dùng package manager trong JS?
- Yarn Modern (Yarn Berry) là gì? có tính năng và ưu điểm gì?
- Cách cài đặt và kiểm tra các phiên bản của Yarn
- So sánh Yarn và npm
- Các lệnh cơ bản và nâng cao với Yarn
- Một số thao tác cơ bản với Yarn.
Yarn Package Manager là gì?
Yarn là một trình quản lý gói (package manager) tương tự như npm. Yarn được khởi xướng bởi Facebook và hiện tại đã được mã nguồn mở. Lý do ra đời của Yarn là để cải thiện các vấn đề về hiệu năng và bảo mật mà npm thời điểm đó gặp phải.
Nếu bạn đã quen dùng npm trong các dự án, thì việc chuyển sang Yarn rất đơn giản. Các lệnh của Yarn gần giống với npm, nên việc làm quen không tốn nhiều thời gian. Cả hai đều sử dụng chung file package.json, vì vậy bạn có thể chuyển sang Yarn mà không cần thay đổi cấu trúc dự án hiện tại.
Tại sao cần sử dụng Package Manager trong JavaScript?
Giả sử không có trình quản lý gói (package manager), thì bạn sẽ phải tự làm thủ công tất cả những việc sau:
- Tìm đúng các gói phù hợp cho dự án của mình.
- Kiểm tra xem các gói đó có lỗ hổng bảo mật nào đã được biết chưa.
- Tải các gói về máy.
- Cài đặt vào đúng vị trí trong hệ thống.
- Theo dõi các bản cập nhật mới của từng gói.
- Nâng cấp từng gói mỗi khi có phiên bản mới.
- Gỡ bỏ những gói không còn sử dụng nữa.
Việc tự quản lý hàng chục, thậm chí hàng trăm gói như vậy rất tốn thời gian và dễ gây mệt mỏi. Chính vì thế, các trình quản lý gói như NPM, pNPM, Bower và Yarn ra đời để tự động hóa và đơn giản hóa quá trình quản lý gói, giúp lập trình viên không phải làm mọi thứ bằng tay.
Yarn Modern là gì?
Yarn Modern (trước đây thường được gọi là Yarn Berry từ v2 đến v3), hay còn gọi là Yarn Berry, là phiên bản hiện đại của package manager Yarn (từ v2 trở đi). Phiên bản này thay đổi hoàn toàn cách quản lý dependencies bằng cách loại bỏ hoàn toàn thư mục node_modules.
Ra mắt năm 2020 như một bản viết lại hoàn chỉnh của Yarn Classic, Yarn Berry thay thế hàng nghìn tệp trong node_modules bằng file .pnp.cjs (có thể có một số file phụ trợ khác)một tệp duy nhất .pnp.cjs. Tệp này đóng vai trò ánh xạ vị trí lưu trữ các package. Cách tiếp cận này giúp giảm số lượng thao tác ghi/đọc ổ đĩa và hỗ trợ các tính năng mạnh mẽ như zero-installs (commit trực tiếp dependencies vào git).
Tính đến năm 2025, Yarn đã phát triển lên phiên bản 4+ (nay gọi là “Yarn Modern”) với tốc độ nhanh hơn, engine kiểm tra ràng buộc (constraints) viết bằng JavaScript, cùng khả năng tích hợp Node.js tốt hơn thông qua Corepack.
Một số điểm nổi bật của Yarn Modern có thể kể đến như:
- Plug’n’Play (PnP): Điểm cải tiến lớn nhất là hệ thống Plug’n’Play (PnP), thay thế thư mục node_modules truyền thống bằng file .pnp.cjsmột tệp duy nhất .pnp.cjs. Tệp này hoạt động như một bảng tra cứu (lookup table), giúp quá trình resolve dependencies nhanh hơn và hỗ trợ các tính năng như zero-installs (commit dependencies trực tiếp vào version control).
- Zero-installs: Cho phép commit toàn bộ dependencies vào version control (Git), giúp dự án có thể chạy ngay sau khi clone mà không cần chạy yarn install.
- Hiệu năng cải thiện: Nhờ PnP và nhiều tối ưu khác, Yarn Berry nhanh và hiệu quả hơn đáng kể so với Yarn Classic.
- Quản lý workspace: Cung cấp khả năng quản lý nhiều workspace trong cùng một dự án tốt hơn, đặc biệt hữu ích cho các ứng dụng lớn và phức tạp.
- Tính năng mới: Bao gồm constraints engine (cho phép định nghĩa quy tắc cho dự án) và hệ thống plugin – các tính năng chỉ có trên Yarn Berry.
- Tương thích linh hoạt: Dù PnP là điểm nổi bật, Yarn Berry vẫn hỗ trợ cài đặt kiểu node_modules truyền thống và cơ chế cache theo địa chỉ nội dung tương tự pnpm cho những ai cần.
- Cấu hình hiện đại: Sử dụng định dạng tệp cấu hình mới .yarnrc.yml, khác với Yarn Classic.
Lợi ích nổi bật của Yarn trong quản lý gói là gì?
Một số công dụng nổi bật của Yarn trong quá trình quản lý gói (package management) như sau:
- Cài đặt dự đoán được: Yarn khóa chính xác phiên bản và mã kiểm tra (checksum) của các gói, giúp tránh tình trạng dự án chạy tốt ở môi trường dev nhưng bị lỗi ở production do các thay đổi nhỏ trong phiên bản phụ thuộc.
- Offline Mode: Yarn tự động lưu cache các gói đã tải về, cho phép bạn cài lại các phụ thuộc ngay cả khi không có internet. Điều này rất hữu ích khi làm việc ở nơi không có mạng (như trên máy bay), hoặc khi registry bị gián đoạn.
- Cài đặt nhanh hơn: Khác với các trình quản lý cũ cài từng gói một, Yarn tải nhiều gói cùng lúc, giúp tăng tốc quá trình cài đặt, đặc biệt là với những dự án lớn.
- Độ tin cậy cao hơn: Nếu việc tải một gói bị lỗi do mạng, Yarn sẽ tự động thử lại với các nguồn thay thế, thay vì dừng toàn bộ quá trình. Điều này rất quan trọng trong các hệ thống CI/CD và triển khai tự động.
- Ổn định lâu dài: Một khi đã cài đặt thành công, Yarn đảm bảo dự án của bạn sẽ tiếp tục hoạt động ổn định trong tương lai, không lo bị thay đổi bất ngờ do dependency bị cập nhật.
Để minh họa khả năng hoạt động ngoại tuyến (offline) của Yarn, hãy thử xóa và cài lại các gói phụ thuộc mà không cần kết nối internet như sau:
rm -rf node_modules
yarn install --offline
Kết quả hiển thị:
yarn install v1.22.22
[1/4] 🔍 Resolving packages...
[2/4] 🚚 Fetching packages...
[3/4] 🔗 Linking dependencies...
[4/4] 🔨 Building fresh packages...
✨ Done in 0.26s.
Quá trình cài đặt diễn ra cực kỳ nhanh vì Yarn sử dụng các gói đã được lưu trong bộ nhớ đệm (cache), không cần tải lại từ internet. Tính năng này giúp tăng tốc đáng kể các quy trình CI/CD và triển khai tự động, nơi việc tiết kiệm thời gian và đảm bảo độ ổn định là rất quan trọng.
Làm thế nào để cài đặt Yarn? Cách kiểm tra phiên bản Yarn được cài đặt như thế nào?
Nếu trước đây bạn thường cài Yarn thông qua npm, thì từ Yarn 2 trở đi, cách này đã không còn được khuyến nghị nữa. Thay vào đó, Yarn hiện được quản lý thông qua Corepack – công cụ đi kèm Node.js giúp bạn cài đặt và sử dụng đúng phiên bản Yarn cho từng dự án.
Đầu tiên, bạn tiến hành cài đặt corepack (nếu chưa có) và bật tính năng này:
npm install corepack --global
corepack enable
Sau đó, dùng yarn set version stable để lựa chọn phiên bản Yarn phù hợp:
cd projects/my-project # chọn đường dẫn dự án
yarn set version stable
yarn install
Để tiến hành kiểm tra Yarn đã được cài đặt trên hệ thống, bạn tiến hành chạy lệnh: yarn -v
Lệnh cài đặt gói bằng Yarn, để cài đặt một gói bất kỳ, bạn sử dụng cú pháp:
yarn add package-name
Giả sử bạn muốn cài đặt một phiên bản cụ thể của gói, hãy thêm @[số-phiên-bản] vào sau tên gói, ví dụ:
yarn add package-name@4.14.1
Ngoài ra, nếu bạn chỉ dùng gói đó cho mục đích phát triển hoặc kiểm thử (development và testing), hãy dùng tùy chọn –dev như sau:
yarn add package-name --dev
Sau khi chạy các lệnh trên, Yarn sẽ tự động tạo 3 thành phần trong thư mục gốc của dự án:
- Thư mục
node_modules
chứa toàn bộ mã nguồn của các gói đã cài. - Tập tin
package.json
để quản lý danh sách các gói và cấu hình dự án. - Tập tin
yarn.lock
giúp đảm bảo các gói được cài đúng phiên bản trên mọi môi trường.
Một số lệnh cơ bản khi sử dụng Yarn
Dưới đây là danh sách các câu lệnh thường được sử dụng phổ biến trong Yarn:
Lệnh Yarn | Chức năng |
Yarn add | Thêm các gói phụ thuộc vào dự án |
Yarn bin | Lấy đường dẫn đến file script dạng nhị phân |
Yarn cache clean | Xóa các tệp cache được chia sẻ |
Yarn config | Hiển thị cấu hình hiện tại |
Yarn config get | Đọc một giá trị cấu hình |
Yarn config set | Thay đổi một giá trị cấu hình |
Yarn config unset | Xóa một thiết lập cấu hình |
Yarn dedupe | Gộp các gói phụ thuộc trùng nhau trong phạm vi phiên bản chồng lặp |
Yarn dlx | Chạy một gói trong môi trường tạm thời |
Yarn exec | Thực thi một lệnh shell |
Yarn explain | Giải thích mã lỗi |
Yarn explain peer-requirements | Giải thích các yêu cầu phụ thuộc ngang hàng |
Yarn info | Xem thông tin liên quan đến gói |
Yarn init | Tạo một package mới |
Yarn install | Cài đặt các gói phụ thuộc cho dự án |
Yarn link | Kết nối một dự án local với dự án khác |
Yarn node | Chạy Nodejs với các hook đã được thiết lập |
Yarn npm audit | Kiểm tra lỗ hỏng bảo mật trong các gói đã cài |
Yarn pack | Tạo file .tgz từ workspace hiện tại |
Yarn patch | Chuẩn bị một gói để sửa đổi (patch) |
Yarn patch-commit | Tạo bản vá từ một thư mục |
Yarn rebuild | Biên dịch lại các gói native của dự án |
Yarn remove | Gỡ bỏ các gói phụ thuộc khỏi dự án |
Yarn run | Chạy một script được định nghĩa trong package.json |
Yarn set resolution | Áp dụng một phiên bản cụ thể cho gói phụ thuộc |
Yarn set version | Khóa phiên bản Yarn được sử dụng trong dự án |
Yarn set version from sources | Biên dịch Yarn từ mã nguồn (nhánh master) |
Yarn stage | Thêm tất cả file liên quan đến Yarn vào hệ thống quản lý version (VCS) |
Yarn unlink | Ngắt kết nối dự án local khỏi một dự án khác |
Yarn unplug | Ép giải nén một danh sách gói cụ thể |
Yarn up | Nâng cấp các gói phụ thuộc trong toàn bộ dự án |
Yarn why | Hiển thị lý do tại sao một gói lại được cài đặt |
Câu lệnh constraints-related
Yarn constraints | Kiểm tra xem dự án có tuân thủ các ràng buộc (constraints) hay không |
Yarn constraints query | Truy vấn cơ sở dữ liệu ràng buộc |
Yarn constraints source | In ra mã nguồn của các ràng buộc hiện tại |
Một số câu lệnh liên quan về npm
Yarn npm info | Hiển thị thông tin về một gói |
Yarn npm login | Lưu thông tin đăng nhập mới để truy cập vào registry của npm |
Yarn npm logout | Đăng xuất khỏi registry của npm |
Yarn npm publish | Đăng tải workspace hiện tại lên registry của npm |
Yarn npm tag add | Thêm một thẻ (tag) cho một phiên bản cụ thể của gói |
Yarn npm tag list | Liệt kê tất cả các thẻ (dist-tags) của một gói |
Yarn npm tag remove | Xóa một thẻ khỏi gói |
Yarn npm whoami | Hiển thị tên người dùng hiện tại đã đăng nhập |
Phân biệt: Yarn và npm trong JavaScript khác nhau như thế nào?
Trong JavaScript, npm (Node Package Manager) và Yarn là hai công cụ được sử dụng rộng rãi để quản lý các dự án JavaScript. Đây là những công cụ không thể thiếu để quản lý thư viện phụ thuộc một cách hiệu quả và đảm bảo khả năng mở rộng của dự án.
npm sẽ tải các thư viện phụ thuộc từ npm registry mỗi lần bạn chạy lệnh npm install, trong khi yarn sẽ lưu các thư viện này vào bộ nhớ đệm (cache) và lấy từ ổ đĩa khi bạn dùng lệnh yarn add.
Cả npm và yarn đều là trình quản lý gói cho JavaScript, nhưng chúng có một vài điểm khác biệt như được liệt kê trong bảng dưới đây:
Yếu tố | npm | yarn |
Tốc độ cài đặt | Cài đặt song song, nhưng chủ yếu vẫn dùng node_modules và cache ở mức cơ bản | Nhanh hơn nhờ cài đặt song song |
Phụ thuộc | Kém ổn định | Ổn định hơn |
Offline | Hỗ trợ hạn chế | Hỗ trợ đầy đủ |
Bảo mật | npm audit có sẵn; từ npm 7 kiểm tra SHA-512 và có biện pháp bảo mật tương đương Yarn | Kiểm tra nâng cao |
Tệp lock mặc định | package-lock.json | yarn.lock |
Cài đặt phụ thuộc | npm install | npm install |
Cài đặt gói | npm install package_name@version_number | yarn add package_name@version_number |
Thông tin package | npm view package_name | yarn info package_name |
Ví dụ: Cài đặt gói axios bằng npm và sau đó bằng yarn. Thư viện axios là một thư viện JavaScript được dùng để thực hiện các yêu cầu HTTP từ trình duyệt hoặc từ Node.js.
- Để cài đặt thư viện axios bằng npm, bạn cần chạy lệnh sau: npm install axios
- Tương tự, để cài đặt axios bằng yarn, bạn chạy: yarn add axios
Kết quả hiển thị khi chạy đoạn mã bằng npm
Kết quả hiển thị khi chạy đoạn mã bằng yarn
Các câu hỏi thường gặp về Yarn
Tại sao nên nâng cấp lên Yarn Modern?
Mặc dù Yarn Classic (phiên bản 1.x) vẫn là một phần quan trọng trong hệ sinh thái JavaScript, nhưng nếu có thể, bạn nên nâng cấp lên Yarn Modern.
- Yarn Modern còn bổ sung nhiều công cụ mạnh mẽ như yarn dlx, patch: protocol tích hợp sẵn, cùng với hệ thống plugin mở rộng hỗ trợ quản lý thay đổi (changesets), ràng buộc (constraints), workspaces nâng cao.
- Yarn Modern áp dụng chiến lược cài đặt mới giúp dự án “nhẹ” hơn đáng kể. Ví dụ, với cấu hình mặc định, dự án CRA (Create React App) chỉ chiếm 45MB thay vì 237MB như trước.
- Kiến trúc mới cho phép bạn tự xây dựng và bổ sung tính năng riêng theo nhu cầu, không cần phải chờ nhóm phát triển chính thức cập nhật.
- Yarn Modern được xây dựng dựa trên kinh nghiệm nhiều năm duy trì Yarn Classic. Nhờ đó, những bất cập cũ đã được khắc phục, quy trình xử lý dependency được tinh gọn và xử lý dữ liệu hiệu quả hơn.
- Yarn Modern được thiết kế để linh hoạt hơn, dễ cập nhật hơn và có thể phát triển tính năng mới nhanh hơn bao giờ hết.
Yarn có phải do Facebook phát triển không?
Câu trả lời là Không. Mặc dù phiên bản đầu tiên của Yarn được phát triển bởi Sebastian McKenzie khi anh đang làm việc tại Facebook, thiết kế ban đầu của dự án đã nhận được phản hồi từ nhiều công ty khác (chẳng hạn như Tilde thông qua Yehuda Katz), và dự án sau đó được chuyển sang một tổ chức riêng trên GitHub.
Facebook vẫn tiếp tục đầu tư vào Yarn trong những năm tiếp theo (chủ yếu vì nó trở thành một phần quan trọng trong hệ sinh thái React Native), nhưng các đóng góp chính lại đến từ cộng đồng mã nguồn mở. Ngày nay, nhóm phát triển Yarn hoạt động tích cực đều là những người làm việc tại các công ty không phải là nhà sáng lập. Nhân viên của Facebook vẫn luôn được chào đón nếu muốn đóng góp cho dự án, nhưng các đóng góp đó sẽ phải trải qua quy trình đánh giá như bất kỳ ai khác.
Chuyển đổi từ Yarn Classic sang Yarn Modern cần lưu ý điều gì?
Thông thường, bạn sẽ cần xử lý một vài điểm chính sau:
- Định dạng thiết lập đã thay đổi. Yarn không còn đọc các tệp .npmrc hoặc .yarnrc nữa, mà sẽ sử dụng thiết lập từ tệp .yarnrc.yml.
- Một số gói bên thứ ba không liệt kê đầy đủ các phụ thuộc của chúng và sẽ cần được “hỗ trợ” thông qua phần thiết lập packageExtensions.
- Hỗ trợ cho các trình soạn thảo văn bản hiện khá tốt, nhưng bạn cần chạy phần thiết lập một lần duy nhất được liệt kê trong tài liệu SDK.
- Một số công cụ (chủ yếu là React Native và Flow) sẽ yêu cầu bạn chuyển về chiến lược cài đặt node_modules bằng cách thiết lập nodeLinker thành node-modules. TypeScript thì không gặp vấn đề này.
Làm sao để chia sẻ script giữa các workspace trong Yarn?
Bất kỳ script nào có dấu hai chấm (:) trong tên (ví dụ: build:foo) đều có thể được gọi từ bất kỳ workspace nào. Một tính năng ít người biết khác của Yarn là biến môi trường $INIT_CWD luôn trỏ tới thư mục ban đầu nơi script được chạy.
Kết hợp 2 tính năng này, bạn có thể viết các script dùng chung như sau:
{
"dependencies": {
"typescript": "^3.8.0"
},
"scripts": {
"g:tsc": "cd $INIT_CWD && tsc"
}
}
Sau đó, từ bất kỳ workspace nào có tsconfig.json riêng, bạn đều có thể gọi TypeScript bằng lệnh:
{
"scripts": {
"build": "yarn g:tsc"
}
}
Hoặc nếu bạn chỉ muốn chạy tsc từ workspace gốc:
{
"scripts": {
"build": "run -T tsc"
}
}
Hoặc nếu bạn muốn chạy một script nằm trong thư mục gốc của dự án:
{
"scripts": {
"build": "node ${PROJECT_CWD}/scripts/update-contributors.js"
}
}
Tổng kết về Yarn
Yarn là công cụ không thể thiếu nếu bạn muốn xây dựng các dự án JavaScript một cách hiện đại, nhanh chóng và ổn định hơn. Từ những bước cài đặt đầu tiên cho đến việc sử dụng các lệnh cơ bản, Yarn mang đến trải nghiệm mượt mà và đáng tin cậy hơn hẳn so với nhiều công cụ khác.
Hy vọng với hướng dẫn chi tiết trong bài viết này, bạn đã sẵn sàng chuyển sang Yarn hoặc khai thác tối đa tiềm năng của nó trong công việc lập trình hàng ngày.
Xem thêm: JavaScript là gì? Học JavaScript cơ bản với lộ trình dễ hiểu nhất