npm 과 pnpm 의 차이에 대해 알아보기에 앞서 우선 패키지 매니저의 역할에 대해 알아봅시다.

패키지 매니저란 프로젝트의 의존성 파일(예: package.json)을 기반으로, 필요한 패키지를 다운로드하고 이를 node_modules 폴더에 설치하여, 프로젝트에서 효율적으로 사용할 수 있도록 관리하는 도구입니다.

우선 npm 이 패키지를 node_modules 폴더에 어떻게 관리하는지를 알아봅시다.

예를 들어 A패키지, B패키지, C패키지를 다운로드 받는다고 가정해보면,

기본적으로 A패키지가 의존하고 있는 다른 패키지들은 node_modules/A/… 에 설치가 되고 B패키지가 의존하고 있는 다른 패키지들은 node_modules/B/… 에 설치가 됩니다.

만약에 A패키지도 C패키지를 의존하고 B패키지도 C패키지를 의존한다면 어떻게 될까요?

원래대로라면

node_modules/
├── A/
│   └── node_modules/
│       └── (A의 의존성 패키지들)
├── B/
│   └── node_modules/
│       └── (B의 의존성 패키지들)
└── C/

이렇게 각각 설치가 되어야 할 것입니다.

하지만 npm 은 이렇게 중복으로 설치하지 않고 C패키지를 node_modules 의 루트경로로 끌어올립니다.

이러한 과정을 호이스팅이라고 합니다. 호이스팅은 중복된 의존성 설치를 방지하고 디스크 공간을 절약하며, 모듈 로딩 속도를 향상시키는 데 도움이 됩니다.

node_modules/
├── A/
├── B/
└── C/ (호이스팅된 공통 의존성)