Node Package Manager: Node.js 프로젝트를 관리하는 필수적인 도구
온라인 저장소 + 커맨드라인 도구
NPM 온라인 저장소
오픈소스 라이브러리와 도구들이 업로드되는 저장소
필요한 라이브러리나 도구를 손쉽게 검색 가능
커맨드라인 도구
프로젝트 관리를 위한 다양한 명령어 제공
-> 저장소에서 라이브러리, 도구설치
-> 프로젝트 설정 / 관리, 의존성(dependency) 관리
npm init
: package.json 파일, 프로젝트 디렉터리 생성 -> Node.js 프로젝트
package.json
: version, name, description, scripts, dependencies, devDependencies
package-lock.json
: 의존성 버전이 갑자기 변경되지 않도록 설치된 버전을 고정하는 역할
프로젝트에 의존성 추가 시, package-lock.json 파일 생성 및 자동으로 '^최신버전'으로 추가
npm install
: 프로젝트 의존성 관리(의존성 추가, 내려받기, 전역 패키지 추가)
( = npm i
)
node_modules 디렉터리는 코드 관리나 배포 시에 업로드 하지 않는다
=> 의존성이 많아지면 용량이 매우 커지고 운영체제별로 실행되는 코드가 다를 수 있기 때문
npm i package-name
: 필요 패키지를 프로젝트에 추가
패키지는 package.json의 dependencies에 추가, node_modules 디렉토리에 저장
npm i package-name --save-dev
: 개발용 의존성을 분리하여 관리
개발용 의존성: 배포 전까지만 사용하는 의존성(ex. 유닛 테스트 라이브러리), package.json의 devDependencies에 추가
--save-sev
: 새발용 의존성을 추가하는 옵션
npm i package-name @version
: 패키지 버전 지정
~1.13.0
: 1.13.x 버전 설치
^1.13.0
: 1.x.x 버전 설치, 가장 왼쪽의 0이 아닌 버전을 고정
0.13.0
: 0.13.0 버전만 설치
npm i package-name --global
: 패키지를 전역 패키지 디렉터리에 내려받음
커맨드라인 도구들을 주로 전역 패키지로 추가해서 사용
ex) express-generator, pm2
로컬 패키지
package.json에 선언되어 있고 node_modules에 저장된 패키지
전역 패키지
npm install -g를 통해 내려받아 전역 패키지 저장소에 저장된 패키지
전역 패키지도 프로젝트에서 사용할 수 있으나 프로젝트의 의존성이 package.json 내에 명시적으로 선언되어 있는 것이 프로젝트 관리의 좋은 방향
npm remove package-name
: 의존성 패키지 삭제 가능
package.json의 edpendencies와 devDependencies에서 삭제하고 node_modules에서도 삭제
간단한 동작을 수행하는 코드
package,json의 scripts에 선언된 스크립트를 npm run script-name 명령어로 실행 가능
{
"scripts": {
"hi": "echo \"hi"\"
},
}
npm run hi // "hi"
npm script 내에선 의존성 패키지를 사용할 수 있다.
"scripts": {"test": "node_modules/.bin/tap test/\*.js"}
-> "scripts": {"test": "tap test/\*.js"}
mkdir newProject
: 새로운 폴더 생성
cd newProject
: 폴더로 이동
npm init
: 프로젝트 생성
cat .\package.json
: 프로젝트 package.json 파일 확인
npm install dayjs
: dayjs패키지 다운
ls .\node_modules\
: node_modules 확인
npm i
: 자동으로 모든 의존성 내려받기
rmdir .\node_modules\
: node_modules 디렉터리 지우기
npm i cowsay --save-dev
: 개발용 의존성 추가
npm run
: 프로젝트 실행
npm remove cowsay
: cowsay 의존성 삭제
npm 패키지를 설치하지 않고 사용할 수 있게 해주는 도구
프로젝트에 추가하거나 전역 패키지로 추가하지 않고 npx를 이용하여 바로 실행 가능
npm i cowsay -g
cowsay hi
npx cowsay hi
npx를 사용하면 node.js의 특정 버전을 사용하여 js 파일 실행 가능
npx node@12 index.js
npx node@14 index.js
프로젝트의 node.js 버전별 실행환경을 확인할 때 유용
npx github-gist주소
gist: github에 등록된 간단한 코드
npx를 이용하면 gist 코드를 다운받지 않고 바로 실행 가능
간단한 프로그램이라면 파일 하나로도 가능
프로젝트가 커지면 기능에 맞게 코드를 분리하는 것이 중요
반복되는 코드를 모듈로 분리하여 사용
모듈의 모음으로 npm 패키지들은 많은 모듈을 포함하고 있는 코드 모음이다.
node.js는 다양한 모듈을 기본적으로 제공하지만 기본 제공 모듈은 직접 작성하기 매우 어렵거나 복잡한 로직을 포함한 모듈도 있으므로 자주 사용되는 모듈을 학습해야 한다.
console: 디버깅 도구
log, warn, error 함수로 로그 레벨을 표시하거나 time, timeLog, timeEnd로 시간을 추적한다.
process: 현재 실행 프로세스 관련 기능 제공
arch, argv, env 등 실행 환경 및 변수 관련 값 제공
abort, kill, exit 등 프로세스 동작 관련 함수 제공
fs: 파일 입출력을 하기 위해 사용
readFile, writeFile 함수로 파일 읽기, 쓰기, -Sync 함수 제공, 동기 동작
watch로 파일/디렉터리 변경 이벤트 감지
http: http 서버, 클라이언트를 위해 사용
createServer 함수로 서버 생성
Reaquest 함수로 http 요청 생성
기타 기본 제공 모듈
url: url 파싱
os: 운영체제 정보 - cpu, memory, type
Path: 디렉터리 string 관련 작업 - 서로 다른 운영체제 간 공통된 로직
crypto: 암호화, hash 관련 함수 제공
모듈이 load될 때 사용될 값을 module.exports로 내보낸다.
const name = 'bibi';
const age = 20;
const natinality = 'korea';
module.exports = {
name, age, nationality,
};
const student = require('./bibi');
// {name: 'bibi', age: 20, nationality: 'korea'}
const name = 'bibi';
const age = 20;
const natinality = 'korea';
exports.name = name;
exports.age = age;
exports.natinality = natinality;
const student = require('./bibi');
- **함수를 export**: 모듈을 함수로 만들어서 모듈 사용 시 값을 정할 수 있게 내보낸다.
```js
module.exports = (name, age, natinality) => {
return {
name, age, natinality,
};
}
const student = require('./bibi')('bibi', 20, 'korea');
require 함수로 모듈을 load, 의존성 패키지, 직접 작성한 모듈 사용 가능
require: 모듈 코드가 실행
node.js의 모듈은 첫 require 시에 cache, 두 번 실행하지 않는다.
모듈 코드를 여러 번 실행하기 위해선 함수 모듈로 작성
npm 패키지: 패키지를 사용하려면 node_modules에 내려받아져 있어야 한다.
const dayjs = require('dayjs');
console.log(dayjs());
의존성 패키지들은 require('package-name')로 load할 수 있다.
const myModule = require('./my-module');
console.log(myModule);
my-module이 .js 파일인 경우 해당 파일 load, 디렉터리인 경우 my-module/index.js load
const funcModule = require('./func-module');
console.log(funcModule(name, age, nationality));
const myData = require('./my-data');
console.log(myData);
module.exports를 사용해 모듈 사용 가능
require를 사용해 의존성 패키지, 모듈, json 파일 사용 가능
모듈은 첫 require 시에만 실행, cache되므로 여러 번 실행할 모듈은 함수형으로 작성
ES6에서 등장한 JS의 공식적인 표준 모듈
JS는 모듈을 제공하지 않았지만 node.js가 모듈 지원(commonjs)
-> ES Module 등장으로 node.js에서 두 가지 모듈을 지원
ES Module: export와 import로 모듈을 만들고 사용
commonjs: module.exports와 require로 모듈을 만들고 사용