dependencies와 devDependencies 외에도 peerDependencies가 package.json에 존재하는 경우가 있습니다.
예를 들어 A라는 라이브러리의 package.json에 다음과 같이 적혀 있다고 생각해봅시다.
package.json
{
...
"peerDependencies": {
"jQuery": "^3.0.0"
}
}
A라는 라이브러리가 jQuery 3 버전을 직접적으로 사용(import나 require)하지는 않지만, jQuery 3 버전이 설치되어 있다고 생각하고 코드를 작성했다는 의미입니다. 따라서 A라는 라이브러리를 사용하는 입장에서 jQuery를 미리 설치하지 않았거나 jQuery 3 버전이 아닌 다른 버전을 설치한 경우 에러가 발생하게 됩니다.
peerDependencies와 다른 버전이 설치되어 있다면 ERESOLVE unable to resolve rependency tree 에러 메시지가 표시됩니다. 이 에러를 해결하는 방법은 세 가지가 있는데, 최선의 해결책은 peerDependencies에 맞게 다시 설치하는 것입니다. 위의 예시에서는 jQuery 3 버전을 설치하면 되겠죠. 다만, 이 방법으로 해결이 안 되는 경우가 있습니다.
A 패키지의 peerDependencies가 jQuery 3 버전이고 B 패키지의 peerDependencies가 jQuery 2 버전인데, A, B 패키지를 동시에 사용하는 경우에는 jQuery 3 버전을 설치해야 할지, jQuery 2버전을 설치해야 할지 알 수 없게 됩니다. 이럴 때는 npm i --force로 강제로 모든 버전을 설치하거나 npm i --legacy-peer-deps로 peerDependencies를 무시하는 방법이 있습니다. 하지만 최선은 애초에 peerDependencies가 서로 충돌하는 패키지를 같이 설치하지 않는 것입니다. 패키지를 설치할 때 peerDependencies가 있는지 꼭 확인해보세요.
npm에는 전역(global) 설치라는 옵션도 있습니다. 패키지를 현재 폴더의 node_modules에 설치하는 것이 아니라 npm이 설치되어 있는 폴더(윈도의 경우 기본 경로는 C:\Users\사용자명\AppData\Roaming pm, 맥의 경우 기본 경로는 /usr/local/lib/node_modules)에 설치합니다. 이 폴더의 경로는 보통 시스템 환경 변수에 등록되어 있으므로 전역 설치한 패키지는 콘솔의 명령어로 사용할 수 있습니다. 전역 설치를 했다고 해서 패키지를 모든 곳에서 사용한다는 뜻은 아닙니다. 대부분 명령어로 사용하기 위해 전역 설치합니다.