> For the complete documentation index, see [llms.txt](https://taewoongs-organization.gitbook.io/jtwjs-dev-wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://taewoongs-organization.gitbook.io/jtwjs-dev-wiki/dev_note/mfa/package-manager/pnpm.md).

# pnpm

* pnpm은 기존의 방식을 해치지 않고, 빠르고 효율적인 방식을 사용
* 모노레포를 지원, 엄격한 의존성 해석을 통해 의도하지 않게 사용되는 경우를 피함
* 여러가지 장점으로 인해 모노레포를 운영할 수 있는 좋은 패키지매니저로 부상중
  * turborepo 공식문서에서도 권고함

## pnpm

* 빠르고 효율적인 패키지매니저
* 모노레포를 지원,
* 평탄하지 않은 `node_modules` 가 기본이기 때문에 엄격한 의존성 관리가 가능
* 시스템 내 단일 패키지 스토어에 모든 의존성을 보관하기에 디스크 절약
* 필요한 의존성을 식별하여 스토어로 가져오고, 디렉토리 구조를 계산하여 하드링크하는 과정을 가지기 때문에 설치속도 빠름
  * 프로젝트에 의존성이 설치될 때 다른 패키지에 사용되는 똑같은 의존성일 경우(===스토어에 존재하는) 하드링크 방식으로 가져옴 (즉, 추가로 설치하지 않음)
  * 스토어에 존재하지 않는 의존성들만 새로 설치함
* 기본적으로 pnpm은 **symlink**를 이용하여 프로젝트의 직접적인 의존성만을 모듈 디렉토리의 루트로 추가함
  * 해당 프로젝트에서만 사용하는 의존성들은 루트 워크스페이스에 관리되지 않고 내부적으로 관리하기 때문에 팬텀 디펜던시를 방지하게됨

### 실습

* [**notion**](https://2woongjae.notion.site/pnpm-workspaces-example-f6eb197c774f4f98a6082d714181ef54)
* [**github**](https://github.com/fc-micro-frontends/pnpm-workspaces-example)

### Symlink&#x20;

<figure><img src="https://1912740209-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3GVYdZvmqQyBVq29ebqk%2Fuploads%2Fad9iDkgyt69C1PfiLGM0%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202024-05-26%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.47.10.png?alt=media&amp;token=6466c84a-1fcb-487c-a9c5-b3065085592e" alt=""><figcaption></figcaption></figure>

```bash
ls -al packages/b/node_modules
```

<figure><img src="https://1912740209-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3GVYdZvmqQyBVq29ebqk%2Fuploads%2FoR6YQkoQHJJUvLW1NYpF%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202024-05-26%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.48.20.png?alt=media&amp;token=6d26eec1-9706-4702-904d-e4a74d4edb70" alt=""><figcaption><p>Root node_modules를 가리키고 있다</p></figcaption></figure>

### pnpm이 의존성 용량을 아끼는 방법

&#x20;![](https://1912740209-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F3GVYdZvmqQyBVq29ebqk%2Fuploads%2FS4WxkSPVURkjSmA8yDKo%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202024-05-26%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%204.51.48.png?alt=media\&token=01fdf89d-a2f0-41f2-b1c9-1dde0832a397)

* `node_modules/.pnpm/` 을 **Virtual Store**라고 부른다.
* .pnpm 하위로 추가된 패키지들은 실제로 해당 위치에 설치된것이 아닌 다른 저장소에 **hard link** 방식으로 복사되어있는것
* hard link가 된것은 각각 용량을 차지하는것이 아닌 중앙 스토어에만 용량을 차지하게 됨?? -> 아이노드 방식?
* 여러군데에서 사용(설치) 하더라도 한 곳의 용량만 사용하기 때문에 디스크 용량을 많이 줄일수있는 기법

#### pnpm Virtual Store

```bash
pnpm config get store-dir  //스토어 위치 확인 방법
```

```bash
pnpm config set store-dir ~/.pnpm-store //스토어 위치 설정
```
