최근에 한 npm과 yarn에 대한 고뇌를 해보신 분을 우대한다는 공고문을 본 적이 있다. 이 과정 속에서 yarn에 대해서 간단하게 찾아봤었고 yarn이 좋나? 라는 생각을 했었다. 심지어 이것에 관련해서 친구와 다른 분들과도 토의도 나눠 봤었는데 다들 yarn이 속도도 빠르다면서 좋다고 왜 npm을 아직 쓰냐고 얘기를 들었었다. 난 yarn이 속도가 빠르다는 이유에 빠르기만하다고 진짜 왜 쓰는지 궁금증이 생기게 되어 이 글을 쓰게 되었다.
npm은 (Node Package Manger)의 약자로 명령어로 자바스크립트 라이브러리를 설치하고 관리하는 패키지 매니저다.
개발자는 단 몇줄의 명령어료 기존의 공개된 모듈들을 설치하고 활용할 수 있다
npm을 사용하면
npm install [라이브러리명]
를 통해서 사용하고자 하는 라이브러리를 이용할 수 있다.
Node.js는 크롬 v8 자바스크립트 엔진으로 빌드된 런타임이라고 한다. 노드를 통해 다양한 자바스크립트 애플리케이션을 실행할 수 있다. 여기서 Node.js는 Server Side 언어가 아니다. 프로그램(환경)이다.
비동기식으로 처리되며 내장 HTTP 서버 라이브러리를 포함하고 있어 웹서버에서 별도 아파치같은 소프트웨어 서비스 없이 동작하는 것이 가능하며, 보통 백엔드 개발에 쓰이는 언어이다.
ex) Express.js
2016년 페이스북에서 개발한 Javascript 패키지 매니저이다. Yarn은 npm과 마찬가지로 패키지의 저장소를 제공하면서 시스템 의존 패키지를 설치하고 업데이트 할 수 있도록 도와준다.
yarn add [라이브러리명]
npm의 단점으로 생각하는 속도, 보안성을 해결하기 위해 흔히들 쓴다고 한다.
사실 눈으로 봐도 속도차이나는건 인정하지만 직접 확인해보고 싶어서 npm과 yarn에 관련해서 속도 차이를 측정해 보았다.
(Window 환경에서 PowerShell에서 Vite 설치 기준으로 속도를 측정해보았다.)
Measure-Command { npm create vite my-vite-project }
>>
npm WARN config global `--global`, `--local` are deprecated. Use `--location=global` instead.
Days : 0
Hours : 0
Minutes : 0
Seconds : 48
Milliseconds : 166
Ticks : 481667586
TotalDays : 0.000557485631944444
TotalHours : 0.0133796551666667
TotalMinutes : 0.80277931
TotalSeconds : 48.1667586
TotalMilliseconds : 48166.7586
Measure-Command { yarn create vite my-vite-project }
error create-vite@5.0.0: The engine "node" is incompatible with this module. Expected version "^18.0.0 || >=20.0.0". Got "16.16.0"
error Found incompatible module.
Node version이 16.16.0일때 Yarn에서 node 버전이 지원되지 않아 속도 측정 상황에서 문제가 발생하는 상황이 생겼다.
Measure-Command { npm create vite my-vite-project }
Days : 0
Hours : 0
Minutes : 0
Seconds : 34
Milliseconds : 671
Ticks : 346713218
TotalDays : 0.000401288446759259
TotalHours : 0.00963092272222222
TotalMinutes : 0.577855363333333
TotalSeconds : 34.6713218
TotalMilliseconds : 34671.3218
Measure-Command { yarn create vite my-vite-project }
Days : 0
Hours : 0
Minutes : 0
Seconds : 11
Milliseconds : 711
Ticks : 117118814
TotalDays : 0.00013555418287037
TotalHours : 0.00325330038888889
TotalMinutes : 0.195198023333333
TotalSeconds : 11.7118814
TotalMilliseconds : 11711.8814
확연히 속도가 차이난다는 것을 볼 수 있다.
Yarn이 패키지를 설치할 때 캐시를 사용하는 점이 크다. Yarn은 패키지를 한 번 다운로드 후 해당 패키지를 로컬 캐시에 저장한다. 이후 동일한 패키지가 필요할 때 다시 다운로드하지 않고 캐시에서 사용하게 된다.
이 캐시 메커니즘은 패키지 의존성을 효율적으로 관리할 수 있게 해주지만, 캐시가 크기가 커질수록 메모리와 디스크 공간을 더 많이 사용하게 된다. 특히 프로젝트의 규모가 크거나 의존성이 많은 경우 Yarn이 더 많은 메모리를 필요로 할 수 있다는 점이다.
또한 병렬로 패키지를 설치하려고 시도하기 때문에 추가적인 메모리를 사용할 수 있다는 점이다.
위에서 진행했던 속도 측정처럼 버전 문제 때문에 지원을 하지 못하는 경우가 있었다.
그래서 규모가 큰 프로젝트 이거나 대기업에서 해왔던 프로젝트일 경우 오히려 npm이 호환성면에서는 조금 더 유리하지 않을까 라는 생각이 들었다.
결국 여러 블로그 글들을 찾아보면 개발자들의 취향차이와 자기 상황에 맞게 쓰면 된다라는 말이 틀린 말이 아니라는 것이다.
최근 나는 pnpm이란 패키지 매니저에 주목하고 있다. 여러 사람들과 토의를 거치며 pnpm이라는 패키지 매니저를 처음 알게 되었는데 pnpm은 JavaScript 및 TypeScript 프로젝트를 위한 패키지 매니저 중 하나이다.
pnpm을 사용하려면 먼저 설치해야 한다.
npm install -g pnpm
이후 설치가 완료 되면 프로젝트 디렉토리에
pnpm install
이 명령을 통해 프로젝트의 package.json 파일에 명시된 종속성들을 설치한다. 나머지 사용법은 npm과 유사하다.
npm (Node Package Manager)과 비슷하지만 일부 차이점이 있다.
이미지 출처: https://pnpm.io/benchmarks
pnpm사이트의 benchmark에서 가지고 온 사진이다. 이 사진들을 보면 npm과 yarn을 비교했을때 준수한 속도 처리를 가지고 있다.
현재 추세를 보면 다운로드 수도 급증하는 추세이기도 나름 괜찮은 사용량을 기록하고 있다.
pnpm도 단점이 존재한다.
사실 결과론적으로 말하자면 취향껏 쓰라고 말하고 싶다. 어떻게 보면 이것이 프론트엔드의 매력이지 않을까 싶다. 자바스크립트 패키지 매니저에 여러 종류가 있고 그만큼의 서로 장단점이 존재한다. 그래서 사실 꼭 이거 써야된다라고 말하기 어렵다.
우스갯소리로 Vue.js가 한창 유행할 때 Vue를 쓰던 개발자들이 많았고
React.js가 한창 쓰일 때 React.js 쓰는 개발자도 많았고
TypeScript가 떠올랐을 때 TypeScript 쓰는 개발자가 현재 많은 것처럼 결국에 걍 유행따라 가는게 맞는것 같다.
프론트엔드라는 얕아보이지만 실제로는 거대한 깊은 바다처럼 언젠간 이런 빌드 패키지 매니저라던가 여러 기능들을 주목하면서 쓰다 보면 어느순간엔 프론트엔드 관련 지식이 늘어나 있는 내 자신을 보지 않을까 라는 생각이 들면서 이 글을 마무리 한다.