브라우저의 js와는 달리 node는 코드로 모듈을 만들 수 있다.
어떤 기능을 하는 함수나 변수의 집합을 모듈
이라고하는데,
모듈은 그 자체가 하나의 프로그램이면서 다른 프로그램의 재료다.
Program -> js -> 프로그램 A
js -> 프로그램 A
js -> 프로그램 B
위에서 저 js가 모듈임 ㅇㅇ
재사용성이 강하다. 보통은 파일 하나를 모듈 하나로 만들고,
( 그래야 코드를 파일별로 나눠 관리하기 편함 )
node에서는 크게 두가지 형식으로 이 모듈을 사용한다.
CommonJS는 표준 js모듈은 아닌데, 가장 많이 쓰인다.
모듈을 만들 때는 모듈이 될 파일이랑 모듈을 불러와 사용 할 파일이 필요함
// var.js
const odd = '홀수';
const even = '짝수';
module.exports = {
odd,
even,
};
위 코드처럼 module.exports
안에 넣으면,
이제 저거 모듈되는거임 ㅇㅇ
이걸 또 다른 모듈로 쓸 수 있다.
// func.js
const { odd, even } = require('./var');
function check(num){
if (num % 2) {
return odd;
else {
return even;
}
}
module.exports = check;
require(파일경로)
: 불러올 모듈
이렇게 다른 모듈을 불러와서 사용하고,
또 다시 다른 모듈로 사용하고
이런식으로 사용하면 된다.
불러올때 변수명은 마음대로 할 수 있다.
// index.js
const {odd, even} = require('./var');
const checkNumber = require('./func');
function checkString (str) {
if (str.length % 2) {
return odd;
}
return even;
}
console.log(checkNumber(10));
console.log(checkString('hi'));
위 코드에서 index는 var.js랑 func.js 전부 참조한다.
exports
객체 만으로도 모듈이 가능하다.
var.js를 아래 코드처럼 수정해도 똑같이 사용 가능
// var.js
exports.odd = '홀수';
exports.even = '짝수';
console.log(moule.exports === exports)
하면 True나옴
exports객체는 module.exports랑 참조 관계인데
exports에는 반드시 속성명, 속성값을 대입해야한다.
다른 값을 넣을 경우 module.exports와의 관계가 끊어져서 모듈로 기능하지 않는다.
exports에는 반드시 객체에만 사용하자.
- 여러파일에서 재사용할 함수나 변수는 모듈로 관리하자.
- 모듈이 너무 많고 관계가 어지러우면 어려워짐
require는 함수다. require 함수는 객체로서 속성 몇가지를 지녔는데, 그중 cache랑 main을 알아보자
한번 require한 파일은 require.cache안에 저장되고,
속성 값으로 각 파일 모듈 객체들이 들어있다.
한번 더 require을 하면, 이 cache안에 있는 친구들이 재사용됨
새로 하길 원할 때는 require.cache 속성을 제거해야한다.
프로그램 동작이 이상해질 수도 있어서 권장은 안함
노드 실행 시 첫 모듈을 가리키며, node require로 abc.js를 실행하면,
require.main은 abc.js가 된다.
현재 파일이 첫 모듈인지 알아볼 때 자주 사용하고, ( require.main === module )
첫 모듈 이름을 알아볼 때도 사용한다. (require.main.filename )
모듈1과 모듈2가 서로를 참조한다면, warning이 발생하는데,
이경우를순환 참조(circular dependency)
라고 함
순환참조는 순환 참조 당하는 대상의 객체를 비운다.
에러없이 warning으로만 객체를 비워버려서 나중에 큰일날지도?
이거 조심해서 모듈 구조 잡아야함
ES모듈이라고도 하는데 이게 공식적인 js 모듈임,
node에서 아직은 Common많이 쓰는데, 조금 씩 표준ES로 늘어남
위 CommonJS에서 한 파일 ES모듈로 바꿔보면
// var.mjs
export odd = '홀수';
export even = '짝수';
// func.mjs
import { odd, even } from './var.mjs';
function check(num){
if (num % 2) {
return odd;
else {
return even;
}
}
export default check;
// index.mjs
import {odd, even} = from './var.mjs';
import checkNumber from './func.mjs';
function checkString (str) {
if (str.length % 2) {
return odd;
}
return even;
}
console.log(checkNumber(10));
console.log(checkString('hi'));
위 코드와 Common의 차이점은
require => import
exports => export
module.exports => export default
ES에서의 위 키워드들은 require같은 함수나 객체가 아닌 문법이다.
파일의 확장자는 mjs이고, import할 때 파일 경로에서 확장자도 기입해야함
mjs말고 js로 사용하려면 package.json에 type: 'module'
속성 넣으면 됨