- npm 과 yarn classic 은 node.js 의 module resolution 을 그대로 사용한다
- pnpm 은 소프트링크와 하드링크를 이용해 node.js 의 module resolution 을 흉내낸다
- pnpm 은 그 자체가 완성형이다. 한샘 가구 같은 완성형 가구에 비유할 수 있다.
- yarn berry 는 플러그인 시스템을 이용해서 module resolution 을 새로 만들 수 있다.
- yarn berry 는 새로운 표준을 제시하는 라이브러리다. 이케아 가구 같은 조립식 가구에 비유할 수 있다.
- 내장된 노드 링커 플러그인만 사용해도 6개의 전략을 선택해서 사용할 수 있다.
- npm은 v9.4 부터 pnpm스타일의 node_modules 를 지원한다.
- 심볼릭 링크는 osx, windows, linux 가 지원하는 os 수준의 기능이다.
- 소프트 링크와 하드 링크로 나뉜다.
- 둘 다 원본 파일을 가리키는 특수한 파일이다.
- 소프트 링크 파일은 원본 파일이 삭제되면 사용할 수 없게 된다.
- 하드 링크 파일은 원본 파일이 삭제되어도 사용할 수 있다.
- 소프트 링크와 하드 링크를 통틀어 심볼릭 링크라고 하고, pnpm 패키지 매니저의 기반 기술로 쓰이고 있다.
아래의 명령어로 테스트 디렉토리를 만들고 작업한다
mkdir link-test
cd link-test원본 파일을 만든다
echo hello > src.txt소프트 링크를 만든다.
ln -s ./src.txt ./soft.txt소프트 링크를 생성했다.
소프트 링크는 ls -la 명령어로 확인할 때 → 와 함께 원본의 경로가 표시된다.
![]()
하드 링크를 만든다.
ln ./src.txt ./hard.txt하드 링크를 생성했다.
하드 링크는 ls -la 명령어로 확인할 때, 권한 플래그 뒤에 이어서 표시되는 하드 링크의 갯수가 늘어난다.

이것은 아래의 명령어로도 확인할 수 있다.
tree --inodes하드링크 파일은 파일의 식별자에 해당하는 inode 번호를 원본 파일과 공유한다.

vscode 를 열고, src.txt , soft.txt , hard.txt 를 수정해 보자.
동기화하는 것을 알 수 있다.

원본 데이터인 src.txt 를 삭제해 보자.
soft.txt 는 사용할 수 없게 되지만, hard.txt 는 계속 사용할 수 있다.
하드 링크는 별개의 파일을 만들어내기 때문.
- node.js 는 모든 패키지 매니저를 활성화하는 기능이 node.js 18 이후부터 내장되어 있다.
- 즉, yarn 이나 pnpm 을 global 로 설치할 필요가 없다는 것이다.
- 후임에게 교육을 할 때는 반드시 corepack 으로 다른 패키지 매니저를 활성화하도록 교육할 것
corepack enable- 아래의 명령어로 초기화하자. pnpm 은 npm 과 사용법이 거의 같으므로 금방 익숙해질 수 있다.
pnpm i
pnpm i express
- pnpm 은 프로젝트의
node_modules디렉토리에 실제 라이브러리를 내려받지 않는다. - 중앙 store 에 라이브러리를 저장하고, 이것을 심볼릭 링크로 연결해서 사용한다.
pnpm store path-
yarn 2,3,4,5 … 등등을 yarn berry 라는 이름으로 부른다.
-
프로젝트를
yarn init -2라는 명령어로 초기화하면 yarn berry 를 사용할 수 있다. -
yarn berry 는
node module resolution을 아예 새로 개발했다. -
아래의 명령어로 초기화하자. yarn 은 npm 과 사용법이 많이 다르므로 익숙해지는데 시간이 걸린다.
yatn i
yarn add express
- yarn 도 프로젝트의
node_modules디렉토리에 실제 라이브러리를 내려받지 않는다. - 중앙 store 에 라이브러리를 저장하고, 이것을 심볼릭 링크로 연결해서 사용한다.
yarn config get globalFolder- yarn 은 프로젝트 루트의
.yarnrc.yml을 어떻게 수정하느냐에 따라node module resolution전략을 6가지 선택할 수 있다. - 아래가 기본 설정이다. 오타에 주의하자
# pnp 모드 & 글로벌 캐시 사용함
nodeLinker: pnp
enableGlobalCache: true- 글로벌 캐시를 사용하지 않으면 node install 시간을 극적으로 줄일 수 있다. 이것을 제로인스톨이라고한다.
# pnp 모드 & 글로벌 캐시 사용함
nodeLinker: pnp
enableGlobalCache: false- pnpm 의 짝퉁으로 동작할 수 있다.
# pnpm 모드 & 글로벌 캐시 사용함
nodeLinker: pnpm
enableGlobalCache: true- pnpm + 제로인스톨을 사용할 수 있다.
# pnpm 모드 & 글로벌 캐시 사용 안함
nodeLinker: pnpm
enableGlobalCache: false- npm 의 짝퉁으로 동작할 수 있다. 이건 리액트 네이티브를 위한 설정이다.
# node_modules 모드 & 글로벌 캐시 사용 안함
nodeLinker: node-modules
enableGlobalCache: false- npm + 제로인스톨을 사용할 수 있다.
# node_modules 모드 & 글로벌 캐시 사용함
nodeLinker: node-modules
enableGlobalCache: true