동기

디스크 공간 절약#

pnpm 콘텐츠 주소 지정 스토어의 그림. 그림에는 node_modules가 있는 두 개의 프로젝트가 있습니다. 이 node_modules 디렉터리의 파일은 콘텐츠 주소 지정 스토어에 있는 동일한 파일에 대한 하드 링크입니다.

npm을 사용할 때 종속성을 사용하는 프로젝트가 100개 있는 경우 해당 종속성의 사본 100개가 디스크에 저장됩니다. pnpm을 사용하면 의존성이 content-addressable 저장소에 저장되므로, 다음을 따릅니다.

  1. 다른 버전의 의존성에 여러분이 의존하는 경우, 다른 파일만이 저장소에 추가됩니다. 예를 들어, 패키지에 100개의 파일이 있고 새 버전에서 그중 하나의 파일만 변경되었다면, pnpm update는 단 하나의 변경을 위해 전체 종속성을 복제하는 대신 스토어에 1개의 새 파일만 추가합니다.
  2. 모든 파일은 디스크 상에서 단일 위치에 저장됩니다. 패키지가 설치될 때 그 파일들은 단일 위치에서 하드링크되며 추가적인 디스크 공간을 소비하지 않습니다. 이를 통해 프로젝트 간에 동일한 버전의 의존성을 공유할 수 있습니다.

결과적으로, 여러분의 디스크 공간은 프로젝트와 의존성의 수에 비례하여 더 많이 절약되고 더 빠르게 설치할 수 있습니다!

설치 속도 향상#

pnpm은 세 단계로 설치를 수행합니다:

  1. 종속성 해석. 필요한 모든 의존성을 식별해 저장소로 가져옵니다.
  2. 디렉터리 구조 계산: node_modules 디렉터리 구조는 종속성을 기반으로 계산됩니다.
  3. 의존성 연결: 나머지 모든 종속성을 가져와 스토어에서 node_modules로 하드 링크합니다.

pnpm 설치 과정의 그림. 패키지는 가능한 한 빨리 해석되고, 가져와지고, 하드 링크됩니다.

이 방식은 모든 종속성을 해석하고, 가져오고, node_modules에 쓰는 기존의 세 단계 설치 과정보다 훨씬 빠릅니다.

Yarn Classic이나 npm 같은 패키지 관리자가 종속성을 설치하는 방식의 그림.

평탄하지 않은 node_modules 디렉토리 생성#

npm 또는 Yarn 클래식을 통해 의존성을 설치할 때, 모든 패키지는 모듈 디렉토리의 루트로 호이스트됩니다. 결과적으로, 소스 코드는 프로젝트에 의존성으로 추가되지 않은 의존성에 접근할 수 있습니다.

기본적으로, pnpm은 symlink를 사용하여 프로젝트의 직접적인 의존성만을 모듈 디렉토리의 루트로 추가합니다.

pnpm이 생성한 node_modules 디렉터리의 그림. 루트 node_modules의 패키지는 node_modules/.pnpm 디렉터리 내부 디렉터리에 대한 심볼릭 링크입니다

고유한 node_modules 구조를 pnpm이 생성하는 방식과 그것이 Node.js 생태계에서 잘 작동하는 이유에 대해 자세히 알고 싶다면 다음을 읽어보세요:

팁

사용 중인 도구가 심볼릭 링크와 잘 작동하지 않는 경우에도 pnpm을 사용할 수 있으며, nodeLinker 설정을 hoisted로 지정하면 됩니다. 이것은 pnpm이 npm 및 Yarn 클래식에서 생성한 것과 유사하게 node_modules 디렉토리를 생성하도록 지시합니다.