Node.js가 모듈을 로드할 때는, 한 가지 해주는 작업
--> Module wrapper function'이라는 것으로 모듈 내의 전체 코드를 감싸주는 작업
Syntax, 아래처럼 생겼다.
(function (exports, require, module, __filename, __dirname) {
// 모듈 코드
});
예를 들어,
아래의 함수를
function add(a,b){
return a + b;
}
exports.add = add;
아래처럼 감싸준다.
(function (exports, require, module, __filename, __dirname) {
function add(a,b){
return a + b;
}
exports.add = add;
});
Module wrapper function의 다섯 가지 인자
function add(a, b) {
return a + b;
}
exports.add = add;
console.log('exports ------------------------->');
console.dir(exports);
console.log('require ------------------------->');
console.dir(require);
console.log('module ------------------------->');
console.dir(module);
console.log('__filename ------------------------->');
console.dir(__filename);
console.log('__dirname ------------------------->');
console.dir(__dirname);
이 중에서, exports와 module만 좀 더 자세히 보장
exports ------------------------->
{ add: [Function: add] }
module ------------------------->
Module {
id: '.',
path: 'C:\\NodeJs\\기본개념',
exports: { add: [Function: add] },
filename: 'C:\\NodeJs\\기본개념\\module.js',
loaded: false,
children: [],
paths: [
'C:\\NodeJs\\기본개념\\node_modules',
'C:\\NodeJs\\node_modules',
'C:\\node_modules'
]
}
exports 객체와 module 객체의 exports 프로퍼티가 가리키는 객체는 '동일한' 객체
모듈 내부의 것들을 외부로 공개하기 위해 exports나 module.exports를 썼던 것은 바로 이 객체에 접근하기 위함
모듈을 실행하는 script 에서 보면은
const m = require("./module.js")
require 함수는 'exports 객체(=module 객체의 exports 프로퍼티가 가리키는 객체)'를 리턴