Node.js를 위한 새로운 패키지 관리 시스템 으로
Yarn Classic(v1)과 다른 Yarn Berry는 기존의 깨져 있는 npm 패키지 관리 시스템을 혁신적으로 개선한다.
node_modules
폴더(= 파일 시스템)를 이용해 의존성을 검색하는데 이는 비효율적으로 동작한다. 이는 node_modules
가 가진 문제이기에 Yarn Classic과 npm 모두에 해당되는 내용이다.
예를 들어, Users/hongheesoo/Desktop/plum-client/node_modules/react-selecto
폴더에서 require()를 이용해 react-selecto
패키지를 불러오는 상황이면
라이브러리를 찾기 위해 순회하는 디렉토리의 목록을 확인하려고 할 때, Node.js에서 제공하는 require.resolve.paths()
함수를 사용할 수 있다.
위 목록에서 확인할 수 있는 것처럼, npm은 패키지를 찾기 위해 계속 상위 디렉토리의 node_modules
폴더를 탐색 한다. 따라서 패키지를 바로 찾지 못할수록 느린 I/O 호출이 반복된다.
또한, 이 특성 때문에 어떤 의존성을 찾을 수 있는지는 해당 패키지의 상위 디렉토리 환경에 따라 달라진다. 예를 들어, 상위 디렉토리가 어떤 node_modules
폴더를 포함하고 있는지에 따라 의존성을 불러올 수 있기도 하고, 없기도 한다. 다른 버전의 의존성을 잘못 불러올 수 있는 여지도 존재한다. 이러면 환경에 따라 동작이 변하는 것이기 때문에 해당 상황을 재현하기도 까다로워지고 좋은 상황이 아니게 된다.
node_modules
디렉토리 구조는 매우 큰 공간을 차지한다. 이는 용량을 많이 차지할 뿐 아니라, 큰 node_modules
디렉토리 구조를 만들기 위해 많은 I/O 작업이 필요하다는 것을 뜻한다.
node_modules
는 서로를 의존하는 복잡한 의존성 트리이기 때문에 디렉토리 구조는 깊어지고 설치가 유효한지 검증하기도 어렵다.
npm 및 Yarn Classic(v1)에서는 중복 설치되는 node_modules
를 아끼기 위해 끌어올리기(Hosting)기법을 사용 한다.
이렇게 끌어올리기에 따라 직접 의존하고 있지 않은 라이브러리를 require()
할 수 있는 현상을 유령 의존성
이라고 부른다. 이런 특성은 의존성 관리 시스템을 혼란스럽게 만든다.
Yarn Berry에서는 이러한 호이스팅이 일어나지 않도록 nohoist
옵션이 기본적으로 활성화되어 있다.
Yarn Berry는 위에서 언급한 문제들을 Plug'n'Play(PnP)
전략을 사용해 해결한다.
Yarn Classic(v1)은 package.json
파일을 기반으로 의존성 트리를 생성하고, 디스크에 node_modules
디렉토리 구조를 만든다. 이미 패키지의 의존성 구조를 완전히 알고 있는 것이다.
패키지 매니저들이 node_modules
디렉토리 구조를 만드는 것에 그치지 않고, 보다 근본적으로 안전하게 의존성을 관리하자는 생각에서 PnP는 출발했다.
Yarn Berry는 node_modules
폴더가 없는 대신, .yarn 경로 하위에 의존성들을 .zip 포맷으로 압축 저장하고 .pnp.cjs
파일을 생성하도록 한다. 이 파일에는 프로젝트의 의존성 트리에 대한 모든 정보가 포함되어 있다.
이 의존성 정보를 사용함으로써 패키지를 검색하기 위한 비효율적이고 반복적인 디스크 I/O로부터 벗어날 수 있게 되었고 의존성 또한 쉽게 검증할 수 있어 유령 의존성 문제 해결도 가능했다.
우선 최신 버전의 yarn 설치 후, 프로젝트 루트에서 버전을 berry로 설정해준다.
npm install -g yarn
yarn set version berry
yarn install
버전이 변경되면 .yarnrc.yml
파일이 생성된 걸 확인할 수 있다.
Yarn Classic(v1) 혹은 npm에서 마이그레이션하는 상황에서는 yarn install
시에 nodeLinker: node-modules
가 자동으로 추가된다.
이때, .yarnrc.yml
의 nodeLinker를 node_modules로 하게 되면 PnP의 장점을 활용하지 못한다.
따라서 .yarnrc.yml
파일에서 nodeLinker 필드를 pnp로 바꾸고 다시 yarn install
한다.
참고한 블로그
node_modules로부터 우리를 구원해 줄 Yarn Berry
리멤버 웹 서비스 좌충우돌 Yarn Berry 도입기
프로젝트 yarn berry로 마이그레이션 하기
yarnberry에서 prettier plugin과 prettier 적용 방법