의존성 관리: peerDependencies, devDependencies 그리고 dependencies

devDependencies

개발 단계에서 필요한 패키지를 지정하는 섹션으로, 이는 배포 환경에서는 포함되지 않습니다.

dependencies

이 섹션은 실제 서비스 운영에 필요한 패키지를 나타냅니다. 이러한 의존성이 없으면 프로젝트의 안정적인 동작에 문제가 생길 수 있습니다.

peerDependencies

주로 라이브러리를 개발할 때 사용되며, 호스트 환경에서 이미 설치된 특정 버전의 패키지를 필요로 합니다.

peerDependencies의 주요 역할은 버전 검사입니다. 예를 들어 react-routerpeerDependenciesreact>=16.8.0라면 다음과 같은 세 가지 상황이 발생할 수 있습니다:

  • 프로젝트에 react가 설치되어 있지 않다면 설치해야 합니다.
  • 프로젝트의 react17.0.2와 같이 요구 조건을 만족하면 설치가 성공합니다.
  • 프로젝트의 react16.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"
  }
}

태그: npm yarn pnpm JavaScript Node.js

6월 19일 01:00에 게시됨