CommonJS에서는
- 모든 모듈은 자신만의 독립적인 실행 영역이 있어야 한다.
- 모듈 정의는 전역객체인 exports 객체를 이용한다.(가져올 모듈을 전역객체 exports의 property로 집어넣기 때문에 모듈이 전역변수를 참조하더라도 클로저로 참조하기 때문에 다른 곳에서 영향을 미치지 않는다.)
- 모듈 사용은 require 함수를 이용한다.
exports는 require함수를 사용해 반환받는 객체이다.
이 둘을 이용하면 다른 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에 붙은 것은 무시된다. 따라서 두 개를 되도록이면 같이 쓰면 안 된다.
또한, 상기한 것처럼 exports는 exports.module을 참조하는 변수이기 때문에 exports = { a : 1} 이런 식으로 사용하면 안 된다(반면 module.exports는 module.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")
추가로 참고할만한 글
'HTML, DOM, Node.js' 카테고리의 다른 글
React Component lifecycle diagram - React (0) | 2020.11.19 |
---|---|
노드 서버를 브라우저로 디버거 가능하게 하는 법 - Node.js (0) | 2020.11.17 |
.then과 await이 뭐가 다를까 - Node.js (0) | 2020.11.13 |
HTTP의 두 가지 특징 - HTTP (0) | 2020.11.13 |
chatterbox DOM 예제 (0) | 2020.11.12 |