개발자
류준열

npm의 유령의존성

npm은 유령의존성이 있다. npm의 유령의존성을 설명해둔 글이 있는데 쉽게 이야기하면 설치하지 않은 패키지들이 딸려오는 현상이다.

개발자의 의도와 무관한 패키지들이 node_modules에 설치되고 제거된다면 어떤 버그들이 생길지 알 수 없다.

npm과 pnpm을 번갈아 사용하며 node_modules를 비교해보았다.

npm을 사용할때의 node_modules

아래 사진을 보면 package.json에 date-fns를 검색했을때 0건이 검색되지만 실제로는 date-fns를 사용할 수 있다.

npm 유령의존성 예시 date-fns

node_modules를 까보면 설치하지 않은 date-fns가 떡하니 자리잡고 있다.

node_modules에 date-fns가 있는 모습

npm install 할 땐 764 packages를 추가한다.

npm install

pnpm을 사용할때의 node_modules

pnpm install을 하면 설치된 패키지가 684개이다. pnpm 으로 설치된 패키지 개수가 npm으로 설치된 패키지 개수 보다 약 80개 정도 적다.

pnpm Install 할때의 노드모듈

npm install 했을때 사용 가능하던 패키지들이 pnpm install 했을때는 사용불가하다.

pnpm install 헀을떄 노드모듈

npm과 다르게 pnpm을 사용하면 개발자가 package.json에 명시한 패키지들만 설치된다.

정리

위에서 npm install과 pnpm install을 비교하며 유령의존성을 직접 확인해보았다.

npm install을 했을때는 패키지가 764개 설치되었고 pnpm install 했을때는 패키지가 684개 설치되었다.
약 80개정도가 package.json에 명시되지 않은 패키지였다.

이 유령의존성은 빌드시에도 더 많은 패키지들을 설치하면서 더 많은 시간을 소모하게 되고, 성능최적화때에 번들 관리를 어렵게 한다. (bundle analyzer 툴을 보면서 이게 어디서 설치된거지? 했던 적이 있었다.)

npm보다는 유령의존성이 없는 pnpm, yarn-berry을 사용하는 것이 좋다.