요약
- package.json과 lockfile만 남겨 두면 node_modules는 삭제해도 안전합니다. npm ci나 pnpm install로 똑같은 버전을 되살릴 수 있습니다.
- -prune을 붙인 find 명령어로 홈 폴더의 모든 node_modules 폴더를 중첩된 폴더까지 들어가지 않고 크기와 함께 나열할 수 있습니다.
- npx npkill로 node_modules 폴더를 둘러보며 대화형으로 지울 수 있지만, 휴지통을 거치지 않고 즉시 삭제합니다.
- pnpm에서는 node_modules의 파일이 공유 저장소의 복제본이나 하드 링크이므로, pnpm store prune을 실행하기 전까지는 지워도 확보되는 공간이 적습니다.
- .next, .turbo, .nuxt, .svelte-kit, .parcel-cache 같은 빌드 폴더도 자동으로 다시 만들어지므로 제거해도 안전합니다.
Mac에서 node_modules 폴더를 찾아 정리하는 방법
- node_modules 폴더를 크기와 함께 나열하기. ~/Library와 휴지통을 건너뛰고, 최상위 node_modules에서 멈추며, 결과를 du -sh에 넘기는 find 명령어를 홈 폴더에 실행합니다.
- 작업하지 않는 프로젝트 고르기. 각 프로젝트에 package.json과 package-lock.json, pnpm-lock.yaml, yarn.lock, bun.lock 같은 lockfile이 있는지 확인합니다. 이 파일들은 남겨 둡니다.
- node_modules 폴더 삭제하기. Finder에서 각 node_modules 폴더를 휴지통으로 옮기거나, npx npkill로 대화형으로 삭제합니다. npkill은 영구적으로 삭제합니다.
- 패키지 매니저 캐시 비우기. 사용하는 패키지 매니저에 맞춰 npm cache clean --force, pnpm store prune, yarn cache clean, bun pm cache rm을 실행합니다.
- 프로젝트로 돌아오면 다시 설치하기. 프로젝트 폴더에서 npm ci, pnpm install, yarn install, bun install을 실행해 lockfile로부터 node_modules를 복원합니다.
node_modules 폴더에는 JavaScript나 TypeScript 프로젝트 하나에 설치된 의존성이 들어 있으며, 보통 수백 MB 정도입니다. 오래된 프로젝트가 수십 개라면 합쳐서 수십 GB에 이르기 쉽습니다. package.json과 lockfile만 남겨 두면 삭제해도 안전합니다. 프로젝트로 돌아왔을 때 패키지 매니저가 같은 버전을 다시 설치해 줍니다.
모든 node_modules 폴더와 크기 찾기
다음 명령어는 ~/Library와 휴지통을 건너뛰고 홈 폴더를 검색해, 각 node_modules 폴더를 크기와 함께 가장 큰 것이 마지막에 오도록 출력합니다.
find ~ \( -path "$HOME/Library" -o -path "$HOME/.Trash" \) -prune -o -type d -name node_modules -prune -print0 2>/dev/null | xargs -0 du -sh 2>/dev/null | sort -h
동작 방식은 이렇습니다. 첫 번째 -prune은 제외할 두 폴더를 건너뛰고, -type d -name node_modules는 해당 폴더를 찾으며, 두 번째 -prune은 find가 그 안으로 들어가지 않게 막습니다. 그래서 중첩된 node_modules는 상위 폴더 안에서 한 번만 집계됩니다. du -sh가 각 폴더의 크기를 재고 sort -h가 목록을 정렬합니다. 읽기만 하는 명령어입니다. 홈 폴더가 크면 몇 분 걸릴 수 있으며, 터미널이 문서, 데스크탑, 다운로드 폴더에 대한 접근 권한을 요청할 수 있습니다.
~/.nvm, ~/.vscode, ~/.cursor 같은 도구 폴더 안의 결과는 무시하세요. 이 폴더들은 프로젝트가 아니라 설치된 도구와 편집기 확장 프로그램의 것입니다.
프로젝트에서 pnpm을 사용한다면 표시되는 크기가 실제로 되찾을 수 있는 공간보다 큽니다. 이유는 아래에서 설명합니다.
필요 없는 폴더 삭제하기
삭제하기 전에 프로젝트 폴더를 열어 lockfile이 있는지 확인하세요. package-lock.json(npm), pnpm-lock.yaml(pnpm), yarn.lock(Yarn), bun.lock / bun.lockb(Bun) 중 하나입니다. 이 파일과 package.json은 남겨 둡니다.
가장 안전하게 지우는 방법은 Finder에서 node_modules를 휴지통으로 드래그하는 것입니다. 휴지통을 비우기 전까지는 언제든 마음을 바꿀 수 있습니다. 작은 파일이 많아서 휴지통으로 옮기는 데 잠시 시간이 걸립니다.
터미널에서는 프로젝트 폴더 안에서 다음을 실행합니다.
cd ~/Projects/old-app
rm -rf node_modules
rm -rf는 휴지통을 거치지 않고 영구적으로 삭제합니다. 먼저 pwd로 현재 폴더를 확인하고, 와일드카드나 빈 변수와 함께 실행하는 일은 절대 없도록 하세요.
npkill: 대화형 대안
npkill은 node_modules 폴더를 크기와 함께 나열하고, 키 하나로 하나씩 삭제할 수 있게 해 줍니다.
npx npkill -d ~/Projects
-d는 검색을 시작할 위치를 정하며, 지정하지 않으면 현재 폴더에서 시작합니다. 화살표 키로 이동하고 Space나 Del을 눌러 선택한 폴더를 삭제합니다. npkill은 휴지통을 거치지 않고 즉시 삭제합니다. 앱 실행에 필요한 폴더에는 ⚠️ 표시가 붙으므로 그대로 두세요. 먼저 시험해 보고 싶다면 --dry-run으로 삭제를 흉내 낼 수 있습니다.
프로젝트로 돌아오면 다시 설치하기
lockfile에 적힌 그대로 설치하는 명령어를 사용하세요.
| 패키지 매니저 | lockfile | 다시 설치 |
|---|---|---|
| npm | package-lock.json |
npm ci |
| pnpm | pnpm-lock.yaml |
pnpm install --frozen-lockfile |
| Yarn(Berry) | yarn.lock |
yarn install --immutable |
| Yarn Classic | yarn.lock |
yarn install --frozen-lockfile |
| Bun | bun.lock |
bun install --frozen-lockfile |
npm ci는 lockfile이 반드시 있어야 하며, 기존 node_modules를 먼저 지우고, package.json이나 lockfile을 절대 바꾸지 않습니다. 그냥 npm install을 써도 되지만 lockfile이 업데이트될 수 있습니다.
저절로 다시 만들어지는 다른 폴더
프레임워크와 빌드 도구는 node_modules 옆에 캐시와 출력물을 둡니다. 실행하지 않는 프로젝트라면 지워도 안전하며, 다음 빌드나 개발 서버가 다시 만듭니다.
| 폴더 | 생성 주체 |
|---|---|
.next |
Next.js |
.nuxt |
Nuxt |
.svelte-kit |
SvelteKit |
.turbo |
Turborepo |
.parcel-cache |
Parcel |
.angular |
Angular CLI |
dist와 build도 대개 빌드 출력물이지만 이름이 흔합니다. 일부 프로젝트는 이 폴더에 파일을 커밋하거나 다른 용도로 쓰므로, 지우기 전에 안을 확인하세요.
프로젝트 폴더 안의 프레임워크 캐시를 나열하려면 다음을 실행합니다.
find ~/Projects -type d \( -name .next -o -name .nuxt -o -name .svelte-kit -o -name .turbo -o -name .parcel-cache \) -prune -print0 | xargs -0 du -sh | sort -h
전역 패키지 캐시 비우기
패키지 매니저마다 모든 프로젝트가 공유하는 다운로드 캐시도 있습니다. 비우면 되돌릴 수 없지만 해가 되지는 않습니다. 필요할 때 패키지를 다시 내려받습니다.
npm cache clean --force
pnpm store prune
yarn cache clean
bun pm cache rm
- npm은 캐시를
~/.npm/_cacache에 둡니다. npm 캐시 문서는clean에--force가 필요한 이유를 설명하고,npm cache verify가 전체를 비우지 않고 가비지 컬렉션만 한다는 점도 알려 줍니다.npx가 가져온 패키지는~/.npm/_npx에 있습니다. - pnpm은 macOS에서 저장소를
~/Library/pnpm/store에 둡니다(pnpm store path로 실제 위치를 확인할 수 있습니다).pnpm store prune은 어떤 프로젝트도 참조하지 않는 패키지만 제거하며, pnpm 문서는 이 명령어를 자주가 아니라 가끔 실행하라고 권합니다. - Yarn Classic은
~/Library/Caches/Yarn에 캐시합니다. Yarn Berry에서는yarn cache clean --mirror가~/.yarn/berry/cache의 전역 캐시를 비웁니다. - Bun은
~/.bun/install/cache에 캐시하며,bun pm cache rm으로 비울 수 있습니다.
nvm으로 설치한 오래된 Node.js 버전도 ~/.nvm/versions/node에 쌓입니다. 더 이상 필요 없는 버전은 nvm uninstall <version>으로 제거하세요.
pnpm에서 du가 보여 주는 것보다 적게 확보되는 이유
npm과 Yarn Classic은 모든 패키지를 각 프로젝트의 node_modules에 복사합니다. pnpm은 각 패키지를 콘텐츠 주소 기반 저장소에 한 번만 저장하고, 그 파일을 패키지를 사용하는 모든 프로젝트에 연결합니다. macOS에서 pnpm의 기본 packageImportMethod는 먼저 APFS 복제본을 시도하고, 그다음 하드 링크를 사용합니다.
어느 쪽이든 실제 데이터는 공유됩니다. 그런데 du는 프로젝트마다 전체 크기를 집계하므로, pnpm 프로젝트의 node_modules를 지우면 보통 보고된 크기보다 훨씬 적은 공간만 확보됩니다. 남은 프로젝트가 아무도 쓰지 않는 패키지를 pnpm store prune이 제거할 때 공간이 돌아옵니다. 이 방식이 동작하려면 저장소가 프로젝트와 같은 디스크에 있어야 하며, 외장 드라이브의 프로젝트는 그 드라이브에 자체 저장소를 따로 둡니다.
MoreRoom이 도와드리는 방법
MoreRoom 무료 버전은 lockfile이 있고 30일 동안 손대지 않은 프로젝트의 node_modules 폴더와 .next, .turbo 같은 프레임워크 캐시를 찾아 ‘안전하게 제거 가능’ 라벨을 붙입니다. ~/Library와 ~/.nvm, ~/.vscode 같은 도구 폴더는 건너뜁니다. 항목은 한 번에 하나씩 휴지통으로 이동하며 실행 취소할 수 있습니다. npm 캐시와 pnpm 저장소에는 npm cache clean --force와 pnpm store prune을 실행합니다. 이 명령어는 되돌릴 수 없으며, 앱에도 그렇게 표시됩니다.
MoreRoom Pro에는 프로젝트 휴면 기능이 더해집니다. 비활성 프로젝트에서 node_modules나 빌드 출력물처럼 다시 만들 수 있는 폴더를 정리하고, 프로젝트로 돌아오면 클릭 한 번으로 다시 깨울 수 있습니다. Pro에는 컬렉터와 목표 모드도 포함됩니다.
자주 묻는 질문
node_modules를 삭제해도 안전한가요?
네. 설치된 의존성만 들어 있으며, 패키지 매니저가 package.json과 lockfile로 다시 설치할 수 있습니다. 지금 실행하고 있지 않은 프로젝트에서만 지우고, lockfile은 남겨 두세요.
package-lock.json도 지워야 하나요?
아니요. lockfile에는 제대로 동작했던 정확한 버전이 기록되어 있습니다. 나중에 npm ci, pnpm install, yarn install로 같은 node_modules를 다시 만들 수 있도록 남겨 두세요.
pnpm 프로젝트에서 node_modules를 지워도 공간이 거의 늘지 않는 이유는 무엇인가요?
pnpm은 각 패키지를 공유 저장소에 한 부만 보관하고, 그 파일을 모든 프로젝트에 복제하거나 하드 링크로 연결합니다. 프로젝트의 node_modules를 지우면 링크만 사라지며, pnpm store prune을 실행해야 어떤 프로젝트도 쓰지 않는 패키지가 삭제됩니다.
npm cache clean --force는 안전한가요?
네. ~/.npm/_cacache에 있는 npm의 다운로드 캐시를 비우며, 필요하면 npm이 패키지를 다시 내려받습니다. npm 문서에도 캐시를 비우는 것은 디스크 공간을 되찾을 때만 의미가 있다고 나와 있습니다.
npkill은 폴더를 휴지통으로 옮기나요?
아니요. npkill은 선택한 폴더를 즉시 삭제합니다. 미리 연습해 보려면 --dry-run 옵션을 사용하고, 휴지통이라는 안전망이 필요하다면 Finder를 사용하세요.