module.exports로 한 번에 대입하는 대신, 각각의 변수를 exports 객체에 하나씩 넣었습니다. 동일하게 동작하는 이유는 module.exports와 exports가 같은 객체를 참조하기 때문입니다. 실제로 console.log(module.exports === exports)를 하면 true가 나옵니다. 따라서 exports 객체에 add 함수를 넣으면 module.exports에도 add 함수가 들어갑니다.
▲ 그림 3-4 exports와 module.exports의 관계
Warning ⎮ exports 객체 사용 시 유의 사항
exports 객체를 사용할 때는 module.exports와의 참조 관계가 깨지지 않도록 주의해야 합니다. module.exports에는 어떤 값이든 대입해도 되지만, exports에는 반드시 객체처럼 속성명과 속성값을 대입해야 합니다. exports에 다른 값을 대입하면 객체의 참조 관계가 끊겨 더는 모듈로 기능하지 않습니다.
exports를 사용할 때는 객체만 사용할 수 있으므로 func.js와 같이 module.exports에 함수를 대입한 경우에는 exports로 바꿀 수 없습니다.
exports와 module.exports에는 참조 관계가 있으므로 한 모듈에 exports 객체와 module.exports를 동시에 사용하지 않는 것이 좋습니다.
Note ≣ ⎮ 노드에서 this는 무엇일까요?
노드에서의 this는 브라우저의 this와 조금 다릅니다.
this.js
console.log(this);
console.log(this === module.exports);
console.log(this === exports);
function whatIsThis() {
console.log('function', this === exports, this === global);
}
whatIsThis();
콘솔
$ node this
{}
true
true
function false true
다른 부분은 브라우저의 자바스크립트와 동일하지만 최상위 스코프에 존재하는 this는 module.exports(또는 exports 객체)를 가리킵니다. 또한, 함수 선언문 내부의 this는 3.4.1절에서 배울 global 객체를 가리킵니다.