패키지 관리자(feat: yarn berry , pnpm)

node_modules 구조 하에서 모듈을 검색하는 방식은 기본적으로 디스크 I/O 작업이다. 이는 node_modules가 가진 문제이기 때문에 yarn classic과 npm 모두에 해당되는 내용

이처럼 모듈 탐색을 메모리 상에서 자료구조로 처리하지 않고 I/O로 직접 처리하다보니 추가적인 최적화가 어렵고 실제로 yarn 개발진은 이러한 이유들로 더 이상 최적화 할 여지가 없었다고 문서에서 밝히고 있다. yarn berry에서는 PnP 라는 기술을 통해 이를 개선한다.

yarn berry(PnP)

  • yarn, npm과 다르게 node_modules를 갖고 있지 않다.
  • 대신 각각의 의존성들이 zip 파일로 압출되어 .yarn/cache에 ./pnp.js로 저장된다.
  • node_modules는 사이즈와 복잡성 등 여러가지 이유로 commit되면 안되지만 zip 파일을 commit 하는 것은 간단하다.
  • 그렇기 때문에 브랜치를 바꾼다고 하더라도 yarn install 을 할 필요가 없고, 이를 zero-installs 라고 한다.

but,

  • React native는 PnP(Plug’n’Play) 사용 블가
  • node_modules를 유지한다면 사용 가능
  • 그렇기 때문에 node_modules가 차지하는 용량을 줄일수는 없음
  • 그래도 모듈을 검색하는 방식은 개선할 수 있음

pnpm

pnpm은 호이스트 방식 대신, 다른 dependencies를 해결하는 전략인 content-addressable storage를 사용했다. 이 방법을 사용하면, home 폴더의 글로벌 저장소 (~/.pnpm-store)에 패키지를 저장하는 중첩된 node_modules 폴더가 생성된다. 따라서 모든 버전의 dependencies은 해당 폴더에 물리적으로 한번만 저장되므로, single source of truth를 구성하고, 상당한 디스크 공간을 절약할 수 있다.

이는 node_modules의 레이아웃을 통해 이루어지고, **symlinks**를 사용하여 dependencies의 중첩된 구조를 생성한다. 여기서 폴더 내부의 모든 패키지 파일은 저장소에 대한 하드 링크로 구성되어 있다.

Reference

패키지 매니저, 그것이 궁금하다.

  • yarn berry

npm, yarn, pnpm 비교해보기

리멤버 웹 서비스 좌충우돌 Yarn Berry 도입기 - DRAMA&COMPANY

node_modules로부터 우리를 구원해 줄 Yarn Berry

Plug’n’Play

Support for Yarn Plug ‘n Play · Issue #27 · react-native-community/cli

How to use Yarn 3 with React Native (and how to migrate)

Yarn Berry(v3) Workspace #4 - React Native 설정

  • pnpm

Motivation | pnpm

runreactnative.dev