O612의 데브런닷 스튜디오

사탄같은 NPM와 천사같은 Yarn Berry 비교

이 모든 근원인 node_modules (근데 Yarn Berry를 타락천사로 만들어버리는 Pnpm을 곁들인)
수정
featured image thumbnail for post 사탄같은 NPM와 천사같은 Yarn Berry 비교

O612는 2021년부터 NPM을 버리고 Yarn Berry를 쓰고 있습니다. (2023년 9월부터 pnpm 사용 중)

2021년 10월 이전까지는 Intel Mac을 썼는데 NPM의 패키지 설치 속도가 매우 느려서 이 문제를 어떻게 해결할까 고민을 하던 찰나, Yarn Berry 존재를 알게 됐어요. 설치 속도가 체감이 될 정도로 차이가 나더군요.

그 이유는...


Recursion Module

NPM은 node_modules 디렉토리에 패키지 의존성을 설치하거나 불러오는데, Hoisting 기법을 쓰느라 node_modules/dependencies/node_modules 처럼 재귀적으로 설치 될 때가 있습니다. 이 과정에서 설치 속도가 느려지며, 개발시 의존성을 불러올 때 재귀적인 구조 때문에 로딩 속도도 느려집니다.

문제는, 찾고자 하는 패키지가 하위 의존성에 없으면 상위 의존성으로 올라가서 찾으려고 시도를 하는데 이 과정에서 패키지 검색 속도가 비정상적으로 느려진다는 문제점이 발생합니다. 속도 뿐만 아니라 누구의 개발환경에서는 제대로 동작하는 게, 다른 누구의 개발환경에서는 제대로 동작하지 않을 수 있다는 거죠. 왜냐면 패키지가 없다고 판단할 수 있으니까요.

 패키지 의존성 문제가 발생했을 때는 node_modules 디렉토리를 지우고 npm 패키지를 재설치하는 방법을 쓸 수 있습니다. (gitignore에 node_modules를 대개 등록해서 쓰기 때문에 저장소에서 관리되지 않습니다.)


Phantom Dependency 그리고 Hoisting

NPM은 Hoisting이라는 기법을 사용하는데 이 기법은 동일 패키지가 여러 번 중복 설치되는 과정을 생략하고 용량을 줄이기 위해 적용된 기법인데 이 기법 덕분에 용량은 줄었지만 설치되지 않은 의존성 Dependency을 참조하여 존재하지 않는 의존성을 만들어 버립니다.

NPM은 Dependency tree에 대해서만 유효성 검사를 합니다. 패키지 자체에 대한 유효성 검사는 패스합니다.

yarn berry는 패키지를 설치하거나 삭제할 때 /.yarn/install-state.gz 파일이 변경됩니다.

또한 /.yarn/cache 폴더의 파일들이 변경됩니다.

.yarn 폴더는 git에서 관리됩니다. 물론, .gitignore에 등록하여 관리되지 않게 할 수 있지만 많은 개발자들이 이 부분은 딱히 신경쓰지 않습니다.


어느 날 우리 집 현관으로 pnpm이 들어왔다 (2023년 11월 13일 추가분)

yarn berry도 위와 같은 문제가 있어서 어떻게 할까 찾아보다가 우연히 pnpm이란 게 있다는 걸 알게 됐습니다.

pnpm 명령어는 npm과 비슷합니다. package.jsonpnpm-lock.yaml이 존재한다면 pnpm i를, 패키지 설치할 때는 pnpm add를 사용하면 됩니다.

npm i -Dpnpm add -D 이렇게 -D를 사용할 수 있습니다.

패키지를 설치하거나 수정하면 pnpm-lock.yaml 파일만 수정됩니다.


moyong

뭐용?

FIN!

Copyright 2022 O612 DEV1L.studio develog w/ Devilish code