- 노드 npm
-
Node를 설치하면(
) npm도 함께 설치되고,
이어서 작업을 위한 프로젝트 루트 폴더(예컨대, ex1 폴더)에서
npm init -y(= 기본값으로 초기화) 명령으로 프로젝트 초기화 작업을 수행해준다. 이제 프로젝트 루트에 아래와 같은 package.json 파일이 생성된다: -
1.
NPM 패키지는
npm install lodash식으로 설치하며(* 제거는,npm uninstall lodash), 설치/제거 시 -g(터미널 차원에서의 전역 설치) 옵션을 줄 수도 있다: - 2. 설치한 로대시 라이브러리는 다음과 같이 스크립트에서 사용할 수 있다:
/* ./package.json */
{
"name": "ex1", // ← 프로젝트 루트 폴더
"version": "1.0.0",
"main": "index.js", // ← 프로젝트 진입 파일
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": ""
}
☞ 이 JSON 파일은 자바스크립트 애플리케이션의 진입점이자 외부 의존성에 대한 정보를 저장하는 곳인데, 내부 메타 데이터들은 언제든 수정 가능하다!
Node를 사용하려면; 먼저 [Windows Powershell]을 실행하여 커맨드 쉘 로 들어가야 한다: 예컨대, 작업하려는 특정 프로젝트 루트 폴더에서 윈도우 탐색창의 Shift+우측버튼을 누른 뒤, <여기에 PowerShell 창 열기>
✓
콘솔 터미널에서 스크립트 파일을 실행할 때는 node my-js.js, 콘솔에서 노드로 들어가려면; node,
콘솔에서 노드의 패키지 매니저인 npm(노드 설치 시 함께 설치된다)을 새로 설치할 때는;
해당 프로젝트 폴더에서 npm install(npm을 초기화하면서 패키지 의존 관계는 남기고자 한다면;
npm init -y) 명령을 수행해주면 된다
/* [lodash] 설치 이후 변경된 ./package.json */
{
"name": "ex1",
"version": "1.0.0",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"description": "",
"dependencies": { "lodash": "^4.17.21" } // ← 설치한 lodash 패키지
}
☞ 로대시 설치 이후 프로젝트 루트 폴더에 가보면; package.json 파일만 아니라 package-lock.json 파일도 생성되어 있다!
// npm으로 로대시를 설치했기에 따로 경로를 적을 필요는 없다!
import lodash, { fromPairs } from 'lodash' // 로대시의 기본 객체 lodash와 개별 함수 { fromPairs } 임포트
export function mapToObject(map) { // 로대시 함수 익스포트
return fromPairs([...map]);
}
export function objectToMap(object) { // 로대시 함수 익스포트
const pairs= lodash.toPairs(object)
return new Map(pairs);
}
☞ 상대 경로를 사용하지 않는 임포트는 외부에서 불러온 코드인데, 그 세부 의존성 정보는 package-lock.json 파일에 저장된다!
✓ package-lock.json 파일은 설치 시점 당시의 의존성 정보를 저장하는데, 이는 npm을 새로 설치할 때도 이전에 설치된 패키지들은 당시와 동일한 버전으로 설치할 수 있도록 해준다!
- 노드 모듈 작성 및 내보내기, 가져오기
-
노드는
require()함수를 통해 다른 모듈을 가져오고, Exports 객체로 공개 API를 내보낸다. 노드의 전역 객체 exports는 항상 정의되어 있고, 여러가지 값을 내보내는 노드 모듈을 만들 때, 이 객체의 프로퍼티로 할당해주면 된다: -
1.
모듈이 함수나 클래스 하나만 내보낸다면;
require()를 쓰기만 하면 된다. 모듈에서 여러 프로퍼티가 있는 객체를 내보낸다면; 객체 전체를 가져올 수도 있고 해체 할당을 통해 원하는 것만 가져올 수도 있다: -
2.
사용자가 만들어 추가한 파일 모듈에 있는 내용을 모듈 바깥에서 접근할 수 있도록
module.exports를 사용하여 내보내는데, 바깥에서는const fortune= require('./lib/fortune')식으로 임포트해서 사용하며,fortune.getFortune()식으로 외부 함수를 그대로 쓸 수 있다:
// 비공개 함수 작성: 캡슐화
const sum= (x, y) => x + y
const square= x => x * x
// 공개할 함수 작성: 모듈화
exports.mean= (data) => data.reduce(sum)/data.length
exports.stddev= function(d) {
let m= exports.mean(d)
return Math.sqrt(d.mean(x => x - m).map(square).reduce(sum)/(d.length-1));
}
// 모듈 내보내기
module.exports= { mean, stddev } // 공개하고자 하는 것만 내보낸다!
☞ 모듈은 단순히 일반적인 객체를 내보낼 뿐이고, 그 객체 안에 함수 프로퍼티(들)이 있을 뿐이다!
➥
이러한 노드의 커먼 JS는 모든 버전의 노드에서 지원하는 일반적인 모듈 패턴으로서
module.exports를 사용해 함수나 클래스, 스크립트 객체를 내보낼 수 있다.
한편, 노드에서는 ES 6)의 import 문을 지원하지 않는 대신,
require('모듈' 또는 'URL')로 모듈을 임포트할 수 있다:
const { log, print } = require('./txt-helpers')
const stats= require('./stats.js') // stats.js 파일 전부를 가져온다
const { mean, stddev } = require('./stats.js') // stats.js 파일에서 원하는 부분만 해체 할당으로 가져온다
const fortune= require('./lib/fortune') // fortune 파일 가져오기
fortune.getFortune() // fortune에 내장된 getFortune 함수 호출
☞ 사용할 파일에서 (원하는 이름을 붙인 인스턴스 변수로)임포트해서 사용하면 된다 - 그 인스턴스 객체 안의 함수들에는 이미 이름들이 정해져 있고, 그저 그 이름들을 써서 사용하기만 하면 된다!