Node js 를 위한 새로운 패키지 관리 시스템
https://github.com/yarnpkg/berry
require.resolve.paths()
라이브러리를 찾기 위해 디렉토리를 순회 시 패키지를 바로 찾지 못할 수록 느린 I/O 호출이 반복됨
상위 디렉토리가 어떤 node_modules를 포함하고 있는지에 따라 의존성을 호출 여부가 불분명함
node_modules는 매우 큰 공간을 차지
NPM과 Yarn v1에서는 디스크 공간을 아끼기 위해 원래 트리의 모양을 오른쪽 트리처럼 변경
이렇게 끌어올리기에 따라 직접 의존하고 있지 않은 라이브러리를 require() 할 수 있는 현상
Yarn v1은 package.json 파일을 기반으로 의존성 트리를 생성하고, 디스크에 node_modules 디렉토리 구조를 생성 (이미 패키지의 의존성 구조를 완전히 알고 있음)
하지만 node_modules 파일 시스템을 이용한 의존성 관리는 깨지기 쉬움
pnp는 근본적으로 안전하게 의존성을 관리
.yarn/cache 폴더에 의존성 정보 저장
.pnp.cjs 파일에 의존성을 찾을 수 있는 정보 기록
/* react 패키지 중에서 */
["react", [
/* npm:17.0.1 버전은 */
["npm:17.0.1", {
/* 이 위치에 있고 */
"packageLocation": "./.yarn/cache/react-npm-17.0.1-98658812fc-a76d86ec97.zip/node_modules/react/",
/* 이 의존성들을 참조한다. */
"packageDependencies": [
["loose-envify", "npm:1.4.0"],
["object-assign", "npm:4.1.1"]
],
}]
]],
pnp 시스템에서 각 의존성은 Zip 아카이브로 관리됨
Yarn Berry에서 의존성을 버전 관리에 포함하는 것
clone, blanch check out시 yarn install 필요가 없어서 CI시간 절약
Yarn berry의 PnP 기능을 사용할 때, TypeScript가 작동하도록 추가적인 구성이 필요
안전상의 이유로 VSCode에서는 사용자 지정 TypeScript 설정을 명시적으로 활성화해야함
패키지들이 zip 아카이브로 관리되기 때문에 기존의 방식으로는 정상적으로 타입 호출 불가
yarn dlx @yarnpkg/sdks vscode
command + shift + p키 (맥북 기준)를 눌러 TypeScript 버전 선택..을 검색해 Use Workspace Version을 선택해 workspace의 typescript sdk로 변경
https://toss.tech/article/node-modules-and-yarn-berry
https://haranglog.tistory.com/28