-
노드 exports, this, require, 순환참조노드 2023. 4. 11. 14:18
exports
module.exports에서 module은 스킵이 가능하다.
//var.js const odd = '홀수입니다' ; const even = '짝수입니다'; exports.odd = odd; exports.even = even; //module.exports = {odd, even};
module을 스킵하려면 이런 형태로 선언해야 한다.
그런데 한 가지 규칙이 있다.
모듈로 만들고 싶은게 있다면 module.exports해서 한가지만 넣는 것이 좋다.
그리고 odd, even 처럼 두 개를 넣고 싶다면 exports만 써서 넣는 것이 좋다.
다시 말하자면. 참조관계는 이러하다.
module.exports === exports === {}
module.exports에 만약에 함수가 들어갔다면?
module.exports !== exports === {}
이렇게 되어서 참조 관계가 깨지게 된다. 그래서 이런 문제가 발생하기 쉽기 때문에 위에서 설명한 규칙을 말한것이다.
즉, 한가지만 module로 만들고 싶다면 module.exports를 쓰고 아니면 exports를 권장한다.
*exports를 사용 했는데 밑에 module.exports를 사용했다면 exports는 무시된다. 즉, exports 와 module.exports를 둘 다 사용할 수는 없다.
this
console.log(this); //global? function a() { console.log(this === global); } a();
자바스크립트때와는 달리 처음 출력문의 this는 Window 객체가 출력되지 않았다. 이유는 Node에서는
console.log(this === module.exports==={})
위와 같기 때문이다. 때문에 빈 객체가 출력이 된다.
그리고 function 안에 있는 this는 global인 것을 확인 가능하다.
require의 특성
const value = require('./var'); require('./var);
처음의 경우는 var.js에서 사용하는 변수들 까지 다 가져와서 쓰겠다는 뜻이 된다.
두 번째는 변수까지는 아니고 그냥 var를 실행만 하고 싶다~ 할때 쓴다. (다른 파일을 실행만 하고 싶다).
require('./var'); console.log(require);
require를 출력해보면 다음과 같다
require에는 다른 부분들도 있지만 지금은 main 과 cache 부분만 살펴보겠다.
main은 실행한 것이다. 즉 require.main으로 어떤 파일을 실행한건지 알아낼 수 있다.
cache 부분은 효율을 위해서 넣어둔 것이라고 생각하면 된다.
한번 require로 받아온것은 캐싱이 된다. 즉, var.js를 한번 읽어오면 cache 부분에 저장이 되게 된다.
그래서 한번더 var.js를 불러온다면 이제는 cache에서 var.js를 불러 오게 된다.
처음 불러올 때는 실제 파일을 읽어 오지만 두 번째 부터는 cache 메모리에서 불러 오게 된다. (속도 향상)
순환참조
require(./dep1); require(./dep2);
dep2.js에서 dep1을 참조하고 dep1에서 dep2를 참조한다면 순환참조가 일어난다. 마치 무한 루프처럼 서로가 서로를 계속 읽기 때문에 컴퓨터가 멈출 수도 있지만? 실제로 이렇게 작동하지는 않는다.
실제로는 순환참조가 일어났다~ 라고 하면 빈 객체 {} 로 바꿔버린다.
dep1에 어떤 것이 들어있던 순환참조가 발생했으므로 dep2에서 dep1.js를 읽었을때 {} 빈 객체가 반환된다.
require('./dep1'); //{}
'노드' 카테고리의 다른 글
노드 내장 객체 global, console, 타이머 (0) 2023.04.11 노드 ECMAScript 모듈, 다이나믹 임포트, top level await (0) 2023.04.11 노드 CommonJS 모듈 시스템 (0) 2023.04.11 REPL (0) 2023.04.11 서버로서의 노드 (0) 2023.04.11