- 프로젝트 종속성(패키지)을 관리하는 시스템
- 패키지 설치 및 제거를 원활하게 처리
- 파일 시스템에서 패키지가 저장되는 위치 관리
- 패키지가 중복 설치되지 않도록 처리
- 자신만의 패키지 게시 가능
- 패키지에 보안 취약점이 있는지 확인 가능
- 패키지의 버전 관리에 용이
- 글로벌 (
-g
or--global
orglobal
등) 옵션을 지정하여 전역으로 설치할 수도 있음 - 개발 용도로만 쓰이는 패키지는
--save-dev
or-D
or--dev
등의 옵션을 주어 빌드에 포함되지 않게 할 수 있음
- 최초의 패키지 매니저
- Node.js에 기본으로 내장되어 있음
- 패키지의 데이터를 가진
package.json
, 패키지들을 설치하는 폴더인node_modules
등의 개념들을 최초로 도입 - 패키지 설치 시 순서대로 설치하기 때문에 중복되는 의존성이 생길 수 있음 -> 유령 의존성
- npm의 보안 취약점과 속도를 개선한 패키지 매니저
- 패키지를 병렬적으로 설치
- 1.x 까지의 버전 (레거시)
- 여전히 node_modules를 사용하여 유령 의존성 문제는 해결되지 않았음
- 2.x 이후의 버전
- 패키지를 압축 파일 (.zip)로 저장하여 node_modules를 사용하지 않는 PnP (Plug n Play) 기능 제공 -> 속도 및 용량 개선
yarn install
을 실행하지 않고도 패키지를 사용할 수 있는 Zero Install 기능 제공 -> 패키지를 git 등으로 관리할 수 있음- workspace 기능 제공 -> 모노레포에 적합
- npm의 대체품으로 만들어졌기 때문에 npm으로 관리하는 프로젝트는 바로 pnpm으로 전환 가능
- 여러 개의 node_modules를 만들지 않고, 전역 저장소에 한 번만 설치 후 필요한 곳에서 심볼릭 링크로 연결 -> 모노레포에 적합
- 의존성 트리의 깊이를 줄이는 방식으로 성능 개선
기능 | pnpm | yarn | npm |
---|---|---|---|
워크스페이스 지원 | ✔️ | ✔️ | ✔️ |
격리된 node_modules | ✔️ - 기본값 | ✔️ | ✔️ |
호이스팅된 node_modules | ✔️ | ✔️ | ✔️ - 기본값 |
피어 자동 설치 | ✔️ | ❌ | ✔️ |
Plug'n'Play | ✔️ | ✔️ - 기본값 | ❌ |
Zero-Installs | ❌ | ✔️ | ❌ |
의존성 패치 | ✔️ | ✔️ | ❌ |
Node.js 버전 관리 | ✔️ | ❌ | ❌ |
lockfile 보유 | ✔️ - pnpm-lock.yaml | ✔️ - yarn.lock | ✔️ - package-lock.json |
재정의 지원 | ✔️ | ✔️ - resolution을 통해 | ✔️ |
Content-addressable 저장소 | ✔️ | ❌ | ❌ |
동적 패키지 실행 | ✔️ - pnpm dlx를 통해 | ✔️ - yarn dlx를 통해 | ✔️ - npx를 통해 |
부작용 캐시 | ✔️ | ❌ | ❌ |
Listing licenses | ✔️ - Via pnpm licenses list | ✔️ - Via a plugin | ❌ |
- https://developer.mozilla.org/en-US/docs/Learn/Tools_and_testing/Understanding_client-side_tools/Package_management
- https://dev-boku.tistory.com/entry/%EB%B2%88%EC%97%AD-JavaScript-%ED%8C%A8%ED%82%A4%EC%A7%80-%EB%A7%A4%EB%8B%88%EC%A0%80-%EB%B9%84%EA%B5%90-npm-Yarn-%EB%98%90%EB%8A%94-pnpm
- https://blog.logrocket.com/javascript-package-managers-compared/
- https://pnpm.io/ko/feature-comparison