본문 바로가기

Node.JS

[Node.js 교과서] 2-3. exports, this, require, 순환참조

 

 

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 한 내용을 빈 객체로 만들어버림