Exports
js 파일에서 export를 여러개 할 때는 module.exports 에 객체 안에 대입해서 선언
한개를 export할 때는 module.exports 에 직접 대입
module.exports와 exports를 같이 쓸 수 없음
const odd = '홀수입니다'
const even = '짝수입니다'
exports.odd = odd;
exports.even = even;
module.exports === exports === {odd, even}
module.exports = {
odd, even
}
function checkOddOrEven (number) {
if (number%2) {
return odd;
} else {
return even;
}
}
//아래처럼 module.exports에 함수를 대입하면
module.exports = checkOddOrEven
//module.exports와 exports는 같지 않음
module.exports !== exports === {odd, even}
//결론적으로 하나를 export 하고 싶으면 module.exports에 직접 대입
// 여러개를 export 하고 싶으면 {} 객체 안에 넣어서 대입!
this
console.log(this) // global? No! {} 빈객체 출력
// 그 이유는 console.log(this === module.exports === {}) 이기 때문
function a() {
console.log(this === global)//true
//함수를 선언할 때 마다 함수의 this는 global로 선언됨
}
a();
Require
require가 제일 위에 올 필요는 없음
require.cache에 한번 require한 모듈에 대한 캐싱 정보가 들어있음 (require 하면 읽은 내용을 cache에 저장함)
require.main은 노드 실행 시, 첫 모듈을 가리킴
require('./2_1_test')//2_1_test.js를 실행만 하고 싶을 때, require 후 대입 안하면 됨
console.log(require)
// [Function: require] {
// resolve: [Function: resolve] { paths: [Function: paths] },
// main: {
// id: '.',
// path: 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic',
// exports: {},
// filename: 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic\\3_require.js',
// loaded: false,
// children: [ [Object] ],
// paths: [ ...],
// cache: [Object: null prototype] {
// 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic\\3_require.js': {
// id: '.',
// path: 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic',
// exports: {},
// filename: 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic\\3_require.js',
// loaded: false,
// children: [Array],
// paths: [Array]
// },
// 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic\\2_1_test.js': {
// id: 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic\\2_1_test.js',
// path: 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic',
// exports: {},
// filename: 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic\\2_1_test.js',
// loaded: true,
// children: [Array],
// paths: [Array]
// },
// 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic\\2_CommonJS_module_system.js': {
// id: 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic\\2_CommonJS_module_system.js',
// path: 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic',
// exports: [Object],
// filename: 'c:\\Users\\quintet\\Desktop\\dev\\prac\\nodejsPrac\\NodejsTextBook\\2_node_basic\\2_CommonJS_module_system.js',
// loaded: true,
// children: [],
// paths: [Array]
// }
// }
// }
순환 참조
dep1.js 에서 dep2.js를 참조하고
dep2 .js 에서 dep1 .js를 참조하면 무한 순환 참조가 발생함
그래서 node js에서는 이를 순환 참조를 막기위해 module.export 한 내용을 빈 객체로 만들어버림
'Node.JS' 카테고리의 다른 글
[Node.js 교과서] 2-5. global, console, 타이머 (Node js의 내장객체) (1) | 2023.12.19 |
---|---|
[Node.js 교과서] 2-4. ECMAScript 모듈, 다이나믹임포트, top level await (1) | 2023.12.19 |
[Node.js 교과서] 2-1,2. REPL 및 CommonJS 모듈 시스템 (0) | 2023.12.18 |
[Node.js 교과서]1-5. 화살표 함수 (0) | 2023.12.15 |
[Node.js 교과서]1-1,2. 호출 스택, 이벤트 루프 (0) | 2023.12.15 |