module, exports, this, require, 순환참조

김무연·2023년 12월 11일

Backend

목록 보기
12/49

모듈 : 특정한 기능을 하는 함수나 변수들의 집합

모듈로 만들면 여러 프로그램에서 재사용 가능

노드는 자바스크립트 코드를 모듈로 만들 수 있음

const odd = "홀수입니다";
const even = "작수입니다";

module.exports = {
  odd,
  even,
};

위와 같은 코드로 export 가능, 또한 module. 를 생략하고도 아래와 같이 가능

const odd = "홀수입니다";
const even = "작수입니다";

exports.odd = odd;
exports.even = even;

하지만 module.exports 와 exports. 를 둘 다 같이 쓸 순 없음, 참조 오류 발생, 때문에 한 파일에서는 둘 중 하나로만 써야 함

this의 차이점

console.log(this)
console.log(this === module.exports)

function a() {
  console.log(this === global);
}

a();

>> {} ture true
  • 함수마다 this가 새로 생김
  • 화살표함수 쓰면 부모의 this 물려받음
  • 하지만 전역변수의 this만 module.exports가 됨
    따라서 module.exports.odd 랑 this.odd가 같음

require의 특성

  • require가 제일 위에 올 필요는 없음
  • require.cache에 한 번 require한 모듈에 대한 캐쉬 정보가 들어있음
  • require.main은 노드 실행시 첫 모듈을 가리킴
console.log('require가 가장 위에 오지 않아도 됩니다.');

module.exports = '저를 찾아보세요.';

require('./var');

console.log('require.cache입니다.');
console.log(require.cache);
console.log('require.main입니다.');
console.log(require.main === module);
console.log(require.main.filename);

순환참조

두개의 모듈이 서로를 require하는 상황을 조심해야 함, 즉 서로서로 호출하는 상황

  • del1이 del2를 require하고, dep2가 dep1을 require하는 상황
  • del1의 module.exports가 함수가 아니라 빈 객체가 됨(무한 반복을 막기 위해 의도됨)
  • 순환참조하는 상황이 나오지 않도록 하는게 좋음

profile
Notion에 정리된 공부한 글을 옮겨오는 중입니다... (진행중)

0개의 댓글