본문 바로가기
개발지식/Web 지식

npm, yarn

by 감중에홍시 2023. 11. 19.

npm

 npm 홈페이지에서 설명하는 npm에 대한 정의는 다음과 같다.

npm is the world's largest software registry. Open source developers from every continent use npm to share and borrow packages, and many organizations use npm to manage private development as well.

해석하자면 npm은 세계 최대의 소프트웨어 저장소이다. 모든 대륙의 오픈 소스 개발자들은 npm을 사용하여 패키지를 공유하고 대여하며, 많은 기관들이 개인적인 개발을 관리하는데 npm을 사용한다.

npm은 자바스크립트/타입스크립트 프로그래밍 언어를 위한 패키지 관리자이고, 자바스크립트 런타임 환경인 Node.js의 기본 패키지 관리자이다.

npm 사용법

npm 사용법

  • 초기화할 root 경로에서 npm init 커맨드를 통해 초기화 설정(package.json 파일 생성)
  • package.json에 사용될 정보들 입력
  • 필요 패키지를 npm install ~~~ 키워드를 통해 설치(node_modules 생성 및 package.json의 dependencies 정도 생성)
  • npm run 키워드를 사용하여 실행

 

npm의 단점

의존성을 찾는 순서

  • 비효율적인 의존성 탐색 구조
    • 해당 패키지를 찾기 위해, 상위 node_modules를 탐색한다.
    • 탐색중, I/O가 느린 readdir, stat이 호출된다.
  • 환경에 따라 달라지는 결과
    • 패키지를 찾지 못하면 상위의 node_modules를 탐색하는데, 이로 인해 상위 디렉토리의 node_modules에 어떤 패키지가 있는 지에 따라 의존성 버전이 달라지는 현상 발생
  • 설치의 비효율성
    • node_modules의 구조가 커짐에 따라 I/O 작업이 많이 발생돼 속도가 저하된다.
    • 그로 인해 npm은 기본적인 의존성 트리의 유효성만 검증하고 각 패키지의 내용은 검증하지 않는다.
  • 유령 의존성(Phantom Dependency)
    • npm은 중복되어 설치되는 node_modules를 아끼기 위해 Hoisting 전략을 사용한다. Hoisting은 여러 패키지가 동일한 버전의 의존성을 공유할 수 있도록, 해당 의존성을 최상위 노드 모듈에 설치하는 방법이다.
    • 이를 통해 각 패키지가 자체로 의존성을 설치하는 대신, 최상위 노드 모듈에 의존성을 설치하고 이를 모든 하위 패키지에서 공유함으로써 중복을 최소화한다
    • 이로 인해 서로 다른 버전의 의존성을 필요로 하는 패키지들이 함께 사용될 경우 충돌이 발생할 수 있다.
    • 이에 따라 의존성이 변경되어 나중에 패키지를 제거/ 변경할 때, 예기치 못한 오류가 발생되거나 의존성 관리 시스템의 혼란을 야기한다.

Hoisting

 

yarn

Yarn is a package manager for your code. It allows you to use and share code with other developers from around the world. Yarn does this quickly, securely, and reliably so you don't ever have to worry.
- yarn 홈페이지

yarn은 2016년 페이스북에서 개발한 패키지 관리자이다. 리액트(React)와 같은 프로젝트를 진행하며 겪었던 어려움을 해결하기 위해 개발되었고, npm과 같은 기능을 수행하나, npm 레지스트리와 호환하면서 속도나 안정성 측면에서 npm보다 향상되었다.

수년 동안 Facebook에서 npm 클라이언트를 성공적으로 사용해 왔지만 코드베이스의 크기와 엔지니어 수가 늘어남에 따라 일관성, 보안 및 성능에 문제가 생겼습니다. 문제가 발생할 때마다 해결을 시도한 후 종속성을 보다 안정적으로 관리하는 데 도움이 되는 새로운 솔루션을 구축하기 시작했습니다. 그 작업의 제품은 빠르고 안정적이며 안전한 대체 npm 클라이언트인 Yarn이라고 합니다.

- Facebook이 yarn을 개발한 이유

현재 Yarn은 v1과 v2가 있다. (v1: yarn class, v2: yarn berry)

Yarn Berry

cache 폴더에 .zip의 형태로 관리되고 있어서 npm에 비해 용량을 적게 차지하는 모습

  • Yarn v1은 package.json 파일을 기반으로 의존성 트리를 생성하고 node_modules 디렉토리 구조를 생성했다.
  • Yarn v2는 Yarn v1과 npm에서 발생하는 문제를 해결하기 위해 Plug'nPlay 전략을 사용한다.
  • Yarn_berry는 node_modules를 생성하지 않고, .yarn/cache 폴더에 의존성 정보를 기록하며, .zip 형태로 저장한다.
  • node_modules로 관리하는 방법과 다르게 의존성이 관리되어 패키지의 용량도 감소하게 된다.

 

Yarn의 장점

  • Zip 형태로 의존성을 관리한다.
    • 이는 node_modules 구조를 생성하지 않기 때문에 설치가 기존과 비교했을 때, 훨씬 빠르다
    • 패키지는 버전마다 하나의 Zip 아카이브를 갖기 때문에 중복 설치가 되지 않는다.
    • 따라서 특정 버전의 패키지가 한 번 설치되면, 같은 버전의 패키지를 다시 설치할 때에는 이미 다운로드된 Zip 아카이브를 사용하여 중복 다운로드를 피할 수 있다.
    • 의존성을 구성하는 파일이 많지 않아서 변경 사항을 감지 또는 전체 의존성을 삭제하는 작업이 빠르다.
  • Plug'n'Play 방식을 사용한다.
    • 의존성 검색에 있어 node_modules를 순회하지 않고, .pnp.cjs 파일을 이용하여 의존성 파일의 위치를 찾아 시간을 단축한다.
    • 엄격한 의존성 관리
      • node_modules처럼 의존성을 끌어올리지(Hoisting) 않는다. 각 패키지들은 package.json에 기술하는 의존성에만 접근할 수 있어서, 예기치 못한 버그를 일으키는 유령 의존성 현상을 막을 수 있다.
    • 의존성 검증
      • 기존의 방식에는 올바르게 의존성이 설치되지 않으면 node_modules 폴더를 전체를 전체를 지우고 다시 설치해야 했지만, yarn은 Zip 파일을 이용하여 관리하기 때문에 의존성이 빠지거나 변경되었을 경우, 추적이 용이하다.
  • 의존성 압축 파일로 인해 관리하는 의존성의 용량이 작고, Zip 파일로 관리하여 구성하는 파일의 숫자가 적다.
  • 용량과 파일이 적기에 Git으로 관리해도 되어서 버전 관리에 포함시킬 수 있다.(기존 node_modules는 용량 문제로 인해 Git에 올릴 수 없는 것과는 차이가 있는 모습)
  • CI에서 의존성 설치 시간을 절약할 수 있다.

 

npm vs yarn

  npm yarn
속도 느림(패키지 하나씩 설치) 빠름(패키지 동시 설치)
보안 취약(패키지 설치시 코드 실행) 상대적 안전(package.json에 명시된 파일만 설치)
init npm init yarn init
Package
install 
npm install
npm install package@version
yarn or yarn install
yarn add package@version

 

 

[출처]

facebook이 yarn을 개발한 이유 (https://engineering.fb.com/2016/10/11/web/yarn-a-new-package-manager-for-javascript/) 

npm (https://docs.npmjs.com/about-npm) 

node_modules로부터 우리를 구원해 줄 Yarn Berry (https://toss.tech/article/node-modules-and-yarn-berry) 

Yarn berry (https://yarnpkg.com/) 

'개발지식 > Web 지식' 카테고리의 다른 글

브라우저 렌더링 과정  (1) 2024.01.06
CORS 에러란 무엇인가?  (50) 2023.10.08