nodejs 를 사용하다보면 require 를 통해 모듈을 불러오곤 하는데
모듈을 불러오기 위해서 어떤 작업이 필요할까 확실하게 알고 싶어서 module export 에 대해 찾아봤다.
var exports = module.exports = {}
exports.add = function(x, y) {
return x + y
}
console.log(exports)
const add = function(x, y) {
return x + y
}
module.exports = {
add,
}
const add = function(x, y) {
return x + y
}
exports.add = add
exports 변수는 modules.exports 를 참조하고 있고 module.exports 를 빈 객체로 생성하였다.
exports 를 콘솔 로그를 찍어보면
exports 라는 객체의 add 라는 키 값에 함수가 저장된 것을 확인 할 수 있다.
{ add: [Function (anonymous)] }
이렇게 하게되면 만약 위의 코드를 calc.js 라는 파일명으로 저장하였을때
const calc = require('./calc.js')
require 함수를 호출하여 calc.js 에 module.exports 객체에 선언된 함수를 불러 올 수 있다.
구글링 해 보니 require 함수의 모양새는 훨씬 더 복잡하지만 구조만 보면 다음과 같다
var require = function(src){ //line 1
var fileAsStr = readFile(src) //line 2
var module.exports = {} //line 3
eval(fileAsStr) //line 4
return module.exports //line 5
}
첫번째 줄부터 파일을 읽고 module.exports 빈 객체 생성해서 eval 로 파일에 있는 소스코드의 내용을 복사해서 module.exports 에 넣어 리턴해준다고 보면 될 것 같다
따라서 다음과 같은 코드는
//bar.js
const foo = require('./foo.js') //foo.js, bar.js는 같은 디렉토리.
console.log(foo.a)
런타임 상황에서 다음과 같이 해석된다고 보면 될 것 같다.
//bar.js
const foo = { a : 10 }
console.log(foo.a)
결국 자바스크립트에서 모듈을 외부 파일에서 사용하기위해서는 module.exports 에 내가 선언한 함수를 저장하기만 하면 된다.
또한 exports 는 module.exports 에 대한 숏컷이며 exports 는 단순히 module.exports 를 참조할 뿐이다.