[Package Manager] Pnpm

세나정·2024년 5월 19일
0

Package-Manager

목록 보기
3/3

저번 yarn에 이어 이번엔 Pnpm에 대해 알아볼 예정임 이번에 공부를 해보니 yarn에 비해 (내가 npm에 친숙한 건지..) 간단한 설명과 빠른 이해가 됐던 것 같다! 그래도 기억은 기록을 따라가지 못하니 얼른 적기나 하겠다


Pnpm

pnpm이란 한마디로 표현하면 빠르고 효율적인 JS 패키지 매니저!

1. pnpm이란?

- PNPM (Performent Node Package Manager)

PNPM(Persistent Node Package Manager)은 2016년에 처음 출시
PNPM은 NPM의 단점을 보완하기 위해 개발되었음

Node.js 생태계에서 효율적인 패키지 관리와 높은 성능을 제공하는 패키지 관리자

npm (Node Package Manager)이나 Yarn과 비슷한 역할을 하지만, 몇 가지 핵심적인 차이점 존재한다고 함
결론적으로 pnpm의 주요 목적은 더 효율적인 디스크 사용과 더 빠른 설치 속도를 제공하는 것!

- pnpm와 npm의 차이

패키지 저장 방식

NPM : 각 프로젝트에 필요한 모든 패키지를 프로젝트의 node_modules 폴더에 설치함 이로 인해 여러 프로젝트가 동일한 패키지를 사용할 때 중복 저장이 발생

PNPM : 모든 패키지를 전역적으로 하나의 저장소에 저장하고, 각 프로젝트의 node_modules 폴더에는 심볼릭 링크를 사용하여 패키지를 참조함 이를 통해 디스크 공간을 절약하고 중복 설치를 방지

성능

NPM : 패키지를 직접 설치하므로 대규모 프로젝트에서는 설치 시간이 오래 걸릴 수 있음

PNPM : 패키지 설치 시 하드 링크를 사용하여 빠르게 설치, 패키지의 파일 시스템 링크를 통해 중복을 피하고, 설치 속도를 크게 개선

의존성 해결

NPM : 플랫 node_modules 구조를 사용하여 모든 의존성을 프로젝트 루트에 설치 이런 방식은 의존성 충돌 문제를 유발

PNPM : 의존성을 엄격하게 격리하여 설치 각 패키지가 필요한 의존성을 정확하게 설치하고, 의존성 충돌을 최소화

프로젝트 구조

NPM : 의존성 트리 구조를 단순화하기 위해 최대한 플랫하게 설치

PNPM : node_modules 폴더 내에 의존성 트리를 명확하게 유지하여 모듈 간의 관계를 더 잘 이해할 수 있게 함

워크스페이스 지원

NPM : 최근 버전에서 워크스페이스를 지원하지만, 기능이 아직 제한적일 수 있습니다.
PNPM 워크스페이스 기능을 강력하게 지원하여 모노레포(monorepo) 환경에서 여러 패키지를 효율적으로 관리할 수 있습니다.

결론

PNPM은 NPM보다 디스크 공간을 효율적으로 사용하고, 패키지 설치 속도가 빠르며, 의존성 관리가 더 엄격하고 정

이러한 장점으로 인해 대규모 프로젝트나 모노레포 환경에서 PNPM을 선호하는 경우가 많다고 함

2. 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 등이 있습니다. 장점으로는 일관된 개발 환경, 쉬운 코드 공유, 단일 빌드 설정 등이 있지만, 대규모 프로젝트에서는 복잡성이 증가할 수 있습니다.

3.pnpm의 단점

- 호환성 문제

Yarn Berry와 마찬가지로 일부 프로젝트나 패키지가 pnpm과 완벽하게 호환 되지 않음

- 러닝 커브

얘는 뭐 누구나 다 있으니까.. 하지만 해야지 어떡해

- 커뮤니티 및 생태계

npm이나 yarn에 비해 상대적으로 작은 커뮤니티와 생태계를 지님

- 종속성 문제 해결의 어려움

너무 엄격한 의존성 관리방식 때문에, 일부 패키지의 버전 충돌을 해결하는데에 많은 노력이 필요할 수 있음, 이는 특정 버전의 패키지가 다른 패키지와 호환되지 않을 때 더 뚜렷

profile
기록, 꺼내 쓸 수 있는 즐거움

0개의 댓글

관련 채용 정보