[Package Manager] Yarn Berry

세나정·2024년 5월 19일
0

Package-Manager

목록 보기
1/3

이번엔 패키지 매니저에 공부해볼 것이다! 다양한 것을 알아야 더욱 다양하게 적용해보고 새로운 아이디어가 떠올랐을 때 적용할 수 있기때문이다!


Yarn Berry

이번엔 Yarn Berry에 대해 알아볼 건데 무려 node_modules 없이 node를 사용할 수 있는 환경이라고 한다!

0. 서론

패키지 매니저란?

단순하게 말하면, 이름대로 패키지를 다루는 작업을 하는 툴
패키지는 코드의 배포를 위해 사용되는 코드의 묶음 (라이브러리 & 실행파일)

패키지 매니저 Top3

  • npm
  • Yarn (Classic) & Yarn V2
  • pnpm (고성능 npm)

Node.js 환경에서의 패키지 매니저 분석

위에 기입한 여러 패키지 매니저의 기능은 동일하나 내부의 차이점이 존재

  • npm, Yarn : node_modules 폴더에 dependency 설치
  • Yarn berry : PnP (Plug 'n' play) 모드 (node_modeuls 가 존재하지 않음)
  • pnpm : 중첩된 node_modules 폴더에 dependency를 저장하는 방식을 개선하기 위한 개념 도입

1. Yarn Berry

Yarn Berry란?

Yarn Berry는 Node.js를 위한 새로운 패키지 관리 시스템
기존 Yarn V1 (Classic) -> 2020.01.25 정식 버전 Yarn v2 (Yarn Berry)가 출시

현재 Yarn Berry는 Babel을 비롯한 큰 오픈소스 레포지토리에서도 채택되어 사용중이라고 함

Yarn Berry Github : https://github.com/yarnpkg/berry

2. 왜 Yarn Berry인가? (1)

(대충 개발자가 이해하면 웃긴 짤)

위처럼 NPM은 Node.js를 설치하면 기본적으로 제공되는 패키지 매니저이지만 비효율적이거나 깨져있는 부분이 많음

- Npm의 문제점

  1. 패키지가 중복으로 설치될 수 있음

  2. 의존성 검색의 비효율성

    • 느린 I/O 호출의 반복 -> 경우에 따라 I/O 호출의 실패로 이어짐
  3. 환경에 따라 달라지는 동작

    • 상위 디렉토리 환경에 따라 의존성 호출의 변수 발생
  4. 비효율적인 설치

    • 매우 큰 node_modules
    • node_modules 디렉토리 구조 구축을 위한 큰 비용의 I/O
  5. 유령 의존성

    • 중복되어 설치되는 node_modules를 아끼끼 위해 호이스팅기법 사용 (NPM, Yarn V1)
    - 위와 같은 의존성 트리가 구축되어 있다면, [A (1.0)]과 [B (1.0)] 패키지의 중복 설치로 디스크 공간 낭비
    - NPM과 Yarn v1에서 오른쪽 트리와 같이 트리 모양 변경
    - 호이스팅에 따라 직접 의존하고 있지 않은 라이브러리를 require()할 수 있는 현상 : 유령 의존성
    - package.json의 수정에 따라 의존성 관리 시스템이 혼란스러워질 가능성 ⬆️

3. 왜 Yarn Berry 인가? (2)

Yarn Berry는 위에서 언급한 NPM의 '꺠져 있는' 패키지 관리 시스템을 개선하고자 적은 공간의 사용, 효율적인 의존성 검색을 목표로 출시

- Yarn Berry의 PnP (Plug 'n' play)

node_modules 폴더의 특정 패키지를 검색할 때 모든 패키지를 순회하며 해당 패키지 존재 여부를 찾는 방법은 매우 비횰율적

  1. Node가 패키지를 검색할 때 잘 찾을 수 있도록 하는 게 패키지 매니저의 일이라는 생각
  2. 패키지 매니저가 node_modules 디렉터리 구조를 만드는 것 뿐이 아니라 근본적이며 안전한 방법으로 의존성을 관리하는 방법에 대한 생각

이 두 가지 생각의 결과로 Plug 'n' play이 탄생함

그렇기에 Yarn Berry에서는 node_modeuls를 생성하는 대신 의존성 lookup 파일인 .pnp.cjs를 생성

  • .pnp.cjs 파일의 포함 내용
    - 관련된 패키지 이름
    • 패키지 버전
    • 디스크에서의 위치
    • 의존성 리스트
    • .etc

- Plug 'n' play 사용법

NPM에서 최신 버전의 Yarn을 내려 받은 뒤, 버전을 Berry로 설치해 Yarn Berry를 사용함

$ npm install -g yarn
$ cd ../path/to/some-package
$ yarn set version berry
  • Yarn Berry는 하위호환을 위해 패키지 단위로만 의존성 관리 시스템을 도입할 수 있음

  • node_modules를 생성하지 않는 Yarn Berry는 .yarn/cache 폴더에 저장함

  • .pnp.cjs 파일에 의존성을 찾을 수 있는 정ㅂ과 기록되고 해당 파일을 통해 디스크의 I/O없이 어떤 패키지가 어떤 라이브러리에 의존하는지, 라이브러리의 위치 모두 알 수 있음

  • Yarn은 Nopde.js에서 제공하는 require()문의 동작을 덮어씀으로 효율적으로 패키지를 검색할 수 있게 함

  • Node.js 앱을 실행시 package.json의 scripts에 실행 스크립트를 등록해 사용

  • Yarn으로 스크린트를 시행하면 PnP로 의존성을 자동으로 불러옴

또한, Zip 아카이브로 의존성을 관리 할 수 있음
없는 의존성이나 더 이상 필요없는 의존성을 쉽게 찾을 수 있음
게다가 Zip 파일의 내용이 변경될 경우 체크섬과 비교해 변경 여부를 감지 가능

4. Yarn PnP 도입의 이점

  1. 의존성 검색
    • 더 이상 node_modules 폴더의 순회가 필요 없음
    • .pnp.cjs파일이 제공하는 자료구조를 이용해 의존성의 위치를 바로 찾음
    • require()에 걸리는 시간이 크게 단축
  2. 재현 가능성
    • 모든 패키지의 의존성이 .pnp.cjs 파일을 이용해 관리되기 때문에 더 이상 외부 환경에 영향을 받지 않음
  3. 의존성 설치
    • node_modules 디렉토리 생성을 하지 않아도 됨
    • *zero-install 사용시 대부분의 라이브러리를 설치할 필요 없이 사용 가능
    • 같은 버전의 패키지가 여러번 복사될 필요가 없기에 설치 시간을 극단적으로 단축 가능
  4. 엄격한 의존성 관리
    • 각 패키지가 자신이 package.json에 기술하는 의존성에만 접근 가능
    • 유령 의존성 현상을 막음
  5. 의존성 검증
    • Yarn PnP에서 Zip 파일을 이용해 패키지를 관리하므로 의존성 관리가 용이
    • 의존성을 바로잡기 편함

*Zero-Install?

  • Zero-Install : Yarn Berry에서 의존성을 버전 관리에 포함하는 것
  • Yarn PnP는 의존성을 압축 파일로 관리하므로 의존성 용량이 작음
  • Git으로 의존성을 관리 가능

5. Yarn Berry의 단점?

  1. 여전히 PnP를 지원하지 않는 패키지가 존재
    • 만약 패키지 중 하나라도 PnP를 지원하지 않는다면 node_modeuls가 따라옴
    • 각 모듈이 PnP로 사용될 수 있기 위해선 PnP 방식에 맞게 의존성 관리가 strict하게 셋팅 되어야함

출처 : https://github.com/yoo-jimin127/FrontEnd-PlayGround/blob/main/Package%20Manager/04_YARN-berry.md
profile
기록, 꺼내 쓸 수 있는 즐거움

0개의 댓글

관련 채용 정보