npm과 yarn

패키지 관리 매니저인 npm과 yarn을 비교하였습니다.

npm vs yarn

javascript package, 의존성 관리 매니저 npm과 yarn의 차이를 비교하고 정리한 것

참고

1. 자바스크립트 패키지 매니저

패키지 매니저는 프로젝트가 의존하고 있는 패키지를 효과적으로 설치, 갱신, 삭제할 수 있도록 도와주는 관리 도구이다. 자바스크립트 패키지 매니저는 node.js runtime 환경에서 돌아가며 package.json이라는 파일에 프로젝트가 의존하고 있는 패키지 목록을 명시해 준다. 패키지는 node_modules 디렉토리에 저장되는데 주로 공개 npm 저장소로 부터 다운 받는다.


2. npm

node package manager의 약자로 node.js의 표준 패키지 매니저로서 node.js를 설치하면 같이 설치되는 기본 패키지 매니저이다. 한 때 yarn에게 밀렸지만 차이를 극복하고 yarn의 장점을 모두 흡수하여 대중적인 패키지 관리 매니저이다. 가급적 최신버전인 npm v8 사용을 권장하지만 최소 v6이상은 써야 만족감을 느낄 수 있다.


3. Yarn

Facebook에서 2016년에 만든 자바스크립트 패키지 매니저로 npm보다 빠르고 Workspaces와 같은 추가적인 기능까지 제공하여 큰 주목을 받았다.

당시 npm 대비 Yarn의 큰 장점은 yarn.lock 파일을 통해 패키지 버전 잠금을 지원하는 것으로 이를 통해 프로젝트에서 의존하는 모든 패키지를 어느 환경에서든 항상 동일한 버전으로 설치할 수 있게 만들어주었다.

1. yarn의 역할
  • - Ultra fast: 다운로드한 모든 패키지를 캐시하므로 다시 다운로드할 필요 없다. 또한 운영을 병렬화하여 리소스 활용률을 극대화하므로 설치 기간이 어느 때보다 단축

  • - Mega Secure: 체크섬을 사용하여 코드가 실행되기 전에 설치된 모든 패키지의 무결성을 확인

  • - Super Reliable(신뢰성): 상세하고 간결하며 잠금 파일 형식과 설치용 결정 알고리즘을 사용하여 한 시스템에서 작동하는 설치가 다른 시스템에서 정확히 동일한 방식으로 작동하도록 보장 가능

  • - Offline Mode(오프라인 모드): 이전에 패키지를 설치한 경우 인터넷 연결없이 패키지를 다시 설치 가능

  • - Deterministic(결정적): 설치 순서와 관계없이 모든 시스템에 동일한 종속성이 동일한 방식으로 설치

  • - Network Performace(네트워크 성능): 네트워크 활용도를 극대화하기 위해 요청을 효율적으로 대기열에 올리고 요청 폭포를 방지

  • - Same Packages(동일 패키지): npm의 패키지를 설치하고 패키지 workflow를 동일하게 유지

  • - network Resilience(네트워크 복구): 요청 실패 한 번으로 인해 설치에 실패하지 않는다. 요청이 재시도

  • - Flat mode(플랫 모드): 중복 항목을 생성하지 않으려면 일치하지 않는 버전의 종속성을 단일 버전으로 해결


4. npm vs yarn

두 패키지 모두 꾸준한 발전을하여 성능 측면에서는 거의 동일하다고 무방하다. 사용자 입장에서 가장 두드러지는 차이점은 패키지 버전 잠금을 위해 npm은 package-lock.json을 yarn은 yarn.lock 파일을 사용한다는 것이다. 또한 설치할때, npm install, yarn add를 사용하는 차이점도 있다 yarn의 가장 큰 단점은 node.js와 함께 설치되는 npm과 달리 새로 yarn을 설치해야하는 불편함이 존재한다. 하지만 yarn은 터미널에서 명령의 실행 결과가 npm보다 예쁘게 나오는 것 등 개발자 경험 측면에서 매력적이다.

1. npm 장단점
  • - 유용한 패키지들을 받아서 쉽게 사용 가능

  • - 의존 패키지의 버저닝 이슈

  • - 패키지가 많아짐에 따라 빌드 성능이 좋지 않다

2. yarn 장단점
  • - 다운로드한 패키지를 캐싱하므로 재다운로드가 필요없다

  • - 운영을 병렬화하여 리소스 활용 극대화

  • - 체크섬을 통해 코드 실행 전 설치된 패키지의 무결성을 확인

  • - 한 시스템에 작동하는 설치가 다른 시스템에서 동일한 방식으로 작동하는 것을 보장

  • - Yarn.lock 파일의 버전 관리로 인해 기존 모듈이 최신화로 업데이트 될 수 있는데, 이 경우 하위 호환을 보장하지 않는 모듈의 경우는 에러 발생할 가능성이 존재

5. npm과 yarn의 혼용은?

결론부터 말하면 혼용하는 것은 지양하는 것이 좋다. 이유는 패키지 관리 방식이 다르기 때문에 충돌이 날 수 있기 때문이다. yarn은 설치한 패키지와 종속되는 패키지를 공통적으로 사용할 때 일렬로 나열한 뒤 설치 패키지로 링크하는 방식으로 패키지 중복이 제거되어 적은 용량으로 빠른 실행이 가능하나 패키지 충돌이 있을 수 있다. npm은 각 설치한 패키지별로 서브패키지를 이루는 형식으로 각 설치한 패키지의 독립성이 보장되지만 패키지 중복으로 인한 크기가 전체적으로 커진다.

6. 기타 버전 관리 표기법

1. Version
  • - x.x.x 형태로 작성하며 ([Major].[Minor].[Patch]) 로 작성

    • - Major: 하위호환성이 보장되지 않는 변경사항 발생시

    • - Minor: 하위호환성 보장 하면서 기능추가

    • - Patch: 하위호환성 보장 하면서 버그수정

2. 특수 문자
  • - @: 패키지의 버전을 지정해서 설치가 가능하다

  • - ^(캐럿): node.js 모듈이 위 규약을 따른다는 것을 신뢰한다는 가정하에 동작. 따라 Minor 버전 범위 내에서 업데이트

  • - ~(틸트): 현재 지정한 버전의 마지막 자리 내의 범위에서만 자동으로 업데이트