yarn 버전 2
✅ .zip를 활용하여 압도적으로 적은 용량 사용.
✅ zero-install 레포지토리를 생성할 수 있게 된다.
✅ 사전에 module 의존성 트리를 만든다
✅ npm의 비효율적인 의존성 검색을 개선
✅ 환경에 따라 달라지는 동작 제어
✅ 프로젝트 빌드 환경을 개선시키기 위해 Zero install을 적용
zero install은 말 그대로 설치를 하지 않고 이용하는 방식말한다.
기존에 node_modules에서 모든 디펜던시를 새로 인스톨하려고 하면, 모든 디펜던시 모듈이 인스톨에만 굉장히 많은 시간이 소모하게 되는데 zerop install을 이용하면 디펜던시 install에 걸리는 시간을 없앨 수 있기 때문에 CI단이나 배포 파이프 라인에서 반복되는 install 시간을 단축시킬 수 있게 되고 CI 실행시간 및 배포 시간을 대폭 감소 시킬 수 있다.
우선 pnp를 이용하려면 프로젝트 환경이 yarn Berry 환경이어야 한다.
// 새로운 프로젝트 세팅 시,
$ yarn init -2
// 기존의 yarn classic인 프로젝트를 yarn berry로 migration 시
$ yarn set version berry // berry 활성화
$ yarn set version stable // yarn 최신버전으로 업데이트
berry 버전이 세팅이 되면 프로젝트 루트 경로에 .yarnrc.yml 파일이 생기는데, 해당 파일에 yarn config 관련 내용들을 설정할 수 있다.
yarn berry에서는 디펜던시 모듈을 관리할 수 있는 방식이 여러가지가 있는데, 아래와 같이 설정할 수 있다.
// .yarnrc.yml
nodeLinker: "pnp" // pnp(default), pnpm, node_modules 중 설정 가능.
pnp 모드로 설정으로 디펜던시 모듈을 설치하게 되면, 기존처럼 node_modules로 디펜던시 모듈들이 설치되지 않고, 대신 필요한 라이브러리 모듈들이 .yarn/.cache 디렉토리에 zip 아카이브 파일로 관리하게 되고, zip으로 된 각 모듈의 의존성 트리 정보들은 프로젝트 루트의 .pnp.cjs 파일로 관리하게 된다.
node_modules로 설치할때보다 zip으로 압축된 파일로 관리하게 됨으로써 디펜던시 사이즈를 많이 줄일 수 있는 장점을 가져가게 된다.

또한 기존에는 node_modules 내에서 각 의존성 모듈 별로 중복되는 모듈을 상위로 호이스팅 하는 등, 각 의존성 트리가 굉장히 복잡하면서, 직접 의존성 추가를 하지 않은 모듈을 이용할 수 있는 유령 디펜던시 문제가 발생하는 등 의존성 관리에 대한 문제 요소들이 많았다.

pnp에서는 하나의 의존성 모듈이 하나의 zip파일로 관리함으로써 각 의존성 모듈이 서로 얽히지 않고 독립적으로
관리를 할 수 있게 되고 각 디펜던시 트리의 복잡성이 없앨 수 있게 된다.
기조의 프로젝트로 막상 yarn berry 버전에서 pnp을 이용해 보면, 예상과는 다르게 정상적으로 동작하지 않고 디펜던시 관련 에러가 발생 할 것이다.
각 모듈이 pnp로 사용할 수 있으려면, pnp방식에 맞게 의존성 관리가 strict하게 세팅이 되어있어야 한다. 그러나 모든 모듈이 pnp형태에 맞게 호환이 모두 되어있는 상태가 아니기 때문에 pnp를 제대로 사용하기에는 많은 문제들이 발생할 수 밖에 없다.
이로 인해 Yarn에서도 완전히 strict한 방식 대신, pnp loose 모드를 통해 명시적으로 요구하는 디펜던시를 요구하지 않도록 할 수 있다.
// .yarnrc.yml
pnpMode: loose
그러나 이는 pnp가 정상적으로 동작하는 것을 보장하지 않는다. 따라서 왠만하면 pnp 모드를 이용하려면 strict 모드로 이용하는 것이 좋다.
각 의존성 모듈이 zip아카이브 파일로 독립적으로 관리가 됨으로써 의존성 트리가 더욱 strict하게 관리가 필요하다.
따라서 pnp형식으로 관리가 될 때는 이러한 의존성 모듈 관리에 대해 문제되는 부분을 모두 해결해 주어야만 정상적으로 pnp방식으로 모듈을 이용할 수 있게 된다.