devDependencies
개발 단계에서 필요한 패키지를 지정하는 섹션으로, 이는 배포 환경에서는 포함되지 않습니다.
dependencies
이 섹션은 실제 서비스 운영에 필요한 패키지를 나타냅니다. 이러한 의존성이 없으면 프로젝트의 안정적인 동작에 문제가 생길 수 있습니다.
peerDependencies
주로 라이브러리를 개발할 때 사용되며, 호스트 환경에서 이미 설치된 특정 버전의 패키지를 필요로 합니다.
peerDependencies의 주요 역할은 버전 검사입니다. 예를 들어 react-router의 peerDependencies가 react>=16.8.0라면 다음과 같은 세 가지 상황이 발생할 수 있습니다:
- 프로젝트에
react가 설치되어 있지 않다면 설치해야 합니다. - 프로젝트의
react가17.0.2와 같이 요구 조건을 만족하면 설치가 성공합니다. - 프로젝트의
react가16.0.0와 같이 요구 조건을 충족하지 못하면 npm은 설치 실패 오류를 발생시키지만, yarn과 pnpm은 경고만 표시하고 설치는 진행됩니다.
peerDependencies가 미리 설치되지 않았을 때 각 패키지 매니저의 행동
- Yarn:
peerDependencies를 설치하지 않습니다. - npm:
peerDependencies를 설치하고 node_modules에 복사합니다. - pnpm:
peerDependencies를 설치하지만 node_modules에는 복사하지 않습니다.
NPM 패키지 탐색 규칙
탐색 순서는 다음과 같습니다:
- /home/project/
demo/node_modules/react-router: 먼저 현재 프로젝트의 node_modules에서 확인합니다. - /home/project/node_modules/react-router: 그 다음 부모 디렉토리의 node_modules에서 확인합니다.
- /
home/node_modules/react-router: 계속 상위 디렉토리로 올라갑니다. /node_modules/react-router: 가장 상위 디렉토리까지 확인합니다.
패키지 매니저의 특징
npm (9.5.1)
- 모든 의존성을 node_modules 폴더 아래에 펼쳐둡니다.
peerDependencies를 설치합니다.- npm은 다중 버전 지원을 위해 우선적으로 자체 node_modules 내의 버전을 찾습니다.
Yarn (1.22.19)
- 모든 의존성을 node_modules 폴더 아래에 펼쳐둡니다.
peerDependencies를 설치하지 않습니다.- yarn도 npm과 유사한 방식으로 다중 버전을 처리합니다.
pnpm (8.5.0)
- 의존성을 node_modules 밑에 펼치지 않고,
.pnpm폴더는 Node.js 모듈 탐색 경로에 포함되지 않으므로, 프로젝트 파일에서require할 때react-router만 사용 가능합니다.react-router는.pnpm/react-router@6.11.2_react@18.2.0/node_modules/react-router로 연결되는 심볼릭 링크입니다.
npm 패키지의 특징
- 개발자가 외부에 공개하려면
dependencies의 API를 재내보내야 합니다. - 사용자는
npm install 패키지명명령어로dependencies를 자동으로 설치받습니다. - 사용자는
dependencies의 버전이나 내용을 신경 쓸 필요가 없습니다.
resolutions
resolutions는 package.json에 정의된 설정으로, 특정 패키지의 버전을 강제로 통일합니다. 예를 들어 lodash의 여러 버전(4.17.21, 4.0.5, 4.0.0) 중 하나로 통일하려면 다음과 같이 작성합니다:
{
"resolutions": {
"lodash": "4.17.21"
}
}