
Trả lời nhanh: npm install chậm chủ yếu không phải do mạng, mà do ổ đĩa: một dự án trung bình bung 50.000-150.000 file nhỏ vào node_modules, toàn ghi ngẫu nhiên cỡ vài KB, đúng điểm yếu của ổ chậm. Tăng tốc theo thứ tự: dùng npm ci thay npm install trong deploy/CI, giữ cache thay vì xóa sạch mỗi lần, cân nhắc pnpm (link từ kho chung thay vì chép lại), và chạy trên ổ NVMe, nơi cùng một lệnh nhanh gấp 3-10 lần so với ổ thường hay thư mục mount qua mạng.
Gõ npm install rồi đi pha cà phê là meme của giới JavaScript. Nhưng meme này có cấu tạo kỹ thuật rõ ràng, và hiểu nó thì sửa được: phần lớn thời gian không nằm ở tải mạng như mọi người tưởng, mà nằm ở việc bung và ghi một núi file li ti xuống ổ. Bài này mổ xẻ từng khúc thời gian và đưa cách rút ngắn theo thứ tự đáng làm.
- Giải phẫu npm install: resolve → tải → bung nén → ghi vạn file nhỏ + chạy script hậu cài
- Khúc 'ghi vạn file nhỏ' là thủ phạm chính, ổ đĩa quyết định, không phải tốc độ mạng
- npm ci nhanh và sạch hơn npm install cho máy chủ/CI; cache ~/.npm là bạn, đừng xóa bừa
- pnpm đổi cách chơi: kho chung + hardlink, cài lần hai gần như tức thì
Giải phẫu một lần npm install
Bốn khúc thời gian nối nhau:
- Resolve: tính cây phụ thuộc, có lockfile thì khúc này ngắn.
- Tải: kéo các gói .tgz, phụ thuộc mạng, nhưng có cache (~/.npm) thì lần sau khỏi tải.
- Bung + ghi: giải nén thành hàng vạn file nhỏ ghi vào node_modules, khúc dài nhất trên đa số máy, thuần sức ổ đĩa: mỗi file là một lượt ghi ngẫu nhiên kèm cập nhật metadata hệ thống file.
- Script hậu cài: vài gói build native (node-gyp), ăn CPU, thi thoảng là thủ phạm đột biến.
Tự đo cho dự án của mình: time npm ci hai lần liên tiếp, lần hai cache đầy, phần chênh lệch chính là giá của mạng; phần còn lại gần như toàn ổ đĩa.
Tầng 1: Thói quen đúng, không tốn gì
- npm ci cho deploy/CI: cài đúng theo lockfile, xóa node_modules cũ tự động, bỏ qua khúc resolve lằng nhằng, nhanh hơn và tái lập được. npm install chỉ dành cho lúc thêm/đổi gói.
- Đừng xóa cache vô tội vạ: ~/.npm là kho .tgz đã tải; "rm -rf node_modules && xóa cache" như thần chú chữa bách bệnh thực ra bắt bạn tải lại cả thế giới. Xóa node_modules thôi là đủ cho 95% ca.
- Soi gói nặng bất thường:
du -sh node_modules/* | sort -h | tail: thấy gói vài trăm MB thì hỏi mình có thật cần nó không (nhiều gói có bản -lite hoặc thay thế nhẹ).
Tầng 2: Đổi công cụ - pnpm và bun
pnpm giải bài toán từ gốc: mọi phiên bản gói lưu một lần trong kho chung toàn máy (~/.pnpm-store), node_modules chỉ là hardlink trỏ vào, cài dự án thứ hai dùng chung gói gần như tức thì, mười dự án không còn mười bản React trên ổ. Đổi sang gần như không đau: pnpm import đọc lockfile cũ. Bun cũng cài rất nhanh nhờ tối ưu I/O, đáng thử nếu bạn đã trong hệ Bun. Với người quản nhiều dự án trên một VPS, pnpm thường là nâng cấp đáng giá nhất sau chính chiếc ổ.
Tầng 3: Phần cứng - nơi mọi tối ưu đứng lên trên
Cùng một npm ci dự án ~1.400 gói, khác biệt điển hình giữa các nền ổ:
- Thư mục mount qua mạng / ổ ảo hóa chậm: nhiều phút, mỗi file một vòng khứ hồi mạng, kịch bản tệ nhất (hay gặp khi mount code từ máy ngoài vào container/VM).
- SSD SATA: tầm một vài phút, nghẽn ở ghi ngẫu nhiên và metadata.
- NVMe enterprise: thường vài chục giây, hàng đợi lệnh sâu nuốt trọn cơn mưa file nhỏ.
Vì thế lời khuyên xếp cuối nhưng nặng ký nhất: để code và node_modules nằm thẳng trên ổ nhanh của máy chạy. Trên VPS NVMe, cả vòng đời npm ci → build → test ngắn lại đồng loạt, thứ dân vibe code cảm nhận mỗi lần agent cài lại môi trường.
Đo từng khúc để biết mất thời gian ở đâu
time npm ci # lan 1: cache trong time npm ci # lan 2: cache day, chenh lech chinh la thoi gian tai du -sh node_modules # xem khoi luong that find node_modules -type f | wc -l # dem so file, thuong 50.000 den 150.000 npm config get cache && du -sh $(npm config get cache)
Lần hai nhanh hơn hẳn nghĩa là mạng đang là phần đáng kể. Hai lần gần bằng nhau nghĩa là nghẽn ở khâu bung và ghi tệp, tức là ổ đĩa.
Ba trình quản lý gói, khác nhau ở đâu
| Công cụ | Cách lưu thư viện | Lợi thế | Điểm cần lưu ý |
|---|---|---|---|
| npm | Chép đầy đủ vào từng dự án | Có sẵn, tương thích cao nhất | Tốn dung lượng và thời gian ghi nhiều nhất |
| pnpm | Một kho chung theo máy, dự án chỉ tạo liên kết | Cài lần hai gần như tức thì, tiết kiệm dung lượng rất nhiều | Vài gói cũ giả định cấu trúc thư mục phẳng có thể lỗi |
| yarn bản mới | Kho chung hoặc gói nén | Nhanh, có chế độ không cần thư mục thư viện | Cần cấu hình thêm cho một số công cụ |
Với máy chạy nhiều dự án cùng lúc, pnpm là thay đổi lớn nhất về tốc độ: dự án thứ hai dùng chung phần lớn thư viện đã có trong kho, nên chỉ mất vài giây. Chuyển đổi thường chỉ cần xóa thư mục thư viện cũ và tệp khóa cũ, rồi chạy lệnh cài của pnpm.
Bốn thói quen tiết kiệm nhiều thời gian nhất
- Dùng
npm cithaynpm installtrên máy chủ và hệ thống tự động. Lệnh này đọc thẳng tệp khóa, bỏ bước tính toán cây phụ thuộc, và cho kết quả giống nhau mọi lần. - Đừng xóa thư mục đệm. Nhiều người xóa theo thói quen khi gặp lỗi. Cách đúng khi nghi ngờ là
npm cache verify, chỉ xóa khi thật sự hỏng. - Xóa thư viện của dự án cũ, không xóa đệm. Lệnh tìm và xóa mọi thư mục thư viện không dùng trong ba tháng:
find ~/du-an -name node_modules -type d -prune -mtime +90 -exec du -sh {} \;để xem trước, đổi sang-exec rm -rf {} +khi đã chắc. - Chỉ cài thư viện cần cho môi trường chạy thật:
npm ci --omit=devtrên máy chủ. Thư viện dành cho phát triển thường chiếm hơn nửa số tệp.
Lỗi hay gặp và cách xử
- Máy chủ bị dừng giữa chừng khi cài, thông báo hết bộ nhớ. Thêm vùng nhớ tạm trên ổ, hoặc cài trên máy khác rồi chép kết quả sang. Máy 1 GB bộ nhớ thường không đủ cho dự án vừa.
- Cài lâu bất thường ở một gói cụ thể. Đó là gói phải biên dịch mã máy. Cài công cụ biên dịch sẵn trên máy chủ, hoặc tìm gói thay thế thuần JavaScript.
- Thư mục thư viện đặt trên ổ mạng. Đây là cấu hình chậm nhất có thể. Hàng vạn tệp nhỏ qua đường mạng là thảm họa. Luôn đặt trên ổ cục bộ của máy.
Câu hỏi thường gặp
Vì sao node_modules lắm file thế?
Triết lý gói nhỏ của hệ JavaScript: mỗi gói kéo theo gói con, thành cây hàng nghìn gói, mỗi gói lại nhiều file. Có mặt trái nhưng đổi lại hệ sinh thái tái sử dụng mạnh nhất các ngôn ngữ; việc của mình là làm nó nhanh, không phải than.
npm, yarn, pnpm, bun, chọn cái nào 2026?
Mới bắt đầu: npm cho chuẩn tắc. Nhiều dự án trên một máy: pnpm ăn điểm dung lượng + tốc độ cài. Đã theo hệ Bun: dùng bun luôn cho đồng bộ. Yarn classic hết thời; yarn berry chỉ khi team đã quen.
CI của tôi cài gói mỗi lần rất lâu, sửa sao?
Ba đòn: dùng npm ci; cache thư mục ~/.npm (hoặc pnpm store) giữa các lần chạy; và nếu là runner tự host, đặt nó trên máy ổ NVMe. Runner tự host trên VPS NVMe thường cắt thời gian install còn một phần nhỏ so với runner chung.
Cài trên VPS có nhanh hơn laptop không?
VPS NVMe tốt thường thắng laptop phổ thông (ổ + không bị antivirus quét từng file như Windows). Bonus: mạng datacenter tải gói từ registry nhanh và ổn định hơn wifi nhà.
Bài viết liên quan
- Bun hay Node trên VPS: khác biệt khi build và chạy
- IOPS là gì? Vì sao quyết định tốc độ web/database
- VPS ổ Enterprise U.2 NVMe RAID 10 tại TND
- WordPress 7.0 ship MCP native trong core - góc nhìn vibe coder
- Hướng dẫn cài WireGuard VPN trên mọi thiết bị 2026
- Tailscale vs ZeroTier vs NetBird 2026: chọn mesh VPN nào?
- Ceph SSD Enterprise là gì? Tại sao TND chọn công nghệ này cho VPS
- Truy cập NAS, Jellyfin, Home Assistant từ xa không mở port
- Vibe code với Claude: best stack 2026-2027



