모듈 시스템이란
각 소스코드를 독립적인 개체(모듈)로 묶어서 관리하는 방식 => 캡슐화
- 각 소스코드 간의 scope 간섭을 없애고 각자의 소스코드가 독립적인 scope를 갖도록 해줌
- 용도/책임/역할 등에 따라서 코드를 분리해서 관리할 수 있음
- ECMAScript 표준 module system ⇒ 비동기
- Node.js의 CommonJS ⇒ 동기
module.exports
객체 형식으로 모듈에서 내보낸다.
node.js에서는 모듈을 불러오기 위해 모듈을 쓸 파일에서 require() 함수를 쓴다.
<예시>
// module.exports.js
module.exports = {
area: (width) => Math.pow(width,2),
perimeter: (width) => (width*4),
};
// app.js
const getSquare2 = require('./module_exports');
console.log(getSquare2.area(3));
console.log(getSquare2.perimeter(3));
<예시2>
// circle.js
var PI = 3.14;
module.exports.area = function (radius) {
return PI * radius * radius;
}
module.exports.circumference = function (radius) {
return 2 * PI * radius;
}
module.exports에 값을 넣는 것은 모듈이 실행될 때 즉시 이루어져야 한다.
따라서 콜백 함수에서 module.exports에 값을 넣으면 오류가 발생한다.
// foo.js
setTimeout(function() {
module.exports = { a: 'hello' };
}, 0);
// main.js
var foo = require("./foo");
console.log(foo.a);
exports
module.exports의 단축형이며 동일한 역할을 한다.
module.exports.a = "hello";
exports.a = "hello";
// exports.js
exports.area = (width) => Math.pow(width,2);
exports.perimeter = (width) => width*4;
// module.exports.js
module.exports = {
area: (width) => Math.pow(width,2),
perimeter: (width) => (width*4),
};
// app.js
const getSquare = require('./exports');
console.log(getSquare.area(5));
console.log(getSquare.perimeter(5));
const getSquare2 = require('./module_exports');
console.log(getSquare2.area(3));
console.log(getSquare2.perimeter(3));
// GOOD
module.exports.add = (a, b) => a + b
// GOOD
module.exports = {
add(a, b) { return a + b}
}
// GOOD
exports.add = (a, b) => a + b
// BAD, exports 자체는 반환되지 않으므로, 바깥으로 전달되지 않는다.
exports = {
divide(a, b) { return a / b}
}
'Back-end > Node.js' 카테고리의 다른 글
| [Express.js] Routing & Route Handler (0) | 2023.09.13 |
|---|