회사에서 이미 생성되어있는 프로젝트를 클론하여 pnpm을 이용해 종속성 패키지를 설치하였다. 그런데 npm으로 설치한 동료와 다르게 특정 몇가지 모듈을 찾을 수 없다는 오류가 발생하며 추가로 패키지들을 설치해야 제대로 애플리케이션이 실행되는 문제가 있었다.
pnpm과 npm 의 차이
pnpm과 npm은 모두 Node.js 환경에서 패키지 관리와 디펜던시 설치를 위한 도구이다. 둘 다 동일한 기능을 제공하지만, 성능과 저장 방식에서 차이가 있다.
주요 차이점
1. 성능 및 디스크 사용
- npm:
- 모든 디펜던시를 프로젝트의 node_modules 디렉토리에 직접 설치한다.
- 디펜던시가 중복될 수 있어서, 특히 큰 프로젝트에서는 디스크 공간을 많이 차지할 수 있다.
- pnpm:
- 패키지를 중앙 저장소(글로벌 스토리지)에 한 번만 설치하고, 각 프로젝트의 node_modules 디렉토리에는 심볼릭 링크를 사용한다.
- 이로 인해 디스크 공간을 절약하고, 설치 속도가 더 빠르다.
2. 설치 방식
- npm:
- 플랫(flat)하게 패키지를 설치한다. 즉, 모든 패키지가 하나의 node_modules 디렉토리에 모이게 된다.
- node_modules 폴더에서 패키지를 찾을 때, 프로젝트의 루트 디렉토리뿐만 아니라 모든 상위 디렉토리를 탐색한다. 그래서 프로젝트의 package.json에 명시되지 않은 패키지라도, 해당 패키지가 다른 패키지의 종속성으로 설치된 경우에는 이를 찾을 수 있게 된다.
- 이러한 방식은 종종 프로젝트의 직접적인 종속성이 아닌 패키지를 사용할 수 있게 만든다. 이는 예상치 못한 패키지 가용성 문제를 초래할 수 있다.
- 패키지 충돌 문제를 해결하기 위해 중복된 패키지를 각기 다른 버전으로 여러 번 설치할 수 있다.
- pnpm:
- "hermetic"한 방식으로 패키지를 중앙 저장소에 설치하고, 각 프로젝트의 node_modules 디렉토리에 해당 프로젝트에만 해당되는 패키지의 심볼릭 링크를 포함하도록 한다.
- 종속성을 더 엄격하게 관리하며 프로젝트의 package.json에 명시된 패키지만 사용이 가능하도록 한다. 이는 의도치 않은 종속성 사용을 방지한다.
- 따라서 프로젝트의 package.json에 명시되지 않은 패키지는 사용할 수 없게 되어 'module not found' 오류가 발생할 수 있다.
- 패키지 버전이 동일한 경우, 디스크 공간을 절약할 수 있다.
요약
- npm은 패키지를 플랫하게 설치하고, 상위 디렉토리까지 탐색하여 종속성을 찾는 반면,
- pnpm은 더 엄격하게 종속성을 관리하고, 명시되지 않은 패키지는 사용하지 않도록 한다.
- 해결 방법은 package.json에 모든 필요한 종속성을 명시하고 설치하는 것이다.
'기타' 카테고리의 다른 글
ngrok 백그라운드 실행하기(터미널 종료해도 세션 유지) - linux (0) | 2023.07.03 |
---|---|
REST와 RPC의 비교 (0) | 2023.06.15 |