모듈이란 특정한 기능을 하는 함수와 변수들의 집합이다.
예를 들어 자바스크립트에서 함수를 만들어서 그 함수를 필요할때마다 재사용 하듯이, 모듈을 만들어 놓으면
필요할때마다 여러 프로그램에 그 모듈을 불러와서 재사용할 수가 있다.
보통 파일 하나하나가 모듈이 된다.
//a.js 파일
const oneNum = 1;
const tenNum = 10;
module.exports = {oneNum, tenNum};
//b.js 파일
const {oneNum, tenNum} = require('./a.js'); // 같은 디렉토리에 있다고 가정
console.log(oneNum,tenNum); // 1, 10
이런식으로 모듈을 불러오는 require() 함수 안에 불러올 모듈의 경로를 적어준다.
그런다면 a.js 안에 있는 내용들을 자유롭게 사용할 수가 있다.
//a.js 파일
exports.oneNum = 1;
exports.tenNum = 10;
이렇게 exports 객체에 위와 같이 값을 대입해도 위에 module.exports를 사용한거와 동일하게 동작한다.
그 이유는 module.exports와 exports 객체가 결국 같은 객체를 참조하기 때문이다.
module.exports 는 빈 객체를 참조한다.
exports 는 module.exports 를 참조한다.
최종적으로 return 되는 값은 module.exports 이다.
module.exports 에는 어떤 값이든 대입해도 상관없지만, exports 에는 반드시 객체처럼 속성명과 속성 값을 대입해야한다.
exports에 다른 값을 대입한다면 참조 관계가 끊겨버려 모듈로 기능 할 수가 없다.
exports를 사용할 때는 객체만 사용할 수 있으므로 module.exports에 함수를 대입한 경우에는
exports로 바꿀 수가 없다.
❗️ exports와 module.exports는 참조 관계에 있으므로 한 모듈에 exports 객체와 module.exports 를 동시에
사용하지 않는 것이 좋다 ❗️