pnpm을 떠받치는 세 개념은 콘텐츠 주소 저장소, 엄격하게 중첩된 node_modules, 일급 workspaces 지원이야. 이 셋을 합치면 npm에서 옮길 이유가 분명해져.
콘텐츠 주소 저장소. 각 패키지 버전은 SHA256으로 식별되어 ~/.pnpm-store/에 한 번만 저장돼. 프로젝트의 node_modules에 설치할 때 파일을 복사하지 않고 저장소를 가리키는 hard link를 만들어. 여러 경로가 inode 수준에서 같은 실제 파일을 공유하므로 디스크 사용량이 전체적으로 50~70% 줄고, 이미 있는 바이트를 재사용해 설치도 훨씬 빨라.
엄격하게 중첩된 node_modules. 각 패키지의 의존성은 자체 node_modules 아래에 들어가고, package.json에 직접 선언한 패키지만 프로젝트 루트로 올라와. 코드는 선언한 패키지만 불러올 수 있으므로 phantom dependencies가 생기지 않아. import x from 'lodash'라고 썼는데 pnpm add lodash를 하지 않았다면 즉시 실패해. 엄격함 자체가 기능인 셈이야.
Workspaces. pnpm은 뛰어난 monorepo 지원을 제공해. 저장소 루트의 pnpm-workspace.yaml에 하위 패키지를 선언하고 루트에서 pnpm install을 실행하면 모두의 의존성을 설치하면서 공통 패키지는 저장소를 통해 공유해. pnpm -r build는 모든 workspace에서 스크립트를 실행하고, pnpm --filter web dev는 이름이 web인 패키지만 대상으로 해. 콘텐츠 주소 저장소와 결합하면 큰 monorepo 설치가 npm보다 훨씬 빨라져.