Yarn
은 JavaScript
패키지 매니저로, npm
과 비슷하게 패키지를 설치하고 관리하는 도구이다. Yarn
은 여러 버전이 존재하며 버전1은 Yarn
이라고 부르고 버전2는 Yarn Berry
라고 부른다.
Yarn v1
은 2016년도에 발표되었으며 아래와 같은 특징을 활용해 종속성의 안전한 관리와 효율성을 모두 향상시킨다.
yarn install
를 실행하면 Yarn은 yarn.lock
파일을 생성한다. 이 파일은 프로젝트의 각 종속성과 하위 종속성의 정확한 버전을 기록한다. 따라서 다른 개발자가 동일한 yarn.lock
파일을 사용하여 yarn install
을 실행하면 Yarn은 패키지들을 동일한 버전으로 설치한다. 즉, 다양한 환경에서 일관성이 보장되는 것이다.
처음 패키지를 설치할 때 Yarn은 패키지 복사본을 컴퓨터 글로벌 캐시에 저장한다. 동일한 패키지를 재설치할 때 인터넷에서 다운하지 않고 캐시에 저장된 복사본을 활용해 설치할 수 있다.
Yarn Berry
는 2019년에 발표되었으며 아래와 같은 특징을 가진다.
Yarn Berry는 효율적인 알고리즘과 작업을 병렬화해 Yarn v1보다 더 빠른 종속성 설치를 제공한다.
Yarn Berry
는 저장 공간 사용량을 줄이기 위해서 종속성을 효율적으로 저장한다. v1은 프로젝트 마다 패키지를 복제한다면 v2(yarn berry)는 단일 캐시를 사용해 프로젝트 간에 패키지를 공유할 수 있다.
하나의 작업 공간에서 여러 패키지(프로젝트)를 관리할 수 있다. 각 패키지들의 종속성을 서로 연결하여 중앙에서 관리할 수 있다. 이를 통해 대규모 프로젝트의 종속성 관리를 단순화하는 동시에 개발 워크플로우를 간소화할 수 있다.
PnP
를 활용해 Zero Install
기능을 제공할 수 있다. PnP
는 기존 node_modules
폴더를 사용하지 않고 종속성을 관리하는 새로운 방법을 제공한다. 대신 종속성 경로를 맵핑하는 .pnp.cjs
파일을 필요로 한다.
Zero Install은 말 그대로 yarn install
과 같은 설치 명령어 없이 프로젝트를 바로 실행할 수 있도록 해준다. Yarn Berry
의 PnP모드와 캐시 매커니즘을 활용해 Zero Install
이 동작한다.
PnP는 종속성 및 해당 위치에 대한 모든 정보를 .pnp.cjs
라는 단일 파일에 저장하며 아래와 같은 내용이 포함된다.
코드에서 requre('some-package')
또는 import 'some-package'
가 확인되면 Node
의 모듈 확인 프로세스는 Yarn Berry
의 PnP
에 의해서 차단되며 아래의 순서로 모듈을 해석한다.
Node
의 모듈 확인 프로세스가 Yarn Berry
의 PnP
에 의해 차단Yarn Berry
PnP
가 모듈 확인 프로세스를 인계 받음.pnp.cjs
에 요청된 모듈의 정보를 확인하고 yarn/.cache에서 직접 패키지를 로드한다.Yarn
은 인터넷에서 누락된 모듈을 다운로드하고 yarn/.cache에 저장하여 동적으로 종속성 문제를 해결한다.Yarn Berry(Yarn v2)
의 PnP(Plug And Play)
기능을 활용해 Zero Install
을 도입하면 yarn install
과 같은 설치 명령어 없이 바로 프로젝트 실행이 가능하여 상당히 편리하다.
코드에서 모듈(패키지)를 가져오려고 시도하면 Node
의 모듈 해석 프로세스를 PnP
에서 가로챈다. PnP
는 로컬 캐시(yarn/.cache)를 확인하고 해당 모듈이 있으면 로드하고 없으면 인터넷에서 모듈을 다운받고 캐시에 저장하는 과정을 통해 동적으로 문제를 해결한다.
시간이 지나면서Yarn
의 버전도 상당히 많이 업그레이드가 되었다. 최적화된 Yarn
의 기능들을 사용하기 위해 버전 업그레이드는 꼭 필요한 상황있었다. 덕분에 PnP
기능을 통해 Zero Install
도 도입할 수 있는 기회로 만들 수 있었다.
Zero Install
이 도입되면서 빌드 시 node_modules
와 같은 거대한 디렉터리를 탐색할 필요가 없어졌으므로 빌드 시간을 조금 더 단축할 수 있는 장점도 있어서 상당히 만족스러운 결과를 얻었다.😀