Node.js를 위한 패키지 관리 시스템.
node_modules는 일반적으로 매우 큰 공간을 차지한다.
npm 및 yarn1 에서는 중복 해서 설치되는 node_modules를 위해 끌어올리기(Hoisting)기법을 사용하는데 이때 유령 의존성(Phantom Dependency) 문제가 발생한다. 유령의존성 현상이 발생하면 package.json에 명시하지 않은 라이브러리를 사용할 수 있는 현상이 발생한다.

require, import 명령어에 걸리는 시간이 오래걸린다.
node_modules를 통한 패키지 찾기는 해당 패키지를 찾기 위해서 계속 상위 디렉토리의 node_moduels 폴더를 탐색하는데, 바로 찾지 못한다면 느린 I/O 명령어를 계속 실행하게 되어 비효율적이다.
하지만 pnp를 사용하게 되면 pnp.cjs 파일에 path에 대한 정보가 명시되어 있기 때문에 느린 I/O 명령어가 많이 사용되지 않는다.
//pnp.cjs
["react", [\\
["npm:18.0.0", {\\
"packageLocation": "./.yarn/cache/react-npm-18.0.0-fdbcb4c477-293020b965.zip/node_modules/react/",\\
"packageDependencies": [\\
["react", "npm:18.0.0"],\\
["loose-envify", "npm:1.4.0"]\\
],\\
"linkType": "HARD"\\
}]\\
]]
환경에 따라 달라지는 동작
3번의 특성에서 상위 디렉토리로 올라가면서 폴더를 탐색하는데 이때 상위 디렉토리가 어떤 node_modules를 포함하고 있는지에 따라 의존성을 불러올 수도 있기도 하고 없기도 하다. 환경에 따라 동작이 변하면 해당 상황을 재현하기 까다로워지고 클라우드 환경에 배포했을 때 문제가 생길 수 있다.
/* 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"]
],
}]
]],

- /.husky
- /packages
- common-components
- common-utils
- common-styles
- common-hooks
- prototype-a
- prototype-b
- .eslintrc.json
- .prettierrc.json
- lint-staged.config.js
- tsconfig.json