yarn: bản chất, trình quản lý gói thay thế cho React Native

Tác giả: IT Sectr Đã đăng: 2026-02-13 Thời gian đọc: 10 phút

yarn — một trình quản lý gói thay thế cho Node.js, được Facebook cùng với Exponent, Google và Tilde tạo ra vào năm 2016. yarn đã giải quyết các vấn đề về tốc độ và bảo mật của npm 2-4: cài đặt song song, tệp lock nghiêm ngặt và bộ nhớ đệm ngoại tuyến. Ngày nay yarn vẫn phổ biến trong React Native, Expo và monorepo. Tìm hiểu thêm tại yarn Documentation.

Những điểm chính

  • yarn — một trình quản lý gói cho Node.js, được Facebook tạo ra vào năm 2016 để giải quyết các vấn đề của npm
  • yarn.lock — tệp lock ghi lại phiên bản chính xác của tất cả các phụ thuộc, được tạo tự động
  • yarn install — cài đặt song song các gói bằng bộ nhớ đệm toàn cầu không trùng lặp
  • yarn workspaces — cơ chế quản lý monorepo với thư mục node_modules dùng chung
  • Plug'n'Play — giải pháp thay thế node_modules lưu trữ gói trong tệp ZIP trong bộ nhớ đệm toàn cầu

yarn là gì — một trình quản lý gói?

yarn (Yet Another Resource Negotiator) được phát hành vào tháng 10 năm 2016 như một phản hồi của Facebook đối với các vấn đề của npm 2-4: cài đặt chậm, thiếu tệp lock và gói không an toàn. yarn đã giới thiệu tải gói song song, yarn.lock xác định và xác minh tính toàn vẹn thông qua checksum. Năm 2020, yarn chuyển sang phiên bản 2 (Berry) với Plug'n'Play và cách tiếp cận TypeScript-first.

Kiến trúc của yarn khác với npm: yarn tải gói song song (npm trước phiên bản 5 — tuần tự), lưu từng gói vào bộ nhớ đệm ~/.cache/yarn không trùng lặp giữa các dự án và xác minh tính toàn vẹn qua checksum. yarn luôn tạo yarn.lock sau mỗi lần cài đặt, trong khi package-lock.json trong npm chỉ xuất hiện ở phiên bản 5.

Bắt đầu từ yarn 2 (Berry, 2020), yarn đã được viết lại hoàn toàn bằng TypeScript và hỗ trợ Plug'n'Play, workspaces, constraints cho monorepo và các giao thức cài đặt từ nhiều nguồn khác nhau (npm, git, tarball). yarn 3+ (2022) đã thêm Zero-Installs — lưu trữ bộ nhớ đệm trong kho lưu trữ để cài đặt tức thì mà không cần mạng.

Cách yarn quản lý việc cài đặt phụ thuộc

yarn install — lệnh chính đọc package.json và yarn.lock và cài đặt các phụ thuộc. yarn tải gói song song, giúp tăng tốc độ cài đặt gấp 2-3 lần so với npm 4 và các phiên bản cũ hơn. yarn sử dụng bộ nhớ đệm ngoại tuyến: nếu một gói đã được tải trong dự án khác, nó sẽ được sao chép từ bộ nhớ đệm thay vì tải lại.

bash
# Các lệnh yarn cơ bản
$ yarn install
$ yarn add react-native-webview
$ yarn add --dev typescript
$ yarn global add expo-cli
# Cập nhật tương tác
$ yarn upgrade-interactive
# Xóa gói trùng lặp
$ yarn dedupe

yarn add — lệnh cài đặt gói mới. yarn add <package> thêm vào dependencies, yarn add --dev — vào devDependencies. yarn tự động cập nhật yarn.lock. yarn upgrade cập nhật gói lên phiên bản mới nhất trong phạm vi ngữ nghĩa. yarn upgrade-interactive — chế độ tương tác để chọn gói cụ thể cần cập nhật.

yarn cache — bộ nhớ đệm toàn cầu trong ~/.cache/yarn/v6. Mỗi gói được lưu trữ một lần trong tệp ZIP với checksum. Bộ nhớ đệm của yarn được dọn dẹp tự động, nhưng bạn có thể chạy yarn cache clean thủ công. yarn cache dir hiển thị đường dẫn bộ nhớ đệm. yarn cache list — danh sách các gói đã lưu trong bộ nhớ đệm.

yarn.lock: mục đích và cấu trúc tệp

yarn.lock — tệp lock ghi lại phiên bản chính xác của tất cả các phụ thuộc và các gói truyền dẫn của chúng. Không giống như package-lock.json (JSON), yarn.lock sử dụng định dạng YAML với cấu trúc phẳng. yarn.lock luôn được tạo tự động trong quá trình yarn install hoặc yarn add — điều này đảm bảo tất cả nhà phát triển và máy chủ CI nhận được cùng một tập hợp gói.

yaml
# Ví dụ cấu trúc yarn.lock
react@^18.3.0:
  version: "18.3.1"
  resolution: "react@npm:18.3.1"
  dependencies:
    loose-envify: "^1.1.0"
  checksum: "abc123def456..."

react-native@^0.76.0:
  version: "0.76.3"
  resolution: "react-native@npm:0.76.3"
  dependencies:
    react: "18.3.1"
  checksum: "def789ghi012..."

Các trường của yarn.lock: version — phiên bản chính xác của gói, resolution — nguồn và phiên bản, dependencies — các phụ thuộc của nó, checksum — checksum để xác minh. yarn.lock được commit vào kho lưu trữ và là nguồn thông tin duy nhất cho các phụ thuộc. Nếu yarn.lock và package.json khác nhau, yarn sẽ đưa ra cảnh báo.

Yarn constraints — hệ thống quy tắc cho monorepo kiểm tra và thực thi các phiên bản phụ thuộc trong yarn.lock. Các ràng buộc được mô tả trong tệp yarn.constraints.js bằng Ngôn ngữ Ràng buộc Yarn. Constraints cho phép đảm bảo rằng tất cả các gói trong monorepo sử dụng cùng một phiên bản React hoặc TypeScript.

yarn trong hệ sinh thái React Native

React Native theo truyền thống gắn liền với yarn. Expo CLI, React Native CLI và Create React Native App ban đầu đã sử dụng yarn. Trong các dự án React Native, yarn.lock cố định phiên bản của các mô-đun gốc, điều này cực kỳ quan trọng cho việc biên dịch ổn định qua CocoaPods (iOS) và Gradle (Android). yarn workspaces phổ biến trong các monorepo React Native có mã dùng chung.

yarn workspaces trong monorepo React Native: package.json gốc chứa "workspaces": ["packages/*", "mobile"]. yarn install tạo một thư mục node_modules duy nhất ở cấp gốc. Các gói tham chiếu lẫn nhau qua symlink. npx pod-install được thực thi sau khi thay đổi phụ thuộc gốc để cập nhật CocoaPods.

json
{
  "private": true,
  "workspaces": [
    "packages/*",
    "apps/mobile",
    "apps/web"
  ],
  "scripts": {
    "mobile:start": "yarn workspace mobile start",
    "mobile:ios": "yarn workspace mobile ios",
    "lint": "yarn workspaces run lint"
  }
}

Expo SDK 50+ chính thức khuyến nghị yarn cho các dự án mới được tạo qua npx create-expo-app. yarn đảm bảo tương thích với các mô-đun Expo và tự động tạo yarn.lock chính xác. Zero-Installs trong yarn 3+ cho phép commit bộ nhớ đệm vào kho lưu trữ — nhà phát triển nhận được môi trường sẵn sàng sử dụng mà không cần cài đặt phụ thuộc sau git clone.

yarn và npm: phân tích so sánh

npmyarn giải quyết cùng một vấn đề — quản lý các gói Node.js. Với sự ra đời của npm 5-7, khoảng cách chức năng gần như đã biến mất. npm 7+ bao gồm workspaces, npm ci (tương đương với yarn install --frozen-lockfile) và cài đặt song song. Tuy nhiên, yarn vẫn giữ lợi thế trong các tình huống cụ thể: Plug'n'Play, Zero-Installs và hệ thống constraints trưởng thành.

Đặc điểmnpmyarn
Năm tạo20102016
Tệp lockpackage-lock.json (JSON)yarn.lock (YAML)
Cài đặtTuần tự (npm 5+)Song song
Plug'n'PlayKhôngCó (yarn 2+)
WorkspacesCó (npm 7+)
Zero-InstallsKhôngCó (yarn 3+)
Bộ nhớ đệmnode_modules với flatteningToàn cầu ~/.cache/yarn
Ngôn ngữ triển khaiJavaScriptTypeScript (yarn 2+)

Khi nào chọn yarn: dự án trên Expo SDK 50+, monorepo lớn (100+ gói), nhóm coi trọng Zero-Installs để thiết lập môi trường nhanh chóng và các dự án kế thừa đã sử dụng yarn. Khi nào chọn npm: dự án create-react-app tiêu chuẩn, Next.js, Vite, nhóm không có yêu cầu cụ thể về trình quản lý gói.

yarn 4 (2024) đã giới thiệu hiệu suất được cải thiện, hỗ trợ ESM gốc và tối ưu hóa cho monorepo lớn. npm 10+ tiếp tục phát triển tập trung vào bảo mật và tương thích. Sự lựa chọn giữa npmyarn ngày nay là vấn đề sở thích của nhóm và yêu cầu cụ thể của dự án, chứ không phải là ưu thế kỹ thuật của công cụ này so với công cụ kia.

Câu hỏi thường gặp

Sự khác biệt chính giữa yarn và npm là gì?

yarn ban đầu vượt trội hơn npm về tốc độ nhờ cài đặt gói song song và lưu vào bộ nhớ đệm mạnh mẽ. yarn.lock được tạo tự động sau mỗi lần cài đặt, trong khi package-lock.json xuất hiện trong npm 5. yarn cung cấp Plug'n'Play — giải pháp thay thế node_modules với thời gian cài đặt bằng không. Với npm 7+, sự khác biệt về tốc độ và chức năng cho các tình huống cơ bản là tối thiểu.

Làm thế nào để yarn workspaces hoạt động trong monorepo?

yarn workspaces — cơ chế quản lý nhiều gói trong một kho lưu trữ duy nhất. package.json gốc chứa trường "workspaces": ["packages/*"]. yarn install cài đặt các phụ thuộc dùng chung ở cấp cao nhất trong một node_modules duy nhất, tạo symlink giữa các gói cục bộ và tránh trùng lặp. Các lệnh được chạy cho tất cả workspaces qua yarn workspaces run <script>.

yarn Plug'n'Play là gì và tại sao cần nó?

Plug'n'Play (PnP) — giải pháp thay thế cho thư mục node_modules truyền thống, được giới thiệu trong yarn 2. Thay vì sao chép tệp, yarn tạo bản đồ phụ thuộc trong .pnp.cjs và lưu trữ gói trong tệp ZIP trong bộ nhớ đệm toàn cầu. Lợi ích của PnP: cài đặt trong vài giây, thời gian khởi động Node.js giảm 30-50%, không có node_modules và các vấn đề về đường dẫn liên quan.

Làm thế nào để di chuyển dự án từ npm sang yarn?

Cài đặt yarn toàn cầu: npm install -g yarn. Trong thư mục gốc của dự án, chạy yarn import — yarn đọc package-lock.json và tạo yarn.lock tương đương. Xóa node_modules và package-lock.json, chạy yarn install để xác minh. Cập nhật cấu hình CI/CD bằng cách thay thế npm bằng yarn. yarn tương thích hoàn toàn với package.json.

Làm thế nào để sửa lỗi khóa phiên bản trong yarn?

Lỗi "Integrity check failed" xảy ra khi yarn.lock và node_modules không đồng bộ. Giải pháp: xóa node_modules, yarn.lock và xóa bộ nhớ đệm (yarn cache clean), sau đó chạy lại yarn install. Đối với xung đột phiên bản, sử dụng yarn upgrade-interactive để chọn các bản cập nhật cụ thể. yarn dedupe sẽ loại bỏ các gói trùng lặp.

Tóm tắt

  • yarn — một trình quản lý gói thay thế cho Node.js được Facebook tạo ra vào năm 2016
  • yarn.lock — tệp lock ghi lại phiên bản chính xác của tất cả phụ thuộc ở định dạng YAML
  • yarn install — cài đặt song song các gói bằng bộ nhớ đệm ngoại tuyến toàn cầu
  • Plug'n'Play — cơ chế yarn 2+ sáng tạo không có thư mục node_modules
  • yarn workspaces — quản lý monorepo với một node_modules duy nhất
  • yarn trong React Native — trình quản lý gói tiêu chuẩn cho các dự án Expo và React Native
  • Zero-Installs — commit bộ nhớ đệm vào kho lưu trữ để cài đặt tức thì mà không cần tải gói

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm