콘솔에 나오는 경로는 이 책과 다를 것입니다. 위 예제에서 알아야 할 점은 require가 반드시 파일 최상단에 위치할 필요가 없고, module.exports도 최하단에 위치할 필요가 없다는 것입니다. 아무 곳에서나 사용해도 됩니다.
require.cache 객체에 require.js나 var.js 같은 파일 이름이 속성명으로 들어 있는 것을 볼 수 있습니다. 속성값으로는 각 파일의 모듈 객체가 들어 있습니다. 한번 require한 파일은 require.cache에 저장되므로 다음 번에 require할 때는 새로 불러오지 않고 require.cache에 있는 것이 재사용됩니다.
만약 새로 require하길 원한다면 require.cache의 속성을 제거하면 됩니다. 다만, 프로그램의 동작이 꼬일 수 있으므로 권장하지는 않습니다. 속성을 자세히 살펴보면 module.exports했던 부분(exports)이나 로딩 여부(loaded), 자식(children) 모듈 관계를 찾을 수 있습니다.
require.main은 노드 실행 시 첫 모듈을 가리킵니다. 현재 node require로 실행했으므로 require.js가 require.main이 됩니다. require.main 객체의 모양은 require.cache의 모듈 객체와 같습니다. 현재 파일이 첫 모듈인지 알아보려면 require.main === module을 해보면 됩니다. node require로 실행한 경우, var.js에서 require.main === module을 실행하면 false가 반환될 것입니다. 첫 모듈의 이름을 알아보려면 require.main.filename으로 확인하면 됩니다.
모듈을 사용할 때는 주의해야 할 점이 있습니다. 만약 두 모듈 dep1과 dep2가 있고 이 둘이 서로를 require한다면 어떻게 될까요?
dep1.js
const dep2 = require('./dep2');
console.log('require dep2', dep2);
module.exports = () => {
console.log('dep2', dep2);
};
dep2.js
const dep1 = require('./dep1');
console.log('require dep1', dep1);
module.exports = () => {
console.log('dep1', dep1);
};