npm을 사용하니까 의존성을 설치하는 과정에서 CI/CD 빌드 파이프라인 시간이 늘어나 배포 효율이 감소하는 문제가 발생했다. 그래서 npm, yarn, pnpm 패키지 매니저를 각각 비교해보고 적절한 것을 도입하기로 했다.
먼저, nodeJS는 Chrome V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임 환경이다.
런타임: 프로그래밍 언어가 구동되는 환경, 자바스크립트의 런타임은 웹 브라우저와 nodeJS로 구성되어있다.
프론트엔드 개발환경에서 nodeJS를 쓰는 이유는 최신 스펙으로 개발할 수 있고, 빌드 자동화, 개발 환경의 커스터마이징이 가능하다.
nodeJS를 사용한 node package manager로 패키지 매니저의 시초이다. 즉, 프로젝트의 의존성을 수동으로 다운로드해야 했던 불편함을 개선한 패키지 매니저이다. 패키지 매니저의 시초이기 때문에 오랜 시간 아주 많은 사용자들이 사용해 와서 생태계가 풍부하다.
nodeJS에서 사용할 수 있는 모듈들을 패키지화하여 모아놓은 저장소 역할과 패키지 설치 및 관리를 위한 cli(command line interface)를 제공한다.
npm으로 프로젝트를 구성할때의 디렉터리 구조는 아래와 같다.
my-app/
├─ node_modules/
├─ package.json
└─ package-lock.json
npm -v
로 버전확인 가능npm i lodash mongoose express
를 했을때의 예시이다.my-app
├─ express@4.18.2
│ ├─ accepts@1.3.8
│ │ ├─ mime-types@2.1.35
│ │ │ └─ mime-db@1.52.0
│ │ └─ negotiator@0.6.3
│ └─ body-parser@1.20.2
│ ├─ bytes@3.1.2
│ └─ debug@2.6.9
├─ lodash@4.17.21
├─ mongoose@6.8.0
│ ├─ mongodb@5.4.0
│ │ ├─ bson@5.7.0
│ │ └─ other-dependencies...
│ └─ kareem@2.3.4
기존의 npm의 단점을 보완하면서 2016년에 페이스북 개발자들과 구글 개발자들이 함께 내놓은 패키지 매니저이다.
yarn으로 프로젝트를 구성할때 디렉터리의 구조는 아래와 같다.
my-app/
├─ node_modules/
├─ package.json
└─ yarn.lock
npm i --global yarn
명령어로 npm을 통한 설치가 가능하다.brew i yarn
명령어로 설치할 수 있다.my-app/
├─ .pnp.cjs # PnP 설정 파일
├─ .yarn/ # 의존성 저장소
├─ package.json
└─ yarn.lock
2017년에 Zoltan Kochan이란 개발자가 내놓은 패키지 매니저이다.
pnpm으로 프로젝트를 구성할때 디렉터리의 구조는 아래와 같다.
my-app/
├─ node_modules/
├─ package.json
└─ yarn.lock
위 내용을 차트로 비교하면 다음과 같다. (출처: pnpm 공식문서, v9 기준)
node_modules 폴더 크기 350mb(0.35gb)가 305mb로 줄었다.
time 명령어를 사용하여 출력된 시간을 비교했다. (최소 3~5회 테스트 후 평균 값을 계산하면 더 정확하다.)
# Clean the environment
rm -rf node_modules package-lock.json pnpm-lock.yaml
# Test npm
time npm install
# Clean again
rm -rf node_modules package-lock.json pnpm-lock.yaml
# Test pnpm
time pnpm install
참고로, npm과 pnpm 모두 이전 설치 기록을 기반으로 캐시된 데이터를 사용하기 때문에 node_modules, package-lock.json, pnpm-lock.yaml
이 존재하면 새로 설치하는 대신 기존 데이터를 활용하므로 실제 설치 속도를 측정하지 못한다. 그래서 rm -rf
명령어로 해당 파일들을 제거한 상태에서 테스트해야 정확한 비교가 가능하다.
npm install 16.26s user 17.42s system 47% cpu 1:11.66 total
pnpm install 7.80s user 15.12s system 86% cpu 26.589 total
참고자료