본문 바로가기
플랫폼/Node.js

[Node.js] 자바스크립트 패키지 매니저(npm, yarn, pnpm)

by minhyeok.lee 2024. 7. 31.
반응형

npm vs yarn vs pnpm


 

1. 자바스크립트 패키지 매니저

- Frontend 개발자가 사용하는 자바스크립트 패키지 매니저: npm, yarn, pnpm

- 프로젝트 하나가 수십, 수백개의 패키지에 의존

- Node.js실행환경(runtime)에서 돌아감

- package.json이라는 파일에 프로젝트가 의존 및 패키지 목록 명시

- 패키지는 프로젝트의 node_modules디렉토리에 저장


2. npm (Node Package Manager)

1. Node.js의 표준 패키지 매니저

2. Node.js 설치 시 같이 설치되는 기본 패키지 매니저

 

2.1 npx (Node Package Runner)

- npm에서 제공해주는 하나의 도구

- 패키지의 최신버전 파일을 불러와 설치 및 실행하고 실행된 후 해당 패키지 제거

- create-react-app과 같이 모듈이 많고 업데이트가 잦은 경우 npx를 이용해 설치하는 것을 권장


3. yarn (Yet Another Resource Negotiator)

1. npm의 단점 보완을 위해 Facebook에서 만듬

 - 성능 및 설치 속도: yarn은 병렬 실행, 캐시 사용으로 중복 데이터 다운로드 하지 않음

 - 보안성 취약

    - npm: 잠금 파일 없음, 패키지 설치 시 자동으로 포함된 의존성 패키지 설치하며 버그 발생

    - yarn: yarn.lock으로 모든 디바이스에 같은 패키지 설치하는 것을 보장 및 버전 차이로 인한 버그 방지

 - 이후 npm이 많은 단점을 개선하여 속도 차이가 많이 나지 않고 package.lock.json이라는 잠금 파일 제공

2. 별도의 설치가 필요하고 공식적으로 더 이상 기능 추가가 없음 (이후 나온 버전이 yarn-berry)


3.1 이후 npm과 yarn에서 발생하는 유령 의존성

- 유령 의존성

   - 중복해서 설치되는 node_modules를 아끼기 위해 호이스팅 기법을 사용

   - 그로 인해 직접 의존하고 있지 않은 라이브러리를 require()할 수 있는 현상



3.2 yarn Berry

- Facebook에서 발표한 yarn의 ver2

- plug'n Play(PnP)라고 불리는 새로운 패키지 관리 방식으로 유령 의존성에 관한 문제 해결

   - 패키지를 프로젝트의 node_modules디렉토리에 저장하지 않음

   - 패키지들에 대한 의존성 정보는 .zip파일로 압축, .yarn/cache폴더에 저장, 이를 찾기 위한 정보를 .pnp.cjs파일로 기록


4. pnpm (performant npm)

- npm과 yarn의 비효율을 개선한 노드 패키지 매니저

   - npm과 yarn으로 여러 프로젝트를 관리하면 그 프로젝트들이 모두 같은 의존성을 사용하여 비효율적

- plug'n Play(PnP) 지원

- content-addressable file store

    - pnpm은 글로벌 저장소인 ~/.pnpm-store에 모든 패키지를 저장하는 저장소를 두고 중첩된 패키지는 단 한번만 설치

    - 사용하고자 하는 프로젝트에 symbolci link(sym link)를 만들어 효율적으로 패키지를 관리

   - 다른 버전의 라이브러리를 사용하는 경우 저장소에 있는 라이브러리가 update가 되지 않고 다른 버전의 라이브러리만 새로 추가

 

장점

1. 불필요한 I/O 과정을 없애 빠르고 효율적

2. 패키지 중복 설치를 하지 않음으로 사용 용량이 적음

3. npm과 사용법이 비슷함

4. 모노레포 사용시 package.json에 peerdependency를 명시해야 함

 


5. 결론

1. 정답은 없고 자신에게 맞는 것으로 사용

2. npm도 계속적으로 업데이트 되어 yarn과 pnpm의 좋은 기능을 가지고 오는 추세

3. npm vs yarn vs pnpm 중에 본인에게 맞는 것을 사용

반응형

댓글