module.exports vs exports

Written on April 24, 2019

Node.js를 사용하다 보면 module의 사용은 필수적이다. 모듈 단위로 파일이 작성되고 독자적인 scope가 생성되기 때문에 A 모듈에서 B 모듈을 사용하려면 보내고 받는 작용이 필요하다.

Node.js는 CommonJS를 따르기 때문에 exports 객체를 이용하여 모듈을 정의하고, require 함수를 이용하여 사용한다.

자료를 찾아보다 보면 어떤 자료는 모듈을 정의할때 module.exports를 사용하고, 어떤 자료는 exports를 사용하여 다소 혼란스러울 수 있다. 그렇다면 module.exports와 exports는 어떻게 다른 것일까?

module.exports vs exports

앞서 말했듯이, Common JS 에서는 export 객체를 이용하여 모듈을 정의한다. 그렇다. exports는 객체이다. exports와 module.exports의 관계를 살펴보면

var module = {
  exports: {}
};
var exports = module.exports;

module.exports는 어떠한 객체를 바라보고 있고, exports는 그런 module.exports를 바라보고 있다. 즉, 둘 다 같은 객체를 바라보고 있는 것. (바라본다고 표현한 이유는 JS에서 객체/배열은 값의 할당이 아니라, 참조로 동작하기 때문!)

module.exports vs exports

예제로 확인해보자.

아래와 같이 lib/my-module.js라는 파일에서, increment 함수를 정의하고, 아래와 같이 실행했을 때, result는 무엇일까?

var mod1 = require("./lib/my-module.js");
var mod2 = require("./lib/my-module.js");
mod1.increment();
var result = mod2.increment();

// in lib/my-module.js:
var counter = 0;
exports.increment = function() {
  counter += 1;
  return counter;
};

mod1, mod2는 require 함수를 사용하여 각각 increment 함수를 사용하지만, 결국은 같은 객체를 바라보고 있다. 따라서 함수가 두 번 실행되어 result는 2가 된다. 👀

👩🏻‍💻 배우는 것을 즐기는 프론트엔드 개발자 입니다
부족한 블로그에 방문해 주셔서 감사합니다 🙇🏻‍♀️

in the process of becoming the best version of myself