자바스크립트 module.exports 와 require

이한재·2023년 1월 18일
0

nodejs 를 사용하다보면 require 를 통해 모듈을 불러오곤 하는데
모듈을 불러오기 위해서 어떤 작업이 필요할까 확실하게 알고 싶어서 module export 에 대해 찾아봤다.

  1. module.exports 를 참조하는 변수 선언하여 객체에 함수 저장
var exports = module.exports = {}

exports.add = function(x, y) {
  return x + y
}

console.log(exports)
  1. module.exports 객체에 함수 저장
const add = function(x, y) {
  return x + y
}

module.exports = {
	add,  
}
  1. exports 객체에 바로 접근
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 를 참조할 뿐이다.

참고 : https://medium.com/@chullino/require-exports-module-exports-%EA%B3%B5%EC%8B%9D%EB%AC%B8%EC%84%9C%EB%A1%9C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1d024ec5aca3

profile
이한재입니다

0개의 댓글