React 프로젝트를 시작하면서 그간 npm, yarn, package.json ,package-lock.json, gitignore... 등 전체 틀을 보지 못하고 너무 코딩만 하고 있었다는 생각이 들었다. 오늘은 이 중 package.json ,package-lock.json, node_modules 3가지의 집중해서 글을 써보려고 한다.
이것들을 알기 위해서는 기본적으로 npm이 뭔지부터 시작을 해야할 것 같다...
- 모듈(패키지) 관리(설치, 업데이트, 삭제)를 하기위한 매니저이다. node.js를 위한 패키지 매니저입니다.
- npm을 통해 수많은 개발자가 만든 패키지(재사용 가능한 코드)를 설치하고 설치한 패키지의 버전을 관리할 수 있습니다. 리액트 또한 하나의 패키지이며 현재 npm저장소에 등록된 패키지만 약 82만개가 넘는다고 합니다.
- npm 은 cli를 제공하고 명령어를 사용할 수 있어 새로운 모듈이나 패키지 설치, 관리, 업데이트, 삭제를 쉽게 할 수 있습니다.
- 이런 패키지 매니저는 npm말고도, 페이스북에서 만든 yarn도 있는데 다른 글에서 설명하도록 하겠습니다.
- package.json이란, 생성한 프로젝트의 메타정보와 이 프로젝트가 의존하고 있는(설치한) 모듈과 패키지들에 대한 정보들을 json 형태로 모아놓은 파일이다.
- 실제 설치는 node_modules에서 이루어지고 package.json은 그 정보들을 보여주는 것이다.
- node.js의 버전관리 파일
- 파일내에 각 속성들의 설명은 다음을 참고하세요.
참조: https://programmingsummaries.tistory.com/385
browserlist: https://github.com/browserslist/browserslist
기본적으로는 package.json은 문서다.
개발자가 배포한 패키지에 대해, 다른 사람들이 관리하고 설치하기 쉽게 하기 위한 문서이며 협동작업시 환경설정을 통일시켜줄수 있는 아주 유용한 파일이다.
(npm에 패키지를 배포하고 npm registry에 올리기 위해서 반드시 필요한 문서파일이라고 한다.)
만약 이 package.json 파일을 사용하지 않을 경우 다음과 같은 문제가 발생할 수 있다.
리액트 프로젝트를 생성하면 package.json파일 뿐만 아니라 node_modules파일도 같이 생성된다.
node_modules 디렉토리에는 package.json에 있는 모듈 뿐만 아니라, package.json에 있는 모듈이 의존하고 있는 모듈 전부를 포함한다. 그래서 node_modules 디렉토리안에는 정말 많은 모듈들이 들어가 있다.
npm으로 새로운 모듈(패키지)를 설치하게 되면, package.json과 node_modules에 추가된다.
- package-lock.json은 자신이 생성되는 시점의 의존성 트리(node_modules)에 대한 모든 정보를 가지고 있는 파일을 말한다.
- node_modules은 package.json에 등록된 모듈과 그 모듈들이 의존하고 있는 모듈 전부를 포함하고 있다. 결국 package-lock.json은 이 모든 모듈들의 정보를 가지고 기록해 놓은 파일인 것이다.
- npm을 사용해서 node_modules나 package.json을 수정하게 되면, package-lock.json 또한 자동으로 업데이트가 된다. 한마디로 package.json과 거의 붙어다닌다고 보면 될 것 같다.
package-lock.json이 존재할 때에는 npm install의 동작방식이 조금 변하게 됩니다.
package.json을 사용하여 node_modules를 생성하지않고 package-lock.json을 사용하여 node_modules를 생성합니다. 그리하여 기존 node_modules의 정확한 버전을 똑같이 다운 받을 수 있게 되는 것 입니다.
- package-lock.json은 package.json으로는 부족한 정보를 도와주는 파일이다.
- 만약 package.json 에 패키지 버전을 명확하게 지정 정해놓는다면,
프로젝트에서 사용하고 있는 패키지의 중요한 버그 수정이 이루어질 때 마다 프로젝트의 package.json 에 적혀있는 버전도 수정해 주어야하기 때문입니다.
내용참조:
1. https://velog.io/@songyouhyun/Package.json%EA%B3%BC-Package-lock.json%EC%9D%98-%EC%B0%A8%EC%9D%B4
2. https://cheonmro.github.io/2018/12/23/package-json/
3. 추가적인 내용중요 - 추후 글 쓸 예정
https://c17an.netlify.app/blog/node.js/npm-install-%EC%A0%95%EB%A6%AC/article/