HTML, DOM, Node.js

require과 exports - CommonJS

파란배개 2020. 11. 16. 18:10

CommonJS에서는

  • 모든 모듈은 자신만의 독립적인 실행 영역이 있어야 한다.
  • 모듈 정의는 전역객체인 exports 객체를 이용한다.(가져올 모듈을 전역객체 exports의 property로 집어넣기 때문에 모듈이 전역변수를 참조하더라도 클로저로 참조하기 때문에 다른 곳에서 영향을 미치지 않는다.)
  • 모듈 사용은 require 함수를 이용한다.

 

exportsrequire함수를 사용해 반환받는 객체이다.

 

이 둘을 이용하면 다른 js 파일에 있는 변수나 함수를 사용할 수 있다.

즉, exports.x = 30이라면 
exports = {x : 30}가 된다. 
require은 이 {x : 30}을 가져오는 것.

 

단, 불러올 파일이 딱히 변수나 함수 참조 없이 단순하다면 exports가 필요 없는 경우도 있다.

//불러올 js파일에서
let mod1 = require("./consolelog.js")

//내보낼 js파일에서
console.log("hello world")

//이 경우 내보낼 js파일에서 exports를 하지 않아도 불러올 js파일에서 hello world가 찍힌다.

 

추가로, exports를 써도 module.exports가 사용된다. exports module.exports를 참조할 뿐이다. 

그렇기 때문에 만약 한 파일에서 exports module.exports를 같이 쓸 경우, module.exports에 뭔가가 이미 붙어 있다면 exports에 붙은 것은 무시된다. 따라서 두 개를 되도록이면 같이 쓰면 안 된다.

또한, 상기한 것처럼 exportsexports.module을 참조하는 변수이기 때문에 exports = { a : 1} 이런 식으로 사용하면 안 된다(반면 module.exportsmodule.exports = {a : 1} 이런 식으로 사용해도 된다).

let exports = module.exports = {}
//exports와 module.exports와의 관계

module.exports = {a : 1}
//사용 가능
exports = {a : 1}
//사용 불가능. module.exports를 참조하던 변수 exports가 {a : 1}이라는 객체가 되어버린다.

 

그렇다면 왜 exports를 쓸까? 바로 조금이라도 더 적게 입력하고 싶기 때문이다.

 

사용 예시) 모듈을 다른 js파일에서 사용하려고 할 때

함수를 사용하려는 파일에서

const requestHandler = require("./request-handler.js")


const requestHandler = require("./request-handler")
//*require에서는 확장자를 생략해도 되므로 이렇게도 가능하다.

함수를 내보내는 파일에서

module.exports = requestHandler;

 

내장모듈은 이미 exports가 되어 있기 때문에 require로 가져올 수 있다.

사용 예시) 

const http = require("http");

 

export가 아니다! s를 절대 빼먹지 말자!

 

TIP.

require("./request.js") -> .은 같은 디렉토리에 있는 require.js
require("../request.js") -> ..은 상위 디렉토리에 있는 require.js



//여러개의 모듈을 exports 할 때

module.exports = {
	a : 1, 
	hello : () => {
	console.log(hello)
	}
}
//여러개의 모듈을 require할 때
let {a, hello} = require("./require.js")

 

 

 

추가로 참고할만한 글

www.daleseo.com/js-module-require/