쉼터

블로그 만드는 중입니다.
kr en

추천소개 - 가장빠른 NPM대체제 PNPM

가장 빠른 NPM대체제입니다. 알게 된지는 꽤 되었지만 실제로 적용해본지는 얼마 안 됐습니다.

주요 특징은 다음과 같습니다.

  1. 속도 - NPM보다 3배 빠릅니다. Yarn보다 빠릅니다.
  2. 용량 절약 - 프로젝트가 여러 개라도 모든 node_modules의 실제 파일은 공유됩니다.
  3. 모듈 추가 속도 - 프로젝트에 개개의 모듈 종속성 추가할 때 빠릅니다. 너무 좋습니다.
  4. 편의성 - npm을 pnpm으로 대체하기만 하면 사용할 수 있습니다!

1번 속도

Benchmarks결과를 보면 NPM과는 비교가 안되고 Yarn 보다 빠르거나 경우에 따라서 비슷하거나 수준입니다.

2번 용량

여러 개의 프로젝트가 node_modules의 실제 내용을 공유합니다. 하드가 엄청 절약이 됩니다. 프로젝트가 30개고 프로젝트당 node_modules가 300MB씩이면 9GB네요. pnpm은 node_modules내에 실제 파일 내용을 hard link로 해결하므로 pnpm을 사용하면 9GB가 300MB가 됩니다.

3번 모듈추가 속도

1번 속도도 속도지만 개개의 모듈을 추가할 때 속도가 정말 빠릅니다. 이미 다운로드하여놓은 모듈이면 너무 빠릅니다. 맨날 npm install lodadh 명령 내려놓고 한참을 멍하니 기다리던 세월이 야속하기만 하네요.

4번 편의성

프로젝트에 적용이 어렵지 않습니다. 먼저, pnpm을 설치하고

npm i -g pnpm

node_modules를 새로 만들어냅니다.

rm -rf node_modules
pnpm i

저는 개인적으로 2번 용량, 3번 모듈 추가 속도가 너무 좋았습니다. 불필요하게 중복되는 node_modules폴더들 용량 때문에 서버 스토리지가 낭비되는 현실이 너무 가슴 아팠고…(돈을 아끼고 싶었고…) 모듈 종속성 하나 추가 할때마다 강제 커피 한잔씩으로 카페인 과다 섭취로 저녁에 잠이 안 오는 불면증에 시달리는 게 너무 괴로웠습니다.

그리고 마지막으로 pnpm도입으로 인한 단점이 없네요. 후후…

단점 추가

참고로 아래 두가지 문제점은 팀에서 혼자만 PNPM을 사용할때 생기는 문제점입니다. 팀이 PNPM을 전격도입했을 경우는 여전히 단점이 없습니다.

NPM이나 Yarn과 동작 방식이 달라서 생기는 문제1

NPM이나 Yarn은 기본적으로 모든 종속된 모듈을 flatten시켜버립니다. package.json에 A,B모듈을 명시해놓고, A모듈에서 a,b를 쓰고 B모듈에서 c,d를 쓰면… 어플리케이션에서는 a,b,c,d를 명시하지 않아도 사용이 가능합니다.(모든 모듈이 node_modules아래에 인스톨되므로)

이건 중복된 모듈 인스톨을 방지하고 속도 향상을 도모하기 위해서 도입된 방식인데요. PNPM은 hard link를 통해서 각 모듈내에 종속성을 만들어내므로 방식이 조금 다릅니다. 어플리케이션에서는 package.json에 명시되지 않은 모듈은 사용할수 없습니다. PNPM이 버젼 충돌 문제의 소지가 적은 더 스마트한 방법입니다. 거기다 hard link덕분에 속도도 더 빠르죠!!

단, 혹시 팀이 Yarn이나 NPM을 쓰고 혼자만 별도로 PNPM을 쓰려고 하면 조심해야 합니다. 저같은 경우는, 어플리케이션에서 사용하지만 package.json에 명시되지 않는 모든 모듈을 직접 명시해주다보니 일일히 버젼을 확인해야 해서 고생했습니다. A모듈이 a(버젼 V1.1)를 사용해서 어플리케이션에서 a를 사용할수 있었는데. PNPM에서는 a를 사용할수 없으므로, package.json에 a를 직접 추가하니까 최신버젼인 V2.0이 추가되서 종속성이 깨지는 경우가 발생했엇습니다.

NPM이나 Yarn과 동작 방식이 달라서 생기는 문제2

Yarn은 yarn.lock이 존재합니다. 서버에 정식버젼을 릴리즈할때 개발에 사용된 버젼과 동일한 버젼으로 맞추기 위해서 사용하는 파일인데요.

예를 들어, package.json에 A모듈을 ~1.1.0으로 명시놓고 yarn명령을 치면 A모듈이 1.1.1가 설치되어 개발을 막 진행했습니다. 그리고나서 기능 구현을 마무리하고 서버로 릴리즈를 했는데… 그사이에 A모듈이 1.1.2가 릴리즈되면서 작은 변화로 동작 방식이 달라져버렸습니다(버그죠버그). 이때 yarn.lock파일이 없다면 1.1.2가 설치되지만, yarn.lock파일에 1.1.1이라고 명시되어 있다면 1.1.1이 설치가 되게 됩니다. 좋은 개념이죠.

근데 문제는 PNPM은 yarn.lock파일이 아니라 pnpm-lock.yaml파일을 동일한 목적으로 생성합니다. 내가 개발중에 쓰는 module버젼은 pnpm-lock.yaml파일에 명시되어 있는데, 다른 팀원들은 yarn.lock파일에 명시된 버젼을 사용하는거죠. 버젼이 달라질 소지가 있어서 주의해야 합니다.

pnpm으로 인생을 절약하세요.

comments powered by Disqus