Tôi lấy lại 47 GB bằng cách xoá node_modules cũ — script + bẫy cần tránh
Dev machine 3 năm có thể chứa 50–100 GB node_modules chết. Đây là cách tìm và xoá chúng an toàn, cộng với những target/, .venv, Pods/ mà bạn có thể đã quên.
Sau 3 năm freelance, tôi mở Finder lên và đếm sơ: 87 folder trong ~/Dev. Mỗi folder là một project Laravel / Vue / Next / React Native / Astro / whatever — phần lớn đã ship xong, client đã nghiệm thu, tôi không động đến từ 2023.
Nhưng node_modules của chúng thì vẫn nằm đó. Lặng lẽ. Nặng nề.
Hôm đó tôi chạy lệnh này:
find ~/Dev -type d -name "node_modules" -prune 2>/dev/null \
-exec du -sh {} + | sort -hr
Output ra 73 dòng. Cộng tổng: 47 GB.
Đây là bài tôi viết sau khi recover 47 GB đó — ghi lại cách tìm, cách xoá an toàn, và mấy cái bẫy tôi đã dính.
Bước 1: Tìm tất cả node_modules đang có
Lệnh cơ bản:
find ~ -type d -name "node_modules" -prune 2>/dev/null \
-exec du -sh {} + | sort -hr
Flag quan trọng là -prune: khi tìm thấy node_modules, không đi sâu vào bên trong nữa. Không có flag này, find sẽ duyệt xuống nested node_modules/*/node_modules/... và lặp vô tận trên macOS (cực chậm).
2>/dev/null nuốt mấy lỗi “Permission denied” từ ~/Library.
Nếu chỉ muốn scan thư mục dev chính:
find ~/Dev ~/Sites ~/Workspace -type d -name "node_modules" -prune \
-exec du -sh {} + 2>/dev/null | sort -hr
Bước 2: Quyết định cái nào xoá được
Cái bẫy đầu tiên tôi dính: tôi nghĩ “project cũ từ 2022, xoá hết”. Rồi 2 tuần sau một client cũ email hỏi “fix cho tôi cái bug này được không?”. Tôi mở project, npm install, và 8 package đã bị deprecate khỏi npm registry trong thời gian đó. 3 package trong số đó đã bị xoá hẳn khỏi npm (do maintainer tự gỡ, hoặc license issue). Tôi ngồi 1 ngày tìm fork trên GitHub để patch.
Bài học: node_modules đôi khi là capsule thời gian chứa chính xác version package mà bạn đã test và ship. Xoá xong là mất.
Rule tôi đang dùng:
| Project type | Có đang maintain? | Safe to delete? |
|---|---|---|
| Side project của riêng tôi | Không động 6 tháng+ | ✅ Yes |
| Client work đã nghiệm thu | Trong warranty 1 năm | ⚠️ Only if package-lock.json tồn tại và commit lên git |
| Client work đã closed | > 2 năm | ✅ Yes |
| Project công ty | Bất kỳ khi nào | ✅ (CI có sẵn) |
Kiểm tra trước khi xoá một project nào đó:
cd ~/Dev/some-old-project
# Có lockfile không?
ls package-lock.json yarn.lock pnpm-lock.yaml 2>/dev/null
# Lockfile có được commit?
git log --oneline package-lock.json 2>/dev/null | head
Nếu có lockfile và nó đã commit → xoá thoải mái, npm ci sau này sẽ dựng lại y nguyên.
Bước 3: Xoá
Với project đơn lẻ:
rm -rf node_modules
Với nhiều project, tôi dùng lệnh này — nó chỉ xoá node_modules trong các thư mục trong ~/Dev mà không đệ quy vào nested:
find ~/Dev -type d -name "node_modules" -prune -print \
-exec rm -rf {} +
Cảnh báo: chạy không có -prune sẽ xoá hết luôn cả những project đang active. Luôn -print trước khi -exec rm để xem danh sách.
Muốn an toàn hơn thì move vào Trash thay vì rm:
brew install trash
find ~/Dev -type d -name "node_modules" -prune -exec trash {} +
Lỡ tay thì Cmd+Z trong Finder hoặc restore từ Trash.
Không chỉ node_modules
Sau khi dọn node_modules, tôi phát hiện còn mấy folder khác cũng ngốn không kém. Đây là danh sách đủ:
| Folder | Thuộc | Trung bình |
|---|---|---|
node_modules/ | JS/TS | 200 MB – 2 GB |
target/ | Rust | 500 MB – 5 GB |
build/ | Java/Gradle | 300 MB – 3 GB |
.gradle/ | Android | 1 – 8 GB |
.venv/ hoặc venv/ | Python | 200 MB – 2 GB |
Pods/ | iOS CocoaPods | 100 MB – 1 GB |
vendor/ | Laravel/Composer | 100 MB – 500 MB |
.next/ | Next.js build | 100 MB – 1 GB |
dist/ | nhiều | 50 MB – 500 MB |
DerivedData/ | Xcode | 1 – 10 GB per project |
Scan hết một lần:
find ~/Dev -type d \
\( -name "node_modules" -o -name "target" -o -name ".venv" \
-o -name "venv" -o -name "Pods" -o -name ".next" \) \
-prune -exec du -sh {} + 2>/dev/null | sort -hr | head -30
Trên máy tôi lần thứ hai dọn, lệnh này lộ ra thêm 31 GB nữa — chủ yếu là target/ của mấy project Rust cũ và Pods/ của 3 app iOS tôi đã ship từ 2021.
Sau khi dọn
Tổng đợt đó tôi lấy lại 78 GB — 47 GB từ node_modules + 31 GB từ các folder khác. Trên chiếc MacBook Pro 512 GB, đó là 15% disk.
Quan trọng hơn con số: máy tôi giờ Spotlight index nhanh hơn, Time Machine backup gọn hơn, và tôi không còn thông báo “Storage Almost Full” lúc đang build app.
Nếu bạn chưa đọc, tôi có bài tổng quan về 7 nơi GB bị ngốn trên Mac — coi chung với bài này.
Thủ công có ổn, nhưng mỗi tháng tôi không muốn chạy lại mấy lệnh này. Đó là lý do tôi làm Molecule Dev Purge — scan toàn bộ các folder dev trên, show size + last-modified, bạn tick từng nhóm muốn xoá. Native macOS, không telemetry, miễn phí.