직접 만든 라이브러리로 배우는 의존성 이슈
4 min read불과 하루 사이에 라이브러리 에러 발생?!
글또 활동을 하면서 three 관련 스터디를 해나가고 있다.
스터디 목표로 React Three Fiber을 활용한 인터렉션 컴포넌트 라이브러리를 만들어보고 싶었다.
어찌저찌 컴포넌트를 구성해서 배포까지 성공했다. 🎉 (@jgjgill/interaction)
주사위 컴 포넌트 🎲
그런데 개발 환경에서 테스트(모노레포 workspace
방식)했을 때는 정상적으로 동작하던 컴포넌트가
이상하게 @jgjgill/interaction
라이브러리를 외부 프로젝트에서 불러와서 사용할 때는 에러가 발생하는 것이다. 🤔
pnpm i @jgjgill/interaction // 배포 라이브러리
pnpm i three @types/three @react-three/fiber @react-three/drei // 기타 의존 라이브러리
코드에서는 전혀 달라지는 부분이 존재하지 않았다.
import { Canvas } from '@react-three/fiber'
import { Dice } from '@jgjgill/interaction'
import './App.css'
function App() {
return (
<Canvas>
<Dice />
<ambientLight intensity={0.5} />
</Canvas>
)
}
export default App
그래서 더더욱 문제의 원인이 짐작되지 않았는데..
아무리 생각해도 코드는 문제가 없다고 판단했다.
좀 더 근원적인 부분이 문제라고 여겨졌다.
내가 만든 라이브러리는 의존하는 라이브러리들이 존재한다.
개발 환경에서의 테스트와 새롭게 구성한 프로젝트에서 도대체 어디서 차이가 발생했는지 하나씩 파악해 나갔을 때 package.json
이 눈에 띄었다.
개발 환경 테스트로 workspace
에서 설치된 버전
새롭게 구성한 프로젝트에서 설치된 버전
여기서 three와 @types/three
의 버전이 달라진다. (^0.169.0
→ ^0.171.0
)
새로운 환경에서 관련 라이브러리를 설치할 때는 최신 버전으로 설치되는 것이다.
그래서 만약 정말 단순하게 접근했을 때는 변경된 라이브러리의 버전들을 @jgjgill/interaction
에 설치된 라이브러리의 버전과 강제로 일치시킬 수 있다.
그러면 다음과 같이 정상적으로 동작한다.
"@react-three/drei": "^9.118.0",
"@react-three/fiber": "^8.17.10",
"@types/three": "^0.169.0", // ^0.171.0 ➡️ ^0.169.0 🔄
"react": "^18.3.1",
"react-dom": "^18.3.1",
"three": "^0.169.0"// ^0.171.0 ➡️ ^0.169.0 🔄
peerDependencies 활용하기
근데 라이브러리를 사용할 때마다 매번 사용자가 라이브러리 버전을 맞추는 것은 이상하게 느껴진다.
우선 해당 문제는 어딘가 의존성이 꼬여서 발생한 문제로 추측된다.
peerDependencies
를 적용해보자.
peerDependencies
는 "이 라이브러리를 사용하려면 이런 버전의 다른 라이브러리가 필요해요” 라고 선언하는 방식이다.
그래서 라이브러리를 사용하는 프로젝트에서 관련 의존성을 설치하도록 요구할 수 있다.