← Blog

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 typeCó đang maintain?Safe to delete?
Side project của riêng tôiKhông động 6 tháng+✅ Yes
Client work đã nghiệm thuTrong 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 tyBấ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 đủ:

FolderThuộcTrung bình
node_modules/JS/TS200 MB – 2 GB
target/Rust500 MB – 5 GB
build/Java/Gradle300 MB – 3 GB
.gradle/Android1 – 8 GB
.venv/ hoặc venv/Python200 MB – 2 GB
Pods/iOS CocoaPods100 MB – 1 GB
vendor/Laravel/Composer100 MB – 500 MB
.next/Next.js build100 MB – 1 GB
dist/nhiều50 MB – 500 MB
DerivedData/Xcode1 – 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í.