저번 yarn에 이어 이번엔 Pnpm에 대해 알아볼 예정임 이번에 공부를 해보니 yarn에 비해 (내가 npm에 친숙한 건지..) 간단한 설명과 빠른 이해가 됐던 것 같다! 그래도 기억은 기록을 따라가지 못하니 얼른 적기나 하겠다
pnpm이란 한마디로 표현하면 빠르고 효율적인 JS 패키지 매니저!
PNPM(Persistent Node Package Manager)은 2016년에 처음 출시
PNPM은 NPM의 단점을 보완하기 위해 개발되었음
Node.js 생태계에서 효율적인 패키지 관리와 높은 성능을 제공하는 패키지 관리자
npm (Node Package Manager)이나 Yarn과 비슷한 역할을 하지만, 몇 가지 핵심적인 차이점 존재한다고 함
결론적으로 pnpm의 주요 목적은 더 효율적인 디스크 사용과 더 빠른 설치 속도를 제공하는 것!
NPM
: 각 프로젝트에 필요한 모든 패키지를 프로젝트의 node_modules 폴더에 설치함 이로 인해 여러 프로젝트가 동일한 패키지를 사용할 때 중복 저장이 발생
PNPM
: 모든 패키지를 전역적으로 하나의 저장소에 저장하고, 각 프로젝트의 node_modules 폴더에는 심볼릭 링크를 사용하여 패키지를 참조함 이를 통해 디스크 공간을 절약하고 중복 설치를 방지
NPM
: 패키지를 직접 설치하므로 대규모 프로젝트에서는 설치 시간이 오래 걸릴 수 있음
PNPM
: 패키지 설치 시 하드 링크를 사용하여 빠르게 설치, 패키지의 파일 시스템 링크를 통해 중복을 피하고, 설치 속도를 크게 개선
NPM
: 플랫 node_modules 구조를 사용하여 모든 의존성을 프로젝트 루트에 설치 이런 방식은 의존성 충돌 문제를 유발
PNPM
: 의존성을 엄격하게 격리하여 설치 각 패키지가 필요한 의존성을 정확하게 설치하고, 의존성 충돌을 최소화
NPM
: 의존성 트리 구조를 단순화하기 위해 최대한 플랫하게 설치
PNPM
: node_modules 폴더 내에 의존성 트리를 명확하게 유지하여 모듈 간의 관계를 더 잘 이해할 수 있게 함
NPM
: 최근 버전에서 워크스페이스를 지원하지만, 기능이 아직 제한적일 수 있습니다.
PNPM
워크스페이스 기능을 강력하게 지원하여 모노레포(monorepo) 환경에서 여러 패키지를 효율적으로 관리할 수 있습니다.
PNPM은 NPM보다 디스크 공간을 효율적으로 사용하고, 패키지 설치 속도가 빠르며, 의존성 관리가 더 엄격하고 정
이러한 장점으로 인해 대규모 프로젝트나 모노레포 환경에서 PNPM을 선호하는 경우가 많다고 함
pnpm은 패키지를 전역 저장소에 저장하고 프롲게트마다 패키지의 하드링크를 사용하여 디스크 공간을 절약함 (아래 상세 예시)
npm/yarn과 비교 했을 때 pnpm은 node_modules의 패키지가 중복으로 저장되지 않음
ex)
다음 세 개의 샘플 프로젝트가 있다고 하고 각 프로젝트가 pkg_1을 포함하고 있고 그것의 크기가 2MB일 때 npm과 yarn은 각 프로젝트 별로 모두 pkg_1을 포함하느라 총 6MB의 디스크를 차지
하지만 pnpm의 경우엔 별도의 저장소가 존재함 (.pnpm_store)
각 프로젝트에는 pkg_1에 대한 바로가기를 만듦 (심볼릭 링크)
따라서, 얘는 2MB로 해결 가능
pnpm은 병렬 다운로드, 효율적인 캐싱 매커니즘을 활용하여 매우 빠른 설치 속도를 자랑
무려, 네트워크가 느리거나 불안정 할 때도 안정적
pnpm은 pnpm-lock.yaml파일에 의존성 트리를 고정, 이를 통해 모든 개발 환경에서 동일한 의존성 트리를 보장하며 의존성 충돌을 방지함
pnpm은 의존성 설치 시, 프로젝트의 node_modules 구조를 플랫하게 만들지 않고 각 패키지의 의존성을 명확히 분리함 그렇기에 더욱 엄격하며 패키지 간의 충돌 가능성이 줄어듦
pnpm은 모노레포를 자연스럽게 지원하여, 여러 패키지를 하나의 저장소에서 관리할 때 의존성 설치와 관리를 효율적으로 수행 가능
모노레포?
모노레포(Monorepo)는 여러 프로젝트를 하나의 리포지토리(repository)에서 관리하는 방식입니다. 단일 코드베이스 내에서 여러 패키지나 애플리케이션을 포함하고 있어 코드의 재사용성과 관리 효율성을 높일 수 있습니다. 대표적인 모노레포 도구로는 Lerna, Nx, Bazel 등이 있습니다. 장점으로는 일관된 개발 환경, 쉬운 코드 공유, 단일 빌드 설정 등이 있지만, 대규모 프로젝트에서는 복잡성이 증가할 수 있습니다.
Yarn Berry와 마찬가지로 일부 프로젝트나 패키지가 pnpm과 완벽하게 호환 되지 않음
얘는 뭐 누구나 다 있으니까.. 하지만 해야지 어떡해
npm이나 yarn에 비해 상대적으로 작은 커뮤니티와 생태계를 지님
너무 엄격한 의존성 관리방식 때문에, 일부 패키지의 버전 충돌을 해결하는데에 많은 노력이 필요할 수 있음, 이는 특정 버전의 패키지가 다른 패키지와 호환되지 않을 때 더 뚜렷