pnpm, 즉 Performant npm은 npm을 많이 쓰는 개발자가 겪는 두 가지 구체적인 문제를 해결하려고 만들어졌어. 바로 낭비되는 디스크 공간과 phantom dependencies야. 같은 package.json을 쓰면서 두 문제를 해결하고 설치도 빨라서, 이 퀘스트에서 npm을 떠나는 가장 부담 없는 경로야.
디스크 공간. npm은 패키지를 각 프로젝트의 node_modules에 복사해. 프로젝트 열 개가 React를 쓰면 React도 열 번 저장될 수 있지. pnpm은 각 패키지 버전을 ~/.pnpm-store/의 전역 콘텐츠 주소 저장소에 한 번만 넣고, 프로젝트의 node_modules에는 hard link를 만들어. 여러 경로가 inode 수준에서 같은 실제 파일을 공유하므로 디스크 사용량이 전체적으로 50~70% 줄고, 이미 받은 바이트를 재사용해 설치도 훨씬 빨라져.
Phantom dependencies. npm의 평평한 node_modules에서는 package.json에 없는 패키지도 우연히 불러올 수 있어. pnpm은 엄격한 중첩 구조를 사용해 직접 선언한 패키지만 접근하게 해. 코드에 import x from 'lodash'가 있는데 pnpm add lodash를 하지 않았다면 즉시 실패해. 이 엄격함 자체가 기능이야.
2025년 1월에 나온 pnpm v10은 기본 보안도 강화했어. postinstall 같은 lifecycle script는 패키지별로 허용하지 않으면 실행되지 않아. 악성 패키지의 postinstall이 설치 때마다 임의 코드를 실행하던 공급망 공격 경로를 크게 줄인 변화야. 모든 곳에 SHA256 해시를 쓰고, 더 빠른 최초 설치를 위한 실험적 Global Virtual Store도 제공해.
pnpm은 npm과 같은 package.json을 읽고, package-lock.json 대신 pnpm-lock.yaml을 사용해. 명령 인터페이스도 대부분 바로 대응하므로 pnpm import 한 번으로 이전을 시작할 수 있어.