Today I Learned
- node.js
- package.json
- 화살표 함수
- Spread/Rest 문법
- 구조분해
- 모듈화, Common JS
Node.js
- Node.js는 구글 크롬의 V8 자바스크립트 엔진으로 빌드된 자바스크립트 런타임
- V8엔진을 이용해 브라우저에서 JavaScript를 해석하듯, 서버에서 JavaScript를 동작할 수 있도록 하는 환경
- 서버란? 클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 시스템
- 이벤트 기반, 논 블로킹 I/O 모델을 사용해 가볍고 효율적
- 논 블로킹 I/O 모델
➡️ I/O(input/output) 작업이 진행되는 동안 유저 프로세스의 작업을 중단시키지 않는 방식
- Node.js의 패키지 생태계인 npm은 세계에서 가장 큰 오픈소스 라이브러리 생태계이기도 함
npm (Node Package Manager)
필요한 모듈을 다운받을 수 있는 일종의 모듈 스토어
package.json
- package.json은 프로젝트 정보와 의존성(dependencis)을 관리하는 문서
- 이 프로그램을 실행시키기 위해 필요한 모듈들이 무엇인지, 프로그램을 실행시키는 방법, 프로그램을 테스트하는 방법 등이 명시되어 있다.
- package.json에는 어떤 모듈들인지 적혀만 있고, 실제 모듈들은 node_modules라는 폴더에 저장
{
"name": "project-name",
"version": "1.0.0",
"keywords": [],
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "HEROPY",
"license": "MIT",
"dependencies": {},
"devDependencies": {}
}
-
name
- 프로젝트(패키지) 이름. 214자 이하의 소문자, 이름에 node나 js가 들어가면 안됨
-
version
-
dependencies
- 패키지의 배포 시 포함될 의존성 모듈을 지정
- 프로그램이 실행되기 위해 반드시 필요한 모듈들
npm install
시 여기에 포함된 모든 확장 모듈 설치
-
devDependencies
- 패키지를 개발할 때만 의존하는 모듈
- 배포 시 포함 ㄴㄴ
-
peerDependencies
- 패키지의 호환성 모듈을 지정
- npm@3 이후로 배포 시 포함ㄴㄴ, 대신 호환성 모듈이 없으면 경고 메시지가 표시
-
--save
- 프로젝트(패키지)가 배포 시 사용될 의존성 모듈을 정의하고 설치
- --save 플래그(Flag)를 사용하거나 생략
- --save 옵션과 함께 install 실행 시 자동으로 "dependencies"에 추가됨
-
--save-dev / -D
- 개발 단계에서만 사용하는 의존성 모듈을 정의하고 설치
- -D(--save-dev) 플래그를 사용
- --save-dev 옵션과 함께 install 실행 시 자동으로 "devDependencies"에 추가됨
-
scripts
- CLI에서 사용가능한 명령을 기술
npm run <스크립트 이름>
으로 실행
화살표 함수
함수 표현식을 화살표 함수로 나타내보자.
const adder = function(x) {
return function(y) {
return x + y
}
}
화살표 함수
const adder = x => y => x + y
- return 생략시에는 중괄호를 사용하지 않는다.
- 객체를 return하는 경우 소괄호로 감싸주어야 한다.
const obj = (x, y) => ({x, y})
구조 분해 (Destructing)
Spread 문법을 이용하여 값을 해체한 후, 개별 값을 변수에 새로 할당
[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(a);
console.log(b);
console.log(rest);
({a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40});
console.log(a);
console.log(b);
console.log(rest);
모듈화와 Common JS
- 모듈은 쉽게 말해 기능별로 나누어지는 프로그램 덩어리
- 각각의 모듈(기능)은 자신만의 독립적인 실행 영역이 있어야 함
➡️ 독립적인 파일로 나누어 놓은 것을 모듈화라고 함
- 모듈화의 효과
- 자주 사용되는 코드를 별도의 파일로 만들어서 필요할 때마다 재활용할 수 있다
- 코드 수정 시에 필요한 로직을 빠르게 찾을 수 있다
- 필요한 로직들만 로드해서 메모리의 낭비를 줄일 수 있다
- 한번 다운로드 된 모듈은 웹브라우저에 의해 저장되기 때문에 동일한 로직을 로드할 때 시간과 네트워크 트래픽을 절약할 수 있다 (브라우저에서만 해당)
- Common JS는 모듈을 사용하기 위한 문법으로, Node.js의 표준이다.
- 모듈을 정의하기 위한 문법 - 모듈 포맷 - 에는 대표적으로 AMD, CommonJS, ES6 등이 있다
적용 예시를 간단히 알아보자.
script1.js
const abc = require('./script2.js')
console.log(abc)
const abc = require('./script3.js')
console.log(abc)
script2.js
module.exports = 'this is abc'
script3.js
exports = 'this is abc'
- require()는 module.exports를 리턴한다.
- exports는 module.exports를 단순히 참조하고 있으며, shortcut에 불과하다.
- exports 에 property를 명시하는 위와 같은 방법은 정상 작동하지만, 신규 객체를 할당하면 모듈이 작동하지 않으므로 되도록 module.exports를 사용하는 것이 권장된다.
- require를 통해 불러온 모듈은 require.cache라는 객체에 저장된다. 이 캐시는 원본 모듈보다 먼저 확인되며 원본 모듈과 일치하는 이름이 캐시에 추가되면 더 이상 원본 모듈 수신 ㄴㄴ
✍️
oh my zsh 설치한 이후로 brew와 npm 명령어가 작동되지 않아서 한참동안 구글링을 하고 페어분이랑도 같이 해보다가 zsh를 지워버렸다^^ 기본 bash부터 좀 익숙해지고 나면 다시 해봐야지...