개인공부/TIL(Today I Learned)

TIL 39일차_모듈과 CommonJS

soon327 2021. 2. 26. 00:12

모듈??

개발하는 애플리케이션의 크기가 커지면 언젠가 파일을 여러 개로 분리해야하는 시점이 온다.(라고한다.)
이때 분리된 파일 각각을 모듈이라고 부르는데, 모듈은 대개 클래스 하나 혹은 특정한 목적을 가진 복수의 함수로 구성된 라이브러리 하나로 구성된다.

CommonJS

CommonJS는 이러한 모듈을 관리하기 위한 모듈시스템 중 하나이다.
그러나 모듈시스템은 2015년에 표준으로 등재되면서 대부분의 주요 브라우저와 Node.js는 모듈시스템을 지원하고 있다.(exportimport)

하지만 아직 많은 회사들과 스크립트에서 CommonJS를 사용하고 있기때문에 우린 알아두어야한다.😱

모듈 사용하기

우리는 필요한 모듈을 npm install명령어를 사용하여 npm저장소에서 다운받아 node_modules에 저장할 수 있다.
이렇게 저장된 모듈은
require을 사용하여 불러올 수 있다.
const 변수 = require('모듈이름')
const fs = require('fs')

다른 스크립트파일을 불러오기 위해서도 require구문을 사용할 수 있다.
결국 모듈이라는 것도 스크립트의 하나이기 때문이다!

// script1.js
const module2 = require('./script2.js')
console.log(modules2) // 'this is module 2'

// script2.js
module.exports = 'this is module 2'

위의 코드처럼 다른 스크립트 파일에서 내가 만든 모듈을 사용할 수 있도록 노출시키는 방법은
module.exports구문을 사용하는 것이다.

module.exports 대신에 exports를 사용할 수도 있다.
exports는 일종의 축약형(shortcut)이며, exportsmodule.exports를 참조한다.
이러한 모듈 노출 방법과, 불러오는 방법을 CommonJS 모듈 시스템이라고 부른다.

정리 및 주의!

  • 모듈 정의는 전역객체인 exports 객체를 이용한다.
  • 모듈 사용은 require함수를 사용한다.

exportsmodule.exports를 참조하는 변수일뿐이다.

let module = { exports: {} };
let exports = module.exports; 

// your code 
return module.exports;

exportsmodule.exports객체를 참조하여 바라보고 있으며, 최종적으로 리턴값은 module.exports인 것이다!
따라서 module.exports은 마음대로 써도 되지만, exports반드시 propety방식으로 사용해야한다.
그 이유는 exports를 바로 써버리면, module.exports와의 참조관계를 끊고 해당값을 할당받기 때문이다.

따라서 다음 처럼 같은 값이더라도 다르게 사용해야한다.

const template = { 
  a: 'a', 
  b: 'b' 
}

//같은값을 노출시키더라도 exports축약형은 property방식으로 사용해야 한다!
//script2.js에서 test라는 변수에 require했을 때,

module.exports = template; // script2.js의 test에 template가 할당된다.
exports.foo = template; //script2.js의 test.foo에 template가 할당된다.



exports = template; //exports변수의 module.exports 참조관계가 끊어지고, template값이 할당되어 아무것도 노출되지 않는다.

참고: 아빠개발자

'개인공부 > TIL(Today I Learned)' 카테고리의 다른 글

TIL 41일차_상속과 프로토타입  (0) 2021.02.28
TIL 40일차_ 객체지향프로그래밍(OOP)  (0) 2021.02.27
TIL 38일차_package.json  (0) 2021.02.25
TIL 37일차_CLASS  (0) 2021.02.24
TIL 36일차_Github  (0) 2021.02.23