JavaScript

module.exports vs exports

짱닭 2020. 11. 16. 19:47
반응형

module.exports <- exports
exports가 module.exports를 참조한다.
코드로 이해하자면 이런느낌 var exports = module.export

다른곳에서 import해서 사용하고 싶은 파일에서
모듈을 module.exports 해주고,

모듈을 사용할 곳에서 require()를 사용한다.

//hello.js
module.exports = {a: 1}
//hello-runner.js
const hello = require('./hello');
console.log(hello); //{a: 1}

//hello.js
exports = {a: 1}

//hello-runner.js
const hello = require('./hello');
console.log(hello); // {  } export안됨!

//some.js
module.exports.x = 30;
exports.x = 20;

//main.js
var mod = require('./some.js');
console.log(mod.x) //20
//가장 아래의 exports가 덮어씌워져서 
//마지막 할당값이 출력됨

//some.js
exports.x = 20;
exports.y = 30;

//main.js
var mod = require('./some.js')
console.log(mod) //{x:20, y:30}
//exports 두번되면 한 객체에 두 키값이 모두 들어간다.
//module.exports는 객체 1개만 내보내기 때문에
//module.exports를 두번해도 마지막에 내보낸 객체 1개만 내보내진다. (객체안에 합쳐지지 않음)

//counter.js
var counter = 0;
exports.increment = function () {
  counter += 1;
  return counter;
}

//main.js
var mod = require('./counter.js');
mod.increment();
var result = mod.increment();
console.log(result); //2 (counter변수를 exports하지 않았지만 접근가능)


exports로 함수를 내보냈을 때 함수 내에서 사용하는 변수가 exports되지 않아도
closure으로 인해 exports되지 않은 변수도 exports된 함수에서 접근이 가능하다.

//console.js
console.log('hello!');

//main.js
let con1 = require('./console.js');
let con2 = require('./console.js');
// hello!
//console.log()가 한번만 실행된다.


require cache에 같은 파일은 한번만 저장된다.
require()를 몇번을 쓰든 같은 모듈을 불러온다면
모듈 안에 console.log()가 있다면
위 코드처럼 한번만 실행된다.

반응형