아니 일단 들어봐! - package manager 알아보기
자바스크립트로 개발을 해보았다면 한번쯤은 npm, yarn, yarn berry, pnpm을 들어봤을 것이다
이것들은 패키지 매니저(package manager)라고 부른다
js를 사용하는 프로젝트에서 라이브러리, 모듈 그리고 플러그인을 설치하고 관리하는데 사용한다
패키지 설치
프로젝트에 사용하는 패키지들을(라이브러리, 플러그인 등) 설치 할 수 있게 한다
의존성 관리
설치하려는 패키지가 다른 패키지에 의존하고 있으면 의존하고 있는 패키지까지 알아서 설치해준다
버전 관리
패키지의 다양한 버전을 관리한다 이로 인해 패키지의 다양한 버전을 설치해 사용할 수 있다
ex. react-query V5, V4...
스크립트 실행
프로젝트에서 미리 정의해둔 스크립트를 실행하는 기능을 제공한다
js 패키지 매니저의 종류는 npm, yarn, yarn berry, pnpm이 대표적이다
npm
npm(Node Package Manager)은 node.js의 표준 패키지 매니저로 node.js 안에 내장되어 있어 node.js를 설치하면 사용할수 있다
npm의 단점으로는 node_modules의 크기가 크다는 단점이 있다
그래서 npm은 node_modules의 크기를 줄이기 위해 중복되는 패키지들을 줄이려고 hoisting 기법을 사용해 줄이고 있다
하지만 hoisting기법을 사용하여 패키지를 위로 끌어올리면 package.json에 명시 되어 있지는 않지만 해당 모듈을 import 해서 사용할수 있게 된다
그리고 A패키지와 C패키지가 B패키지를 사용해 이용하고 있다고 가정할때 A패키지를 제거하면 B패키지도 삭제됨으로 C패키지가 작동을 안할수도 있다
이러한 문제를 유령 의존성(ghost dependency or phantom dependency)이라고 부르고 yarn도 똑같이 발생한다
명령어
npm install <package name> // 패키지 추가
npm remove <package name> // 패키지 삭제
npm run <script> // 스크립트 실행
npm dedupe // 중복된 의존성 제거
yarn
yarn(Yet Another Resource Negotiator)은 npm의 부족한 부분들을 개선해서 나온 패키지 매니저이다
속도
- yarn은 npm과 달리 패키지를 병렬로 설치해 속도가 빠름
- yarn은 패키지를 설치하고 패키지의 데이터를 캐시에 저장하고 다음에 중복되는 패키지를 설치 할 때는 캐시에 저장된 데이터를 활용
접근성
npm과 달리 사용하려면 따로 설치를 해야 한다
npm install -g yarn
업데이트
앞으로 yarn 1은 업데이트 되지 않고 새로운 버전인 yarn berry가 나왔다 (yarn 1 과 호환은 되지 않음)
유령 의존성
npm의 단점인 유령 의존성이 yarn에서도 일어난다
yarn berry
yarn berry는 기존 yarn을 개선한 yarn 2 버전이다
Plug'n'Play
yarn berry는 node_moudules 폴더를 없애고 새로운 패키지 관리 시스템인 plug'n'play라는 시스템을 사용한다
패키지들을 zip 파일로 만들어서 .yarn/cache 폴더에 저장하고
.pnp.cjs 파일에 패키지에 관한 정보, 패키지의 위치, 의존하는 패키지 등이 나와있다
이렇게 zip 파일로 관리하므로 node_modules에 비해 용량도 줄일수 있고
설치하는 속도도 node_modules 폴더의 구조를 짜면서 설치 할 때 보다 빠르다
zero install
node_modules를 사용했을때는 용량이 커서 github에 같이 올리지 못했다 하지만 PnP를 사용함으로 의존성 폴더가 확실히 가볍기 때문에 github에 같이 올릴수 있게 되었다
그로인해 레포를 clone하고 따로 의존성을 설치할 필요없이 바로 실행 가능하다
pnpm
pnpm(performant npm)은 고성능 npm 이라는 뜻으로 npm 보다 낫고 yarn 보다 빠른 package manager를 만들기 위해 만들었다
속도
패키지를 설치할때 병렬적으로 설치해서 속도가 아주 빠르다
심볼릭 링크
pnpm은 node_modules에 패키지를 저장할때 패키지를 중복으로 저장하지 않는다
.pnpm_store에 패키지를 설치하고 각 프로젝트에서 패키지를 설치할때는 해당 패키지의 심볼릭 링크를 설치한다
(심볼릭 링크는 윈도우 바로가기라고 생각하면 된다)
이러한 기능으로 용량을 효율적으로 사용한다
마무리
여태까지는 package manager가 여러게 있네 이렇게만 알고 사용했었다 하지만 이렇게 특징과 차이를 알아보니
앞으로는 뭘써야 할지 고민하고 사용할것 같다 그리고 나는 아직 yarn berry를 사용을 하지 않았는데 앞으로 사용해볼때
더욱 잘 사용 할 수 있을것 같다.