[Node] module.exports와 exports

jiseong·2021년 12월 9일
0

T I Learned

목록 보기
151/291
post-custom-banner

module.exports

// greet.js:
const greet = function () {
   console.log('Hello World');
};

module.exports = greet;

사용할 때:

// test.js:
const test = require('./greet');

console.log(test()); // Hello World

또는,

// greet.js:
const greet = function () {
   console.log('Hello World');
};

module.exports = {
  greet
};

사용할 때:

// test.js:
const test = require('./greet');

console.log(test.greet()); // Hello World

exports

// greet.js:
const greet = function () {
    console.log('Hello World');
};
 
exports.greet = greet;

사용할 때:

// test.js:
const test = require('./greet');

console.log(test.greet()); // Hello World

차이점

module은 exports 프로퍼티를 가지는 자바스크립트 객체이며 require()함수는 module.exports를 리턴한다.

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

// your code

return module.exports;

exports는 module.exports를 call by reference 방식으로 참조하고 있기 때문에 exports를 새로운 값으로 할당하기보다는 프로퍼티 방식을 사용해야한다.


// 프로퍼티 방식
exports.hello = true; // Exported from require of module

// 직접 할당하는 방식은 X
exports = { hello: false };  // Not exported, only available in the module

참고하면 좋을 코드
(IIFE를 이용하여 자신만의 스코프를 감쌌기 때문에 exports를 새로 할당한다면 외부에서 참조가 불가능하다.
위의 내용은 모듈을 지원하게 된 이유를 참고하면서 이해가 되었다.)

function require(/* ... */) {
  const module = { exports: {} };
  ((module, exports) => {
    // Module code here. In this example, define a function.
    function someFunc() {}
    exports = someFunc;
    // At this point, exports is no longer a shortcut to module.exports, and
    // this module will still export an empty default object.
    module.exports = someFunc;
    // At this point, the module will now export someFunc, instead of the
    // default object.
  })(module, module.exports);
  return module.exports;
}

Reference

post-custom-banner

0개의 댓글