티스토리 뷰

JS | Node.js

[Node.js] npm과 package.json

rimo (리모) 2023. 11. 3. 14:44

npm이란?

Node.js의 패키지를 관리할 수 있는 도구입니다.

모듈들을 패키지화하여 모아둔 저장소의 역할과, 패키지 설치 및 관리를 위한 CLI를 제공합니다.

 

일반적인 경우 Node.js를 설치하면 자동으로 설치됩니다.

# 설치 버전 확인
node -v
npm -v

 

package 설치

npm에선 누구나 자신이 작성한 패키지를 공개할 수도 있고 필요한 패키지를 검색하여 재사용할 수도 있습니다.

npm install 패키지명

# i로 축약 가능
npm i 패키지명

# 버전 지정 가능 (Semantic Versioning)
npm i 패키지명@버전이름

# 한번에 여러개의 패키지 설치 가능
npm i 패키지명 패키지명2

 

package 설치 확인

# 설치된 패키지 확인
npm list
npm ls

# depth 지정가능
npm ls --depth 1
npm ls --depth 2

 

 

package 삭제, 업데이트

# package 삭제
npm usinstall [패키지명]

# package 업데이트
npm update [패키지명]

 

 

 

 

 지역설치 VS 전역설치(-g) 

npm install 명령어에는 지역설치와 전역(-g) 설치 옵션이 있습니다.

 

옵션을 별도로 지정하지 않으면 지역설치로 진행됩니다.

프로젝트 root 디렉터리에 node_modules 디렉터리가 자동으로 생성되고, 그 안에 패키지들이 저장됩니다.

 

지역으로 설치된 패키지는 해당 프로젝트 내에서만 사용할 수 있습니다.

# 전역 설치
npm install -g 패키지명

# 전역설치 삭제
npm usinstall -g [패키지명]


# 전역 설치된 패키지 확인
npm list -g --depth 0
npm ls -g --depth 0

 

 

 

 

전역설치는 언제 하나요? 🤔

전역설치는 자주 사용되는 명령이나 변경이 거의 없는 패키지에 사용됩니다. 예로 다음와 같은 cli 패키지들이 있습니다.

 

  • npm
  • create-react-app
  • vue-cli
  • nestjs/cli 

 

 

 


 

 

package.json과 의존성 관리

npm은 package.json 파일을 통해서 프로젝트 정보와 패키지의 의존성(dependency)을 관리합니다.

 

# package.json 생성
npm init 
npm init -y # 기본값 입력 옵션

 

package.json은 우리가 프로젝트에 사용한 패키지들의 목록과 버전, 그리고 기타 정보들을 기록합니다.

package.json 파일을 통해 우리는 동일한 개발 환경을 빠르게 구축 할 수 있죠.

 

 

 

package.json의 속성

사용할 수 있는 여러 속성이 정의되어 있습니다. 아래는 대표적으로 사용되는 속성들 입니다.

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "dependencies": {
    "node-emoji": "^2.1.3"
  },
  "devDependencies": {},
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

 

name 

프로젝트(패키지)의 이름. npm 레지스트리에 배포할 경우 사용될 패키지의 이름이 됩니다.

 

version

프로젝트의 버전 명시합니다.

 

repository

소스 코드가 저장된 리포지토리의 주소를 명시합니다.

 

author 

개발자 정보를 명시합니다.

 

description 

문자열로 기술한 패키지에 대한 설명.

npm에서 검색되었을 때 리스트에 표시되어 사람들이 패키지를 찾아내고 이해할 수 있는데 도움을 줍니다.

 

main

패키지를 설치하는 곳에서 진입점으로 사용할 파일.

만약 index.js를 main 속성에 정의하여 npm 레지스트리에 배포한다면,

해당 패키지를 설치하여 사용하는 프로젝트에서는 자동으로 index.js를 진입점으로 가져와 사용합니다.

 

files

files 속성이 정의되어 있다면 해당 속성에 정의된 파일들만 배포되고 나머지는 배포되지 않습니다.

 

types

타입스크립트를 사용한다면 types 속성에 타입 정의 파일을 명시합니다.

 

scripts

직접 정의한 커스텀 명령어의 목록입니다. `npm run 명령어`로 실행할 수 있습니다.

npm run [script-name]

 

dependencies

프로젝트의 의존성 패키지들을 정의하며, 해당 패키지들은 실제 프로덕션 배포에서도 필요한 패키지 목록입니다.

npm install 시 `--save`옵션이나 `-S `옵션을 주면 dependencies로 설치됩니다.

*npm@5 부터 디폴트 설치 옵션입니다.

npm i --save 패키지명     
npm i -S 패키지명

 

 

devDependencies

실제 프로덕션 배포에서는 필요하지 않고 개발에만 필요한 패키지 목록입니다.

npm install 시 `--save--dev`옵션이나 `-D `옵션을 주면 devDependencies로 설치됩니다.

npm i --save--dev [패키지명]  
npm i -D [패키지명]

 

 

 

package-lock.json

현재 프로젝트에 설치된 모듈들의 의존성 트리를 기록합니다.

이를 참고하여 해당 프로젝트의 동일 한 버전의 모듈을 다운받을 수 있도록 합니다.

 





노드 개발을 하다보면 A가 B를 불러오고, B가 C를 불러오고...하는 식으로 의존 관계가 순식간에 쌓이게 됩니다.

 

나중에는 어떤 패키지를 설치했는지도 파악하기 어렵고 한 패키지에 문제가 생길 경우

여기에 의존하는 다른 패키지까지 필연적으로 영향을 받게 되는 구조기 때문에 보안면에서 취햑할 수 밖에 없습니다.

 

이 점을 유의하고 패키지를 사용하도록 합시다! ✌️

 

 

감사합니다. 

 

공부한 내용을 복습/기록하기 위해 작성한 글이므로 내용에 오류가 있을 수 있습니다.

댓글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Total
Today
Yesterday