npm은 노드 패키지를 관리하는 매니저 역할을 한다.
우리가 어떠한 node의 패키지 버전을 관리함에 있어서 package.json 파일을 갖고
어떠한 프로젝트의 종속성을 관리하는데 이미 만들어진 프로젝트 내에서 어떠한 node_modules의 트리나 package.json파일을 수정하게 되면 자동으로 생성된다.
이 파일은 파일이 생성되는 시점의 의존성 트리에 대한 정보를 갖고 있다.
어떠한 특정한 사람이 npm 프로젝트를 만들어 git에 소스코드를 push하면
package.json 과 package-lock.json 파일을 같이 커밋하고, 다른 사람이 소스 코드를 pull로 떙겨온 뒤 npm install을 설치하면 모든 package.json 의 변경 정보도 같이 올라왔기 때매 정상적으로 실행이 되게 되는 원리이다.
하지만 pnpm은 node_modules를 global on-disk content-addressable Store에 hard linking과 symbolic linking 방식으로 연결하여관리한다.
symbolic link라 함은 node_moudles안에 있는 모든 패키지의 모든 파일은 콘텐츠 주소 지정 저장소에 대한 하드 링크이다. 특정 라이브러리@버전 에 의존하는 다른 라이브러리@버전 을 설치했다고 가정할 경우 pnpm은 두 패키지를 모두 node_modules에 하드 링크한다.
라이브러리2는 라이브러리1을 import할 수 있어야한다.
commonJS의 require문과 ES6 문법 import * as package from "./..." 어느것이든 상관 없다.
node_modules
└── .pnpm
├── 라이브러리@1.0.0
│ └── node_modules
│ └── bar -> <store>/bar
│ ├── index.js
│ └── package.json
└── 라이브러리2@1.0.0
└── node_modules
└── foo -> <store>/foo
├── index.js
└── package.json
직접적인 의존성 처리 방법
node_modules
├── 라이브러리2 -> ./.pnpm/foo@1.0.0/node_modules/라이브러리
└── .pnpm
├── 라이브러리@1.0.0
│ └── node_modules
│ └── bar -> <store>/라이브러리
└── 라이브러리2@1.0.0
└── node_modules
├── 라이브러리2 -> <store>/foo
└── 라이브러리 -> ../../라이브러리@1.0.0/node_modules/라이브러리