package.json은 프로젝트의 정보를 정의하고, 의존하는 패키지 버전 정보를 명시하는 파일이다.
일반적으로 루트 디렉토리에 위치한다.
작성되는 정보를 크게 2개로 나누면 프로젝트 정보, 패키지 정보로 나눌 수 있다.
package.json 파일은 반드시 name과 version 항목을 포함해야 한다.
name: 소문자 한 단어로 이루어져한다. 그리고 하이픈(-) 언더스코어(_)가 포함될 수 있다.
version: x.x.x 형식을 따라야 하며, 작성 규칙을 시맨틱 비저닝
이라고 한다.
버전은 .dot을 기준으로 3영역 Major, minor, patch로 구분된다.
패키지 정보는 dependencies 또는 devDependencies에 작성된다.
dependencies와 devDependencies의 차이는 다음과 같다.
-dependencies: 프로덕트 환경에서 응용 프로그램에 필요한 패키지. 일반적인 경우 의존하고 있다는 것을 알려주는 곳이다.
-devDependencies: 로컬 개발 및 테스트에만 필요한 패키지. 개발 모드일때만 의존하고 있다는 것을 알려주는 것이다. 실제로 배포할 때는 필요없는 테스트 도구나 웹팩, 바벨 같은 것들을 넣어주면 된다.
이외에도
-peerDependencies가 문제인데, 직접 require은 하지 않지만 호환되는 패키지의 목록이다. 주로 자기가 어떤 패키지의 플러그인 같은 개발할때 유용하다.
package는 package.json으로 설명되는 파일 또는 디렉토리이다.
패키지는 npm 레지스트리에 공개되기 위해 반드시 package.json 파일을 가지고 있어야 한다.
모듈은 node.js의 require() 함수로 로드될 수 있는 node_modules 디렉토리 안의 파일 또는 디렉토리이다.
❗️모듈은 package.json 파일을 가질 필요가 없다. 모든 모듈들이 패키지는 아니다. package.json을 가진 모듈만이 패키지이다.
모듈이 패키지 보다 조금 더 큰 개념으로 생각하면 좋다.
패키지를 지정하기 위해서는 패키지의 package.json 파일의 "dependencies" 또는 "devDependencies"에 패키지를 명시해야 한다.
만약 npm install을 실행하면, npm은 package.json에 나열된 각각의 시멘틱 버전 요구사항을 충족하는 dependencies와 devDependencies를 다운받는다.
❗️기억해두자
-dependecies: 프로덕트 환경에서 응용 프로그램에 필요한 패키지
-devDependecies: 로컬 개발 및 테스트에만 필요한 패키지
패키지의 버전에는 ^와 ~이 적혀있다. ~는 틸드(tilde)
, ^는 캐럿(caret)
이라고 읽는다.
틸드와 캐럿의 사용에는 시멘틱 버저닝 규칙이 사용된다.
해당 패키지의 패치 레벨 변경을 허용하겠다는 의미이다.
~4.3.0은 >= 4.3.0이상, < 4.4.0 미만과 같은 의미이다.
즉, 4.4.0 미만의 패치 레벨변경을 허용하겠다는 의미이다.
"devDependencies": {
"@vue/cli-service": "~4.3.0",
},
해당 패키지의 마이너, 패치 변경을 허용하겠다는 의미이다.
~2.6.11은 >= 2.6.11 이상, < 3.0.0 미만과 같은 의미이다.
즉, 3.0.0 미만의 마이너, 패치 변경을 허용하겠다는 의미이다.
"dependencies": {
"vue": "^2.6.11"
}
어떤 버전의 숫자든지 허용하겠다는 의미
가장 최선의 버전을 설치하라는 의미이다.
package-lock.json
은 node_modules 구조나 package.json이 수정되고 생성될 때 당시 의존성에 대한 정확하고 구체적인 정보를 품고 자동으로 생성된다.
npm install 명령어를 입력하면 태어난다고(?) 생각하면 편하다.
package-lock.json
이 존재할 때에는 npm install
의 동작방식이 조금 변화한다.
package.json을 사용해 node_modules를 생성하지 않고 package-lock.json
을 사용해 node-modules를 생성한다.
정리를 해보자면, package-lock.json
은 개발자들이 동일한 node_module 트리를 생성해서 같은 의존성을 설치할 수 있도록 보장해주는 고마운 존재라고 할 수 있다.
package.json에서는 앞서 살펴보았듯이 version range를 사용한다.
만약 package.json에 패키지 버전을 콕 집어 정해 놓는다면, 프로젝트에서 사용하고 있는 패키지의 중요한 버그 수정이 이루어질 때마다 프로젝트의 package.json에 적혀있는 버전도 수정해야하는 수고로움시 생긴다.
모든 크고 작은 패키지들의 릴리즈에 대해 항상 추적하고 수정해야 하는 엄청난 귀찮음을 version range를 통해 해결할 수 있는 것이다.
고로 두 개의 개념을 적절히 사용할 줄 알아야 한다.
배포 시에는 ” package-lock.json 을 레포지토리에 같이 커밋하자. ”
좋은 글 감사합니다