정리하게 된 계기
"tailwindcss": "^3.4.14",
"vite": "^5.4.10",
package.json에 버전을 명시할 때 버전 앞에 붙는 틸드 ~ 와 캐럿 ^ 이 무슨 뜻인지 정확하게 이해하고자 정리하였다. (전에 글로 읽었었는데 까먹었다…)
Software Versioning
틸드와 캐럿에 대해 알아보기 전에 소프트웨어의 버전을 작성하는 방법부터 간단하게 이해하고 넘어가자. 소프트웨어의 버전을 명시하는 방법은 다양할 수 있다. 그 중 node.js와 npm은 모두 **시멘틱 버저닝(Semantic Versioning)**이라는 소프트웨어 버전 변경 규칙을 사용한다.
Semantic Versioning

시멘틱 버저닝은 Major.Minor.Patch 형태로 버전을 작성한다.
https://semver.org/에 들어가면 자세한 semantic versioning 명세를 확인할 수 있다. summary 내용만 간단하게 살펴보면 다음과 같다.
Summary 내용 번역
버전 번호 MAJOR.MINOR.PATCH가 있을 때, 다음과 같이 증가시킨다:
- MAJOR: 이전 버전과 호환되지 않는 API 변경 시
- MINOR: 이전 버전과 호환되는 방식으로 기능을 추가할 때
- PATCH: 이전 버전과 호환되는 버그 수정 시
pre-release(1.0.0 미만인 버전)와 build metadata를 위한 추가 라벨은 MAJOR.MINOR.PATCH 형식의 확장으로 사용할 수 있다.
틸드(~) 버저닝
그럼 다시 돌아와서 틸드 ~ 와 캐럿 ^ 에 대해 알아보자.
- 틸드 버저닝: patch 범위 내에서 버전 업데이트
- ~3.4.7: >= 3.4.7 < 3.5.0
- 캐럿 버저닝: major 이하 범위에서 버전 업데이트
- ^3.4.7: >= 3.4.7 < 4.0.0
예외사항
버전이 1.0.0 미만인 경우에는 api 변경이 수시로 일어나기 때문에 캐럿(^)을 사용해도 틸드(~)처럼 동작한다.
^0.4.7: >= 0.4.7 < 0.5.0
구버전 npm에서 캐럿을 사용했을 때 문제
npm은 1.4.3 버전부터 캐럿 표기법을 도입했기 때문에 그 이전 버전의 npm은 캐럿을 유효한 버전 표기법으로 인식하지 못해 오류가 발생할 수 있다.
결론
캐럿은 major 버전이 바뀌지 않으면서 하위호환성을 유지하기 때문에 캐럿 사용하자.
참고
https://blog.outsider.ne.kr/1041
https://yiyb-blog.vercel.app/posts/npm-tilde-carrot
https://umanking.github.io/2022/05/05/npm-version-tilde-caret/