yarn workspace를 고려한다면 berry도 검토해볼수 있다.
yarn berry가 나오게된이유는 node_modules의 문제점에서 발생하여 나오게되었다
node_modules의 문제점
-
의존성 탐색 알고리즘의 비효율성
- node.js에서 require함수를 실행하면 모듈을 찾을때까지 상위 디렉토리를 순회하는데 이때 느린 디스크 I/O 동작이 경로의 깊이만큼 발생하게된다.
-
저장공간과 설치시간
- node_modules는 매우 큰 공간을 차지한다. 용량만 많이차지한다면 다행이다.
디렉토리 구조를 만들기위해서 많은 I/O 작업이 필요하다
- 복잡한 폴더구조이기때문에 설치가 유효한지 검증하기 어렵다. 수백개의 패키지가 서로를 의존하는 복잡한 의존성 트리에서 디렉토리 구조는 깊어진다.
- 디스크 I/O 호출은 메모리의 자료구조를 다루는것보다 훨씬 느리다.
-
유령의존성
- 왼쪽 트리에서 A와 C패키지는 B패키지를 의존성을 띄게 되는데 A 와 C를 설치하며 B를 두번 설치하게되어 디스크 공간 낭비를 하게된다
- 이때 package-1에서는 직접 require(’B’) 가 불가하다
- 이를 해결하기위해 오른쪽트리처럼 원래의 트리의 모양을 바꾼다.
- 이렇게 되면서 package-1에서 직접 require(’B’)가 가능해졌다.
- 직접의존하지않는 라이브러리를 require할수있는 현상을 유령 의존성이라고한다.
- 이는 package.json에서 제거했을때 소리없이 사라지며 의존성관리 시스템을 혼란스럽게 만든다.
PnP(Plug’n' Play)
node_modules
을 이용한 의존성 관리는 깨지기가 쉽다. 디렉토리 구조를 만드는것을 하지않고 근본적으로 안전하게 의존성을 관리하기위해서 PnP라는 개념이 출발했다.
PnP로 얻는것은 아래와 같다
- 빠른 의존성 검색
- 의존성이
.yarn/cache
에 수평적으로 존재하므로 모든 패키지에 대한 접근 시간복잡도가 O(1)이된다.
- 빠른 설치
- 압축파일 단위로 설치되기때문에 의존성을 구성하는 파일의 수가 절대적으로 감소한다.
- 여기서 zero-install 전략을 이용하면 설치과정을 생략할수도있다.
- 유령 의존성 방지
- 호이스팅 방법을 사용하지않기 때문에 유령 의존성문제가 발생하지 않는다
Zero install 전략
하나의 압축 파일로 의존성을 관리하기 때문에 압축파일을 깃으로 관리한다면 설치과정을 생략할수있다.
버전과리에 의존성을 포함하는것 이를 zero-install 전략이라고한다.
zipFS(Zip Filesystem)으로 .yarn/cache 폴더에 의존성패키지들이 설치되어있다.