모듈이란 관련된 객체들의 집합소.
어떠한 기능을 수행하기 위해 함수 또는 객체들을 만들어 놨으면,
그걸 한 .js의 파일에 써놓기엔 가독성이나 유지보수가 좋지 않아서 관련 함수 또는 객체들을 .js파일별로 따로 모아놓은 것
test.js
var template = {
a: 'a',
b: 'b'
}
module.exports = template;
//또는
module.exports = {
a: 'a',
b: 'b'
}
abc.js
var template = require('test.js');
console.log(template.a); // out: a
exports 모듈 방법
text.js
var template = {
a: 'a',
b: 'b'
};
exports.foo = template;
//또는
exports.foo = {
a: 'a',
b: 'b'
}
abc.js
var template = require('test.js');
console.log(template.foo.a); // out: a
▼ 내용
일단 간단하게 소스로 설명하자면 exports와 module.exports의 차이점은
var module = { exports: {} };
var 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 는 property 방식으로 사용
module.exports 는 바로 사용가능
var template = { a: 'a', b: 'b'};
module.exports.foo = template; //(o)
module.exports = template; //(o)
module.exports = { a: 'a', b: 'b'} // (o)
exports.foo = template; //(o)
exports = template; //(x)
exports = { a: 'a', b: 'b'} // (x)