빠르고, 메모리 효율적이며, 모노레포를 지원하는 Node.js 패키지 매니저
의존성 설치 속도가 npm 대비 최대 2배 빠름
동일한 패키지를 여러 프로젝트에서 사용하더라도 디스크에는 한 번만 저장하고 링크하여 사용 ⇒ 메모리 절약
모노레포 환경을 효율적으로 지원
package.json
에 명시된 직접적인 종속성만 접근 가능하도록 node_modules
구조를 구성하여 유령 종속성(Phantom Dependencies) 문제 방지
my-monorepo/
├── pnpm-workspace.yaml
├── package.json
└── node_modules/
├── .pnpm/ # 모노레포 루트에 하나만 존재 (워크스페이스 전체 관리)
│ ├── [email protected]/ # 가상 스토어: [email protected] 위치
│ │ └── node_modules/
│ │ └── react -H-> 글로벌 스토어 (react 실제 파일)
│ ├── [email protected]/ # 가상 스토어: [email protected] 위치
│ │ └── node_modules/
│ │ └── lodash -H-> 글로벌 스토어 (lodash 실제 파일)
│ ├── my-ui-library@workspace:.*/ # 가상 스토어: my-ui-library 워크스페이스 패키지 위치
│ │ └── node_modules/
│ │ └── my-ui-library --> ../../../../../packages/my-ui-library
│ │ (심볼릭 링크: 로컬 소스 코드 위치를 가리킴)
│ └── ... (다른 종속성 및 하위 종속성 구조)
└── ... (루트 패키지의 직접 종속성 링크 등)
apps/
└── my-app/
├── package.json
└── node_modules/
├── react --> ../../../node_modules/.pnpm/[email protected]/node_modules/react
(심볼릭 링크: 루트 가상 스토어의 react 위치를 가리킴)
├── lodash --> ../../../node_modules/.pnpm/[email protected]/node_modules/lodash
(심볼릭 링크: 루트 가상 스토어의 lodash 위치를 가리킴)
└── my-ui-library--> ../../../node_modules/.pnpm/my-ui-library@workspace:.*/node_modules/my-ui-library
(심볼릭 링크: 루트 가상 스토어의 my-ui-library 위치를 가리킴)
packages/
└── my-ui-library/
├── package.json
└── node_modules/
└── react --> ../../../../node_modules/.pnpm/[email protected]/node_modules/react
(심볼릭 링크: 루트 가상 스토어의 react 위치를 가리킴)
Corepack 활성화 (Node.js v16.13+)
Node.js v16.13 이상을 사용한다면 Corepack을 통해 설치하는 것이 권장
corepack enable
**pnpm 설치 (Corepack 사용 시):**Bash
corepack prepare pnpm@latest --activate
pnpm 설치 (npm 사용 시)
npm install -g pnpm
저장소 루트에 pnpm-workspace.yaml
파일을 생성 후 워크스페이스에 포함될 하위 디렉토리 지정
packages:
- 'apps/*' # apps 폴더 아래 모든 하위 폴더
- 'packages/*' # packages 폴더 아래 모든 하위 폴더
- 'shared' # shared 폴더
각 프로젝트의 package.json
에서 workspace:
프로토콜을 사용해 워크스페이스 내 다른 패키지를 참조
"dependencies": {
"my-ui-library": "workspace:^1.0.0",
"shared-utils": "workspace:*"
}
의존성 설치: 프로젝트 루트에서 package.json
에 명시된 종속성을 설치
pnpm install
# 또는 pnpm i