
TL;DR
hard-link 기반의 효율적인 의존성 관리 툴이다.
빠른 속도, 적은 용량을 사용하는 패키지 관리자이며 MonoRepo에 유용하다.
Pnpm (Performant npm)
공식문서의 Motivation 항목이다.
아래의 그림으로 Pnpm의 특징을 이해할 수 있다.
중앙 저장소에 의존성을 설치한다.
그리고 /node_modules에서는 hard-link를 통해 중앙 저장소를 참조한다.
한 번만 설치하면 되기 때문에, 속도와 용량이 줄어드는 건 당연한 이야기이다.
모노레포를 운용하게 된다면, 이 효율성은 더욱 체감이 될 것이다.
그렇다면, npm과 yarn은 이 문제를 몰랐을까?
Npm, Yarn과 /node_moduels의 투쟁기

Npm과 Yarn의 초기버전에도 이러한 문제를 인지하고 있었다.
그래서 종속모듈을 끌어올려서(hoist) 중복을 최소화하는 방식을 선택했다.
효율적이지만 사용하지 않는 모듈또한 node_modules에서 포함되는
유령 의존성(Phantom dependency) 문제가 발생했다.
Yarn_berry(Yarn v2)의 PnP와 Zero-install
Yarn-berry(Yarn v2)에서는 /node_modules 대신, zip으로 압축하는 과감한 선택을 한다.
그리고 .pnp.cjs 파일을 활용하여 zip의 의존성을 효율적으로 처리한다.
의존성이 zip으로 관리된다는 건, git으로 tracking이 된다는 것이다.
즉, 의존성을 설치할 필요가 없다. CI/CD 과정에서 의존성을 설치할 필요가 없어진다.
Npm와 Yarn의 추격에도 건재한 Pnpm
pnpm의 효율적인 방식은 npm과 yarn에도 많은 영향을 끼쳤다.
Pnp, Zero-install, workspace 등등.. 필요한 기능들은 다 구현이 되었다.
그럼 Pnpm의 인기는 사그라들지 않았을까?
State of JS 2024의 Report에 따르면 여전히 건재하다.


MonoRepo의 tool로서도 좋은 평가를 받는다.
Retenation 기반의 Rank에서도 S급을 판정 받았다.
Yarn-Berry의 pnp와 Zero-install 또한 혁신적이지만, zip방식, pnp.cjs등 러닝 커브가 높고 어색하다.
Pnpm은 기존의 /nodemodules 구조를 유지하면서 해결이 가능하다.
Yarn은 안정적인 구조, 다채로운 plugin 그리고 러닝커브가 존재한다.
Pnpm은 준수한 구조와 속도 그리고 러닝커브가 적다.
Simple함이 중요한가, 정교함이 중요한가의 호불호인 것 같다.
우리 프로젝트에는 Simple이 더 중요해서 Pnpm을 사용하기로 했다.
관련 아티클
패키지 매니저의 과거, 토스의 선택, 그리고 미래
토스는 왜 패키지 매니저로 Yarn을 선택했을까요? 이번 라이트닝 토크에서는 JavaScript의 패키지 매니저, 동작 방식, 그리고 토스의 선택과 앞으로의 방향성에 대해 이야기해 보려고 해요.
toss.tech
State of JavaScript 2024: Libraries
2024.stateofjs.com
Fast, disk space efficient package manager | pnpm
Fast, disk space efficient package manager
pnpm.io
'프로그래밍 > 도구' 카테고리의 다른 글
| UV: Rust 기반 python_manager (1) | 2024.12.23 |
|---|