# 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&#x26;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&#x26;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 //스토어 위치 설정
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://taewoongs-organization.gitbook.io/jtwjs-dev-wiki/dev_note/mfa/package-manager/pnpm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
