관리 메뉴

java,javascript,android,php,sql,공부용,메모용

module, exports, require / 노드의 this - 노드기능 06 본문

javascript, jQuery & Node.js/Node.js

module, exports, require / 노드의 this - 노드기능 06

yy_dd2 2022. 12. 10. 19:39
반응형

https://tog-code.tistory.com/139

 

모듈, 모듈화하기, 노드 모듈 - 노드기능 02

노드는 코드를 모듈로 만들 수 있다. (브라우저의 자바스크립트와 다른점) 모듈 : 특정한 기능을 하는 함수나 변수들의 집합 모듈 필요한 기능만 재사용 프로그램 → 모듈도입 js → 프로그램A js

tog-code.tistory.com

모듈화 한 내용중에

var.js를 변경해봤다

 

module

// * module.exports 대신 exports로 각각 대입해도 동작함

 

// exports 객체 사용 시

//  1. exports 에 직접 객체를 대입해도 되지만 꼭 속성명과 속성값을 대입해야 함

//  2. module.exports 에 함수를 대입한 경우는 exports로 대입 불가능

//  3. exports 와 module.exports는 참조관계가 있어 한 모듈에 이 둘을 동시에 쓰지 말 것

// const odd = '홀수입니다';
// const even = '짝수입니다';

// //  module.exports 안에 대입했고 이파일은 모듈로 기능이 가능해진다.
// module.exports = {
//     odd,
//     even
// };

// * module.exports 대신 exports로 각각 대입해도 동작함
exports.odd = '홀수입니다';
exports.even = '짝수입니다';

 

노드의 This

this.js

console.log(this);      // {}
console.log(this === module.exports);       // true
console.log(this === exports);              // true
function whatIsThis() {
    console.log('function', this === exports, this === global);     // function false true
}

whatIsThis();

최상위 스코프에 있는 this 는 module.exports(exports) 를 가르킴

function 안에 함수는 global 을 가르킨다

 

 

require

require.js

console.log('require가 가장 위에 오지 않아도 됨');

module.exports = '나를 찾아봐'

require('./var');

console.log('require.cache 이다');
console.log(require.cache);
console.log('require.main 입니다.');
console.log(require.main === module);
console.log(require.main.filenam)

 

require()이 최상단에 사용되지 않아도 됨

module.exports도 최하단이 아니여도 됨

 

그러나 상단이나 하단에 있다면 보기가 좋을 듯 하다.

 

- 한번 require 한 파일은 require.cache 에 저장됨

- 새로 사용할 경우 require.cache 삭제하면 됨

 

require.main : 노드를 실행 했을 때 첫 모듈을 가르킴

콘솔에 node node/module/require 라고 작성했고

처음 실행된 모듈이 require.js 이므로 require.main은 require.cache와 같다

현재 파일이 첫 모듈인 것을 알려면 console.log(require.main === module); 이라고 하면 알 수 있다.

 

 

(좀 어려워서 다음에 필요할때 다시 읽어야 할 듯)

 

순환참조 (circular dependency)

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);
};

dep-run

const dep1  =   require('./dep1');
const dep2  =   require('./dep2');

dep1();
dep2();

require dep1 {}
require dep2 [Function (anonymous)]
dep2 [Function (anonymous)]
dep1 {}

.......

dep1의 객체는 빈객체가 되는데 이런 현상이 순환참조라고 한다.

에러가 없이 빈객체가 되기 때문에 서로가 서로를  require  하는 구조를 피해야 한다

 

반응형
Comments