모듈은 특정한 기능을 하는 함수나 변수들의 집합이다.
코드의 길이를 줄이고, 유지보수를 용이하게 할 수 있다는 장점이 있다.
이러한 모듈을 export하는 두 가지 방법인 module.exports와 exports의 차이점을 알아보자.
module.js
const test = {
name: "Kim",
text: "Hi"
}
module.exports = test;
main.js
const user = require('./module');
console.log(user);
output
$ node main
{ name: "Kim", text: 'Hi' }
main.js에서 정상적으로 module.js에서 작성한 john이라는 객체를 가져올 수 있다.
exports도 위의 module.exports와 같이 작성해보자.
exports.js
const test = {
name: "Kim",
text: "Hi"
}
exports = test;
main.js
const user = require('./exports');
console.log(user);
output
$ node main
{}
의도와 다르게 원하는 객체가 제대로 가져와지지 않았다.
다음과 같이 property에 접근하는 형태로 코드를 수정해보자.
exports.js
const test = {
name: "Kim",
text: "Hi"
}
exports.person = test;
main.js
const user = require('./exports');
console.log(user.person);
output
$ node main
{ name: "Kim", text: 'Hi' }
원하는 객체가 정상적으로 가져와졌다.
단순한 코드로 exports와 module.exports의 차이를 설명하자면 다음과 같다.
const module = { exports: {} };
const exports = module.exports;
// your code
return module.exports;
exports객체와 module.exports객체는 동일하며, exports 가 module.exports객체를 call by reference(함수에서 값을 전달하는 대신 주소값을 전달하는) 방식으로 바라보고 있으며, 최종적으로 리턴값은 module.exports 라는것이다.
위의 예제중에서 exports는 property 방식을 쓰고 module.exports는 그냥 바로 썻는데
그 이유는 exports를 바로 써버리면 module.exports의 call by reference 관계를 끊어버려서 exports라는 변수가 되버리기 때문이다.
- exports는 module.exports를 참조하고 있다.
- exports는 프로퍼티에 접근하는 방식으로 사용한다.
- module.exports는 바로 사용한다.
- 헷갈린다면 module.exports를 사용하자.
const test = {
name: "Kim",
text: "Hi"
}
module.exports.person = test; // (o)
module.exports = test; // (o)
exports.person = test; // (o)
exports = test; // (x)