본문 바로가기
C.W.K.
Stream
Lesson 01 of 05 · published

pnpm이 npm의 어떤 문제를 해결할까

~11 min · pnpm, overview, javascript

Level 0입문자
0 XP0/55 lessons0/16 achievements
0/80 XP to next level80 XP to go0% complete

pnpm, 즉 Performant npm은 npm을 많이 쓰는 개발자가 겪는 두 가지 구체적인 문제를 해결하려고 만들어졌어. 바로 낭비되는 디스크 공간phantom dependencies야. 같은 package.json을 쓰면서 두 문제를 해결하고 설치도 빨라서, 이 퀘스트에서 npm을 떠나는 가장 부담 없는 경로야.

디스크 공간. npm은 패키지를 각 프로젝트의 node_modules에 복사해. 프로젝트 열 개가 React를 쓰면 React도 열 번 저장될 수 있지. pnpm은 각 패키지 버전을 ~/.pnpm-store/의 전역 콘텐츠 주소 저장소에 한 번만 넣고, 프로젝트의 node_modules에는 hard link를 만들어. 여러 경로가 inode 수준에서 같은 실제 파일을 공유하므로 디스크 사용량이 전체적으로 50~70% 줄고, 이미 받은 바이트를 재사용해 설치도 훨씬 빨라져.

Phantom dependencies. npm의 평평한 node_modules에서는 package.json에 없는 패키지도 우연히 불러올 수 있어. pnpm은 엄격한 중첩 구조를 사용해 직접 선언한 패키지만 접근하게 해. 코드에 import x from 'lodash'가 있는데 pnpm add lodash를 하지 않았다면 즉시 실패해. 이 엄격함 자체가 기능이야.

2025년 1월에 나온 pnpm v10은 기본 보안도 강화했어. postinstall 같은 lifecycle script는 패키지별로 허용하지 않으면 실행되지 않아. 악성 패키지의 postinstall이 설치 때마다 임의 코드를 실행하던 공급망 공격 경로를 크게 줄인 변화야. 모든 곳에 SHA256 해시를 쓰고, 더 빠른 최초 설치를 위한 실험적 Global Virtual Store도 제공해.

pnpm은 npm과 같은 package.json을 읽고, package-lock.json 대신 pnpm-lock.yaml을 사용해. 명령 인터페이스도 대부분 바로 대응하므로 pnpm import 한 번으로 이전을 시작할 수 있어.

Code

pnpm이 디스크를 절약하는 방식·text
  npm:
    project-a/node_modules/react/    (복사본)
    project-b/node_modules/react/    (또 복사본)
    project-c/node_modules/react/    (또또 복사본)
    ... 10개 프로젝트, 10개 복사본

  pnpm:
    ~/.pnpm-store/v3/files/...react@19.0.0  (단일 물리 복사본)
    project-a/node_modules/react -> hard link
    project-b/node_modules/react -> hard link
    project-c/node_modules/react -> hard link
    ... 10개 프로젝트, 디스크에 1개 복사본

External links

Exercise

디스크에 JavaScript 프로젝트가 여러 개 있다면 'du -sh */node_modules'를 실행해. 합계 가운데 React, Next, lodash, TypeScript의 중복 사본이 얼마나 될지 추정해 봐. 그만큼이 pnpm의 콘텐츠 주소 저장소가 줄일 수 있는 공간이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.