· yarn / npm / package-manager

Yarn vs npm 2026 — Yarn còn đáng dùng không?

npm vẫn là lựa chọn mặc định an toàn. Yarn Berry chỉ thực sự cần thiết trong một trường hợp: monorepo TypeScript lớn với zero-install CI. Ranh giới đó ở đâu?

Bởi

2.128 từ · 11 phút đọc

npm vẫn là lựa chọn mặc định an toàn trong 2026. Yarn Classic đã xong — đừng bắt đầu dự án mới với nó nữa. Yarn Berry (v4) vẫn có lý do tồn tại trong một kịch bản cụ thể: monorepo TypeScript lớn kết hợp với zero-install CI pipeline và workspace constraints. Ngoài kịch bản đó, npm hoặc pnpm là lựa chọn đơn giản hơn và ít rủi ro hơn về mặt hệ sinh thái.

Bài này dành cho ai

Các JavaScript/TypeScript developer đang cân nhắc có nên dùng, tiếp tục dùng, hay chuyển khỏi Yarn trong 2026. Nếu bạn đang làm dự án React Native hoặc Expo, hãy đọc phần caveats trước — PnP không dùng được ở đó và phần còn lại của bài này sẽ không thay đổi điều đó.

Lưu ý cho dev Việt Nam: phần lớn team trong nước đang dùng Vite (thay thế CRA) hoặc Next.js. Nếu bạn đang cân nhắc bật PnP, hãy đọc kỹ phần tương thích — có một số vấn đề cụ thể ảnh hưởng trực tiếp đến Vite trên Windows.

Chúng tôi so sánh gì

npm 11.15.0, Yarn Classic 1.22.22, Yarn Berry 4.15.0 — tất cả là stable release mới nhất tính đến 2026-05-26. Dữ liệu benchmark từ pnpm.io/benchmarks — automated, fixture công khai, chạy tự động hàng ngày. Dữ liệu thị phần từ khảo sát State of Frontend 2024 (n ≈ 6.000+ developer).

Một lưu ý về bức tranh ba chiều: pnpm đang bám sát Yarn về thị phần và đã vượt qua về developer satisfaction. Bài này tập trung vào npm vs Yarn, nhưng nếu bạn đang đánh giá lại toàn bộ stack, hãy thử cả pnpm — xem pnpm vs npm.

So sánh tính năng

Tính năngnpm 11Yarn Classic 1.xYarn Berry 4.x
Workspaces✅ (từ 2020)✅ + Constraints
Parallel workspace commandsCó hạn✅ (--parallel, --since)
PnP (không cần node_modules)✅ (mặc định)
Zero-installs✅ (opt-in)
Tự động quản lý @types TypeScript
Constraint rules cho monorepo
Hardened lockfile mode
Provenance attestation (Sigstore)
Hệ thống plug-in
npx / dlxnpxyarn dlx
Hỗ trợ React Native⚠️ cần node-modules linker

Khoảng cách năm 2016 khiến Yarn trở nên hấp dẫn — deterministic installs, offline cache, workspaces — đã được lấp đầy. npm v7 (2020) giải quyết cả ba. Điều còn lại là phần cuối bảng: constraint engine và zero-installs của Yarn Berry một bên, Sigstore provenance của npm một bên.

Phát hiện

Tốc độ cài đặt

Từ pnpm.io/benchmarks, fixture “lots of files”, 2026-05-26:

Kịch bảnnpm 11pnpm 10Yarn (node-modules)Yarn PnP
Cold install (không cache, không lockfile)27.6 s7.3 s7.1 s2.9 s
Cached + lockfile + node_modules hiện có1 s372 ms4.5 sn/a
Cập nhật dependency6.5 s3.1 s5.1 s2.5 s

Yarn PnP thắng cold-install ở 2.9 s vì nó sao chép zip archive thay vì hàng nghìn file riêng lẻ. npm ở mức 27.6 s là người thua cuộc rõ ràng — chậm hơn Yarn PnP tới 9 lần.

Trên CI pipeline chạy 50 pull request mỗi ngày, cold install của npm tốn khoảng 23 phút compute time mỗi ngày. Đó là tiền thật cho một bước không tạo ra giá trị gì.

Zero-installs đẩy điều này xa hơn. Commit .yarn/cache vào repository, CI bỏ qua yarn install hoàn toàn. Tiết kiệm điển hình cho dự án Next.js lớn: 28–35 giây mỗi lần chạy. Đánh đổi là kích thước repository — kỳ vọng 50–200 MB cache nén. Trên GitHub Actions, đây là overhead checkout một lần thay vì penalty mỗi lần chạy. Với runner có NVMe nhanh và actions/cache đã warm, pnpm ở trạng thái cache hit có thể tiệm cận hiệu suất zero-installs. Zero-installs đơn giản hơn để lý giải: không có cache miss, không có stale state.

Tương thích PnP — vấn đề thực tế với Vite và Windows

PnP thực thi điều npm bỏ qua im lặng: bạn không thể dùng package chưa khai báo là direct dependency. Hành vi này đúng. Vấn đề là hệ sinh thái chưa theo kịp.

Các điểm không tương thích được xác nhận tính đến 2026-05-26:

  • React Native / Expo — chính thức không hỗ trợ PnP. Bắt buộc dùng nodeLinker: node-modules trong .yarnrc.yml. Đây là tài liệu chính thức của Yarn, không phải workaround cộng đồng.
  • Vite trên Windows — crash khi Yarn cache nằm trên ổ đĩa khác với project (vitejs/vite#15496, đã đóng là duplicate; hành vi gốc chưa được giải quyết). Đây là vấn đề trực tiếp ảnh hưởng nhiều dev Việt Nam làm việc trên Windows: nếu bạn cài Yarn cache vào ổ D:\ nhưng project ở C:, bạn sẽ gặp lỗi này.
  • Vite + ESMpackage.json type: module kết hợp PnP gây lỗi “module not found” (vitejs/vite#4307).
  • Vitest @vitest/browser — không thể resolve vite qua PnP vì @vitest/browser không khai báo nó là direct dependency (vitest-dev/vitest#6101).
  • Next.js — các edge case PnP kéo dài nhiều năm, nhất là với App Router và middleware (vercel/next.js#25296).

Workaround chuẩn cho tất cả những vấn đề này: đặt nodeLinker: node-modules trong .yarnrc.yml. Bạn vẫn giữ được tính năng của Yarn Berry — zero-installs, constraints, plug-ins — mà không có sự chặt chẽ của PnP. Nhiều team làm đúng điều này. Đây là cấu hình hợp lệ, nhưng nghĩa là bạn đang bỏ qua lợi thế tốc độ cài đặt của PnP. Bạn đang dùng Yarn như một v1 nâng cấp với plugin system tốt hơn, chứ không phải công cụ mà Yarn Berry được thiết kế để trở thành.

Tính 1–3 ngày cho công việc tương thích khi dùng PnP trên project thực với nhiều dependency. Migration guide chính thức có các bước nhưng đánh giá thấp thời gian setup IDE.

Monorepo DX

Đây là nơi Yarn Berry không có đối thủ.

Constraints là một rule engine JavaScript/TypeScript thực thi tính nhất quán qua các file package.json trong monorepo. Rule điển hình: “mọi package phải dùng cùng phiên bản TypeScript.” Rule khác: “không package nào được khai báo peer dependency không có trong devDependencies của root.” Không package manager nào khác có tính năng này. Với team quản lý 20+ package, constraints hoàn vốn bằng cách ngăn dependency drift.

Ngoài constraints, Yarn Berry thêm yarn workspaces foreach --parallel từ v3, và --since filtering để chỉ chạy lệnh cho các package đã thay đổi kể từ một git ref. Hai tính năng này ít quan trọng với monorepo hai package. Chúng quan trọng với monorepo 50 package khi full rebuild mất nhiều phút.

npm workspaces đáp ứng được cơ bản: hoisted installs, flag --workspace=, npm run --workspaces. Những gì vẫn còn thiếu trong 2026: không có flag --parallel cho workspace commands, không có constraint engine, không hỗ trợ multi-package publish. Nếu bạn chạm ngưỡng này, Yarn Berry là lựa chọn duy nhất trong hệ thống. Turborepo và Nx đều hỗ trợ cả ba package manager — không cái nào yêu cầu Yarn Berry. Xem thêm cách thiết lập pnpm + Turborepo từ đầu nếu bạn đang cân nhắc phương án này.

Bảo mật

npm và Yarn Berry đặt cược theo hai hướng khác nhau.

npm đi theo hướng attestation. Flag --provenance khi publish tạo ra Sigstore attestation — bằng chứng mật mã về repository và workflow nào đã build package. Consumer xác minh bằng npm audit signatures (npm 9+). Cần publish từ GitHub Actions hoặc GitLab CI; các CI provider khác chưa được hỗ trợ. Đây là điểm khác biệt bảo mật lớn nhất của npm trong 2026.

Yarn Berry đi theo hướng lockfile integrity. Hardened Mode, ra mắt trong v4.0, tự động kích hoạt trên public GitHub PR CI. Nó validate package metadata mỗi lần install và kiểm tra resolution coherence — bảo vệ chống lockfile poisoning, khi một pull request độc hại sửa yarn.lock để swap dependency sang phiên bản bị compromise. Các cuộc tấn công supply chain Shai-Hulud tháng 9–11/2025 cho thấy lockfile integrity là điều kiện tối thiểu với mọi project nghiêm túc. Không cách nào hoàn toàn ngăn được credential theft, nhưng cả hai đều thu hẹp attack surface đáng kể.

Hai hướng này bổ sung, không cạnh tranh: attestation bảo vệ những gì bạn publish, hardened mode bảo vệ những gì bạn cài. Nếu bạn publish package lên npm, provenance là điều đáng quan tâm. Nếu bạn nhận external PR, lockfile hardening là điều cần thiết.

Thị phần

State of Frontend 2024:

Công cụThị phần
npm56,6%
Yarn (tất cả phiên bản)21,5%
pnpm19,9%

Thị phần của npm bị phình to vì nó đi kèm với Node.js — nhiều người dùng thụ động. 21,5% của Yarn Classic phản ánh quán tính trên các project cũ, không phải adoption mới; Yarn Classic đã ở chế độ maintenance từ 2020 và không còn tính năng mới.

Xu hướng thực sự là pnpm. Ở mức 19,9% và đang tăng. Dữ liệu developer satisfaction từ State of JS 2023–2024 cho thấy pnpm vượt Yarn năm thứ hai liên tiếp. Team thử Yarn Berry, gặp friction PnP, rồi chuyển đi — phần lớn sang pnpm, không phải quay về npm. Approach content-addressable store và hard-link của pnpm mang lại hầu hết lợi thế tốc độ của Yarn PnP mà không có rủi ro tương thích.

Kết luận: Yarn hay npm?

Dùng npm khi:

  • Bạn maintain open-source tooling hoặc thư viện và cần compatibility tối đa. README của bạn không cần ghi chú về package manager.
  • Stack của bạn có React Native, Expo, hoặc setup ESM phức tạp chưa được kiểm tra với PnP.
  • Team nhỏ và chi phí infrastructure cần ở mức tối thiểu. npm đi kèm Node.js — không cần layer config thêm, không cần ghim Corepack.

Dùng Yarn Berry (v4) khi:

  • Bạn vận hành TypeScript monorepo với 20+ package và cần Constraints để thực thi tính nhất quán qua các file package.json. Đây là lợi thế rõ nhất của Yarn Berry.
  • Thời gian CI install là ràng buộc ngân sách khó. Zero-installs loại bỏ hoàn toàn bước install — tiết kiệm 30–120 giây mỗi lần chạy trên dependency tree lớn ở quy mô.
  • Team đã validate PnP compatibility trước và chấp nhận maintain .yarnrc.yml cùng compatibility shims lâu dài.

Đừng bắt đầu project mới với Yarn Classic (v1): Frozen từ 2020. Không có tính năng mới, chỉ security fix. Nếu bạn đang dùng nó hôm nay, hãy migrate. Con đường sang npm ít phức tạp: xóa yarn.lock, chạy npm install, thay yarn installnpm ci trong CI. Budget 1–2 giờ cho project điển hình. Con đường sang Yarn Berry mất 1–3 ngày trên project thực và chỉ đáng nếu bạn thực sự cần monorepo constraints hoặc zero-install CI.

Lưu ý

Benchmark trên đây đến từ pnpm.io/benchmarks. pnpm maintain suite này, và fixture được thiết kế quanh kiến trúc của pnpm. Thứ tự tương đối — Yarn PnP nhanh nhất cold install, npm chậm nhất — nhất quán với các đo lường độc lập, nhưng hãy coi các con số tuyệt đối là chỉ số định hướng, không phải sự thật cuối cùng cho project cụ thể của bạn.

Bài này không đi sâu vào pnpm. Nếu bạn đang đánh giá lại toàn bộ tool chain, hãy test cả ba. pnpm là con đường nâng cấp tốt hơn từ npm cho hầu hết team không cần tính năng monorepo đặc thù của Yarn.

Tài liệu tham khảo

NguồnURL
pnpm benchmark suitepnpm.io/benchmarks
Yarn 4.0 release blogyarnpkg.com/blog/release/4.0
Yarn PnP docsyarnpkg.com/features/pnp
Yarn migration guideyarnpkg.com/getting-started/migration
npm provenance (GitHub Blog)github.blog/security/supply-chain-security/introducing-npm-package-provenance/
vitejs/vite#15496github.com/vitejs/vite/issues/15496
vitejs/vite#4307github.com/vitejs/vite/issues/4307
vitest-dev/vitest#6101github.com/vitest-dev/vitest/issues/6101
vercel/next.js#25296github.com/vercel/next.js/discussions/25296
State of Frontend 2024tsh.io/state-of-frontend
State of JS 2023–20242024.stateofjs.com/en-US