개발을 하느라 검색을 하다보면 javascript 프로젝트들을 관리하고 실행하기 위해서 사용되는 도구들이 있다.
이 도구들은 프로젝트 개발 및 유지보수를 하기 좋게 만들어주는 역활을 한다. 하지만 뭐가 뭔지 언제 어떻게 사용해야하는지 알기 어려워 포스트를 작성하게 되었다.
패키지 매니저인 npm이나 yarn을 사용하여 프로젝트에 필요한 의존성을 명시하고 쉽게 설치할 수 있다. 의존성이란 다른 코드나 라이브러리 등이 프로젝트에 필요한 요소로서, 프로젝트가 올바르게 동작하고 기능을 수행하기 위해선 해당 의존성이 해결되어야 하며 이러한 의존성들은 보통 외부 패키지 형태로 프로젝트에 통합되어 버전 충동을 최소화 한다.
프로젝트의 라이브러린 모듈은 지속적으로 업데이트 된다. 패키지 매니저는 각 패키지의 버전을 명시하고 프로젝트에 적용된 버전을 추적한다. 이를 통해 특정 버전에서 발생하는 문제를 파악하고, 안정적인 업데이트를 수행할 수 있다.
패키지 매니저를 이용해서 초기 프로젝트 설정을 간편하게 수행할 수 있다. 또한 npm 또는 yarn을 사용해서 빌드 스크립트를 구성하면 개발 환경을 쉽게 설정하고, 빌드 및 배포 프로세스를 효율적으로 관리할 수 있다.
특정한 작업을 위해 다양한 도구를 사용해야 한다. -npx를 통해 로컬에 설치하지 않고도 필요한 도구를 일회성으로 실행할 수 있다. 예를 들어 프로젝트에 특정 테스트 도구가 필요한 경우, npx를 사용하여 해당하는 도구를 간편하게 실행할 수 있다.
프로젝트의 성능이나 안정성을 개선해야 한다. -yarn은 npm보다 빠른 의존성 설치 속도와 캐시 기능을 제공하여 프로젝트의 빌드 및 실행 속도를 향상시킬수 있다. 또한, 안정성 측면에서도 yarn은 예측 가능한 의존성 해결을 제공한다.
이렇게 프로젝트의 개발과 유지보수를 효율적으로 진행할 수 있다.
장점
- node.js에 내장되어 있어서 추가로 설치할 필요가 없다.
- 사용자들이 만들어 놓은 다양한 모듈이 있기에 이것들을 쉽게 사용할 수 있다.
단점
- npm이 패키지 매니저의 시초와 같기에 생태계가 매우 풍부하다.
- node_modules 폴더 크기가 커서 불필요 프로젝트 삭제할때마다 시간이 오래 걸린다.
- npm의 경우 패키지들을 서로 의존하도록 하기 때문에 하나의 문제가 발생한다면 다른 것들에도 문제가 발생할 수 있다.(이 부분을 해결하기 위해서 package.json이 필요)
장점
- 다른 javaScript 패키지 매니저에 비해 최대 2배 이상 빠르다. (dependency마다 설치가 병렬적으로 수행되기 때문)
- 프로젝트별로 node_modules에 매번 패키지를 설치했던 것과는 달리 global 저장소에 패키지를 한 번만 저장함으로써 저장 공간을 효율적으로 절약할 수 있다.(중보고 패키지를 공유하여 호율적으로 디스크 공간을 관리하고 빠르게 패키지를 설치)
- npm을 사용했던 개발자들이 쉽게 적용 할 수 있다.
- 모노레포 지원
- npm 9.4v 부터 isolated node_modules 모듈 지원
단점
- 주의할 점으로 특정 패키지를 한 번만 설치하기 때문에 프로젝트별로 연결을 해놓으면 호환 문제가 발생할 수 있다. 그렇기에 프로젝트끼리 호환문제가 발생하지 않도록 버전 관리를 반드시 해야한다.
장점
- npx를 통해 프로젝트에 필요한 도구를 쉽게 실행할 수 있다.
- 로컬에 설치하지 않고 일회성으로 패키지를 실행할 수 있다.
- 패키지를 설치하고 업데이트를 하지 않더라도, npm 레지스트리에 올라가 있는 최신 버전을 실행시키고 설치하면 항상 최신 버전을 사용할 수 있다.
- 필요할 때만 실행하므로, 프로젝트 간에 패키지 충돌을 피할 수 있다.
단점
- 인터넷 연결이 필요하다.
- 내부적으로 캐시를 사용하고, 이것을 관리하기 위한 추가적인 과정이 필요하다.
- 보안 및 버전관리에 대한 주의 필요하다.
장점
- lock 파일은 package.json에서 사용하는 버전 숫자들의 혼란을 줄여준다.
- npm의 보안 문제를 해결하고 안정성을 보장한다.
- 빠른 속도로 여러 개의 패키지를 순차적으로 설치하는 것이 아니라 병렬적으로 설치를 해주기 때문에 속도 측면에서 괜찮다.
단점
- yarn.lock 파일의 버전관리로 인해 기존 모듈이 최신화로 업데이트될 수 있으며 이 경우 하위 호환을 보장하지 않는 모듈의 경우 에러가 날 수 있다.
- 최근 버전의 npm에서도 성능이 개선되어 성능 차이가 크게 나지 않을 수 있다.
- npm 보다 다운로드 크기가 디스크 공간을 더 많이 차지할 수 있다.
- 더 많은 메모리를 사용할 수 있다.
웹 애플리케이션 개발, 서버개발, CLI 도구 등 다양한 유형의 프로젝트
여러 프로젝트 간에 의존성을 공유하고자 하는 경우 또는 디스크 공간을 효율적으로 사용하고자 하는 프로젝트
특정 스크립트나 도구를 일회성으로 실행해야 하는 경우
대규모의 웹 애플리케이션 또는 모듈화 된 프로젝트
| 기능 | pnpm | yarn | npm |
|---|---|---|---|
워크스페이스 지원 | ✔️ | ✔️ | ✔️ |
| 격리된 node_modules | ✔️ - 기본값 | ✔️ | ✔️ |
| 호이스팅된 node_modules | ✔️ | ✔️ | ✔️ - 기본값 |
| 피어 자동 설치 | ✔️ | ❌ | ✔️ |
| Plug'n'Play | ✔️ | ✔️ - 기본값 | ❌ |
| Zero-Installs | ❌ | ✔️ | ❌ |
| 의존성 패치 | ✔️ | ✔️ | ❌ |
| Node.js 버전 관리 | ✔️ | ❌ | ❌ |
| lockfile 보유 | ✔️ - pnpm-lock.yaml | ✔️ - yarn.lock | ✔️ - package-lock.json |
| 재정의 지원 | ✔️ | ✔️ - resolution을 통해 | ✔️ |
| Content-addressable 저장소 | ✔️ | ❌ | ❌ |
| 동적 패키지 실행 | ✔️ - pnpm dlx를 통해 | ✔️ - yarn dlx를 통 | ✔️ - npx를 통해 |
| 부작용 캐시 | ✔️ | ❌ | ❌ |
| Listing licenses | ✔️Via pnpm licenses list | ✔️ - Via a plugin | ❌ |