본문 바로가기
프론트엔드

(프론트엔드)yarn berry

by 흥부와놀자 2022. 10. 7.

yarn berry란?

기존의 npm과 yarn v1에서 비효율적이었던 패키지 관련 약점들을 보완하고 PnP기반을 통해 대폭적으로 효율성을 상승시킨 새로운 패키지 도구이다.

 

왜 적용할 생각 했는지?

새로운 next, nest 프로젝트에서 배포 CI를 진행할 때 install시 너무 많은 시간을 잡아 먹었기 때문에 그 시간을 줄여보고자 도입하게 되었다.

 

기존 node_modules 문제점

node_moduels의 경우 각각의 패키지들이 또다시 node_moduels를 가지고 있기 때문에 파일의 크기 자체도 커지지만 해당 node_moduels에서 패키지를 찾기위해 순회할때 디렉토리를 차례로 돌며 해당 패키지의 node_modules를 또 탐색하는 식으로 깊이탐색을 한다. 그래서 파일을 참조하기 위한 시간도 꽤 오래 걸린다. 

 

 

Pnp란?

기존처럼 node_moduels를 설치하지 않고 각각의 모듈에 대한 패키지 zip파일만 가지고 종속성을 처리한다.

 

사용 방법

1. 현재 프로젝트에서 yarn set version berry명령어 입력

2. pnp모드 사용 시 .yarnrc.yml 파일에 nodeLinker: pnp를 추가해준다.

3. gitignore를 수정해준다. 

참조 - https://next.yarnpkg.com/getting-started/qa#which-files-should-be-gitignored

폴더 설명

- .yarn/cache -> zip파일로 된 패키지들을 저장한다. (프로젝트 클론 시 다시 다운 받지 않기 위해 항상 커밋)

- .yarn/release -> yarn의 해당 버전 릴리즈 파일 (플젝 구성원들의 yarn 버전을 맞추기 위해 항상 커밋)

- .pnp.* -> pnp모드를 사용할 때 node_modules가 없는 대신 해당 파일이 .yarn/cache에서 필요한 패키지를 찾아준다. (pnp모드 시 커밋 필요)

- .yarn/unplugged -> 패키지 zip파일을 플러그인 하면 나오는 파일들

 

pnp 모드

- strict 모드 -> pnp 기본모드이며 해당 패키지의 dependency에 명시 되지 않은 종속성 파일들은 접근을 못하게 한다.

- loose 모드 -> pnp linker가 종속성을 기억하고 있어서 dependency에 명시 되지 않아도 접근할 수 있게 해준다.

 

만약 pnp모드를 안쓴다면?

기존처럼 node_moduels를 만들어 사용한다. 하지만 기존 npm이나 yarn v1은 install시 원격 서버에서 패키지를 다운받지만 yarn berry에서는 이미 .yarn/cache에 패키지들을 유지하고 있기 때문에 node_moduels를 구성하는 시간이 빨라진다.