-
Notifications
You must be signed in to change notification settings - Fork 2
자바스크립트 패키지 매니저(npm, yarn, pnpm)
- 패키지란 공유되고 재사용될 수 있는 소프트웨어 모듈 또는 라이브러리를 말한다.
- 프로그래밍 언어나 플랫폼에 종속적일 수 있다.
- 패키지를 사용하면 손쉽게 원하는 기능을 구현할 수 있어서 개발 생산성을 향상시킬 수 있다.
자바스크립트 프로젝트에서 사용되는 의존성 관리 도구이다. 프로젝트에 필요한 외부 라이브러리, 모듈, 플러그인 등을 손쉽게 설치하고 관리하는 역할을 한다.
-
패키지 설치
패키지 매니저를 사용하여 프로젝트에 필요한 패키지를 설치할 수 있다. 패키지는 일반적으로 오픈 소스 라이브러리이며, 패키지 매니저를 통해 패키지의 이름 또는 버전을 지정하여 설치할 수 있다.
-
의존성 관리
패키지 매니저는 프로젝트의 의존성을 관리한다. 패키지는 다른 패키지에 의존할 수 있으며, 패키지 매니저는 이러한 의존성을 자동으로 해결하여 필요한 패키지들을 설치한다.
-
버전 관리
패키지 매니저는 패키지의 다양한 버전을 관리한다. 이를 통해 특정 버전의 패키지를 설치하거나 업데이트할 수 있으며, 프로젝트가 정확한 버전의 패키지를 사용하도록 보장할 수 있다.
-
스크립트 실행
패키지 매니저는 프로젝트에 미리 정의된 스크립트를 실행하는 기능을 제공한다. 이를 통해 빌드, 테스트, 배포 등의 자동화된 작업을 수행할 수 있다.
- Node.js의 표준 패키지 매니저로, Node.js를 설치하면 같이 딸려온다. 즉, 별도의 설치가 필요 없다.
-
package.json
을 이용하여 프로젝트의 종속성(dependencies)을 관리하고, 이를 기반으로 패키지를 설치한다.
npm 명령어
npm install <경로>
: 특정 저장소 내 패키지 설치. 주로 github를 이와 같이 설치.npm install <패키지이름> -g
: 패키지 글로벌 설치. 로컬의 다른 프로젝트도 이 패키지를 사용할 수 있게 된다.npm update
: 설치한 패키지들 업데이트npm dedupe
: 중복 설치된 패키지들 정리해주는 명령어.
- 장점
- Node.js 기본 제공: Node.js를 설치하면 기본적으로 제공되므로 별도의 설치 과정이 필요 없다.
- 커뮤니티 지원 : 오래된 패키지 관리자이기 때문에 커뮤니티와 문서가 풍부하고 지원이 잘 된다.
- 단점
-
성능 및 속도 (순차적 설치)
초기 npm 버전은 패키지를 하나씩 순차적으로 설치했기에 설치 과정이 오래 걸렸다. 현재는 npm도 병렬 설치를 지원하여 속도가 개선되긴 했다.
-
보안성 취약
-
중복 설치 문제 : npm은 프로젝트에 필요한 모든 종속성을
node_modules
폴더에 풀어놓는다. 같은 종속성을 필요로 하는 여러 패키지가 있을 경우, 중복으로 설치되어 디스크 공간이 낭비되고 설치 시간이 오래 걸릴 수 있다. -
의존성 충돌 : 종속성 문제나 충돌이 발생할 때, 트러블슈팅이 복잡해질 수 있다.
-
- npm에서 제공해주는 도구로, 특정 npm 패키지의 최신버전 파일을 불러와 설치하여 실행시키고 실행된 이후에 해당 패키지를 제거하는 방식
- 주로 일회성으로 사용하는 패키지나 CLI 도구를 실행할 때 유용하게 사용된다.
- 모듈이 많아 업데이트가 잦은
create-react-app
과 같은 경우npx
를 이용해 설치하는 것을 권장한다. -
npx
는 로컬 프로젝트 내에 설치된 프로젝트를 자동으로 인식하여 실행할 수 있다.
-
기존의 npm의 단점(속도, 보안)을 보완하면서 등장한 패키지 매니저로, 2017년에 페이스북 개발자들과 구글 개발자들이 함께 내놓은 패키지 매니저이다.
-
npm과 유사한 명령어 체계를 갖고 있어서 npm 사용자들이 쉽게 적응할 수 있다.
-
npm을 이용하여 설치해줘야 한다.
npm install yarn --global
- 장점
-
빠른 속도:
yarn
은 패키지 설치 속도를 개선하기 위해 캐싱 시스템을 사용해 재설치 속도가 빠르다. -
일관된 설치 환경:
yarn.lock
파일을 통해 일관된 종속성을 유지하여 여러 개발자 간 같은 패키지 버전을 보장한다. ⇒ 이건 npm도package-lock.json
파일을 통해 제공할 수 있는 장점이기도 하다. - 오프라인 모드: 한 번 다운로드한 패키지를 캐싱하여 오프라인에서도 설치가 가능하다.
- 병렬 설치: 여러 패키지를 동시에 설치하여 더 빠른 설치 속도를 제공한다.
-
빠른 속도:
- 단점
-
패키지 중복: npm과는 약간 다른 방식의 패키지 관리로 인해
yarn.lock
과package-lock.json
파일이 혼재될 수 있다. - 저장소의 종속성: 여전히 npm 레지스트리에 의존하기 때문에 npm과 같은 의존성 충돌 문제가 발생할 수 있다.
-
패키지 중복: npm과는 약간 다른 방식의 패키지 관리로 인해
yarn-berry는 yarn 2.0 버전부터 등장한 새로운 버전의 yarn으로, 이전 버전의 yarn과 몇 가지 중요한 차이가 있다.
-
Plug’n’Play(PnP) : yarn berry는 Plug’n’Play 기능을 도입하여 의존성을 더 효율적으로 관리한다. 이로써
node_modules
폴더는 더이상 필요하지 않으며, 디스크 공간을 절약할 수 있다. - Zero-installs : yarn berry는 zero-installs를 지원하여 프로젝트의 의존성을 전역적으로 설치하지 않고도 사용할 수 있다. 이것은 빠른 시작과 업데이트를 가능하게 한다.
- 성능 향상 : yarn berry는 이전 버전에 비해 훨씬 빠르고 효율적인 성능을 제공한다.
-
pnpm은 npm과 yarn이 갖고 있는 중복 설치 문제를 해결하기 위해 만들어진 새로운 패키지 매니저이다.
-
하드 링크(hard link) 방식을 사용하여 중복 패키지를 피하고 디스크 공간을 절약한다.
하드 링크는 파일의 실제 데이터 블록을 가리키는 또 하나의 파일 이름이다.
-
기본적으로
node_modules
폴더에서 모든 패키지를 하드 링크를 통해 공유함으로써 메모리 효율을 극대화한다. 중앙 저장소에 패키지를 저장해두고 각 프로젝트에서는node_modules
에 있는 심볼릭 링크를 통해 중앙 저장소에 있는 패키지를 참조하게 된다. -
만약 같은 패키지의 다른 버전을 설치하고 싶다면?
⇒ 중앙 저장소에 패키지를 버전별로 분리하여 관리하기 때문에 필요한 버전의 패키지를 사용할 수 있다.
- 장점
- 디스크 효율성: 중복 설치 없이 단일 패키지 버전을 저장하므로 큰 프로젝트에서도 디스크 공간을 절약할 수 있다.
- 빠른 설치 속도: 독특한 설치 방식으로 빠른 설치 속도를 제공한다.
- 의존성 충돌 해결: 하드 링크 구조 덕분에 패키지 간 의존성 충돌을 줄이고 안정성을 높인다.
-
일관된 버전 관리:
pnpm-lock.yaml
파일을 통해 종속성을 고정하고 일관성을 유지할 수 있다.
- 단점
-
호환성 문제: 일부 라이브러리가
node_modules
구조에 의존하는 경우,pnpm
의 링크 방식과 호환되지 않아 이슈가 발생할 수 있다. -
러닝 커브: 기존의
npm
이나yarn
을 사용하던 개발자들에게는 새로운 설치 방식이 익숙하지 않을 수 있고, 호환성 - 커뮤니티와 문서: 다른 패키지 관리자에 비해 커뮤니티가 비교적 작고, 문서나 자료가 풍부하지 않을 수 있다.
-
호환성 문제: 일부 라이브러리가
패키지 관리자 | 장점 | 단점 |
---|---|---|
npm | - Node.js 기본 제공 - 풍부한 커뮤니티 지원 |
- 상대적으로 느린 속도 - 중복 설치 - 의존성 충돌 |
yarn | - 빠른 속도 - 캐싱된 패키지는 오프라인 설치도 가능 - 병렬 설치 지원 |
- 패키지 중복 가능 - 의존성 충돌 |
pnpm | - 디스크 효율성 - 빠른 속도 - 의존성 충돌 적음 |
- 호환성 문제 - 낮은 커뮤니티 지원 |
- Mediasoup 포트 매핑 문제
- swagger 같은 응답 코드에 다양한 응답 보여주기
- Sudo가 계속 비밀번호를 요청함
- Docker 이미지가 너무 크다
- Git action에서 도커 이미지 빌드 시간을 단축시켜보자
- Docker compose를 이용해서 메모리 사용률을 줄여보자
- 방송 녹화 시 CPU 과부하 문제를 해결해보자
- Release 브랜치? 너 필요해?
- 로딩이 너무 짧아…!
- NestJS ORM으로 무엇을 사용해야 할까?
- WebRTC를 이용한 1:N 스트리밍 서비스에서 시그널링 서버가 필요할까?
- 실시간 채팅 구현: 인메모리 방식을 선택한 이유
- MySQL 아키텍처 개선: DB 의존성 분리와 서버 역할 명확화
- 브라우저 창이 최소화되면 비디오 송출이 안된다…!
- Mediasoup 기본 개념
- DLTS와 Signaling
- Tell, Don't Ask (TDA) 원칙이란
- VPC(Virtual Private Cloud) 학습 정리
- 순환참조: A 서비스 ‐ B 서비스 vs. A 서비스 ‐ B 레포지토리
- Dto 메서드 전략
- WebRTC란?
- 자바스크립트 패키지 매니저(npm, yarn, pnpm)
- shadcn/ui을 이용해 UI 개발 생산성 높이기
- React 이벤트 핸들러 네이밍(on vs handle)
- React-router-dom의 createBrowserRouter을 사용해보기
- fetch vs axios