npm pnpm 에 대한 정리

CUBE·2023년 11월 16일
0

JAVASCRIPT 이해하기

목록 보기
8/8

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/라이브러리


profile
엄마이오빠이상해

0개의 댓글