require / exports (NodeJS의CommonJS)

1.본 게시물에서 소개할 내용은 NodeJS의 CommonJS의 require과 exports이다. ES6의 import와 export가 아니다

자바스크립트 개발을 하다보면 모듈을 불러오는 문법 두가지 (  require / exports ) 와 ( import / export ) 키워드를 접하게 되는데, 이 둘은 비슷하면서도 달라 가끔 자바스크립트 개발하는데 있어 혼동을 준다.

둘다 외부의 파일이나 라이브러리의 코드를 불러온다는 같은 목적을 가지고 있지만, 전혀 다른 문법 구조를 지니고 있다.

※export의 경우 헷갈리게 단수 export(ES6)와 복수 exports(Nodejs:CommonJS)이다

(  require / exports ) 는 NodeJS에서 사용되고 있는 CommonJS 키워드이고 Ruby 언어 스타일과 비슷하다라고 볼수 있다.

( import / export ) 는 ES6(ES2015)에서 새롭게 도입된 키워드로서 Java나 Python 언어 방식과 비슷하다.

2.CommonJS의 require/exports의 사용예제

exports (ES6와 다르게 복수형태임)

// ES6의 export default와 같다

// ES6의 export default와 마찬가지로 파일내에서 한번만 사용가능하다

// 모듈 전체를 export, 파일내 한번만 사용가능하다.
const obj = {
   num: 100,
   sum: function (a, b) {
      console.log(a + b);
   },
   extract: function (a, b) {
      console.log(a - b);
   },
};

module.exports = obj;

exports를 사용시 기본적으로 2가지 규칙만 기억하면 된다.
1. 여러개의 객체를 내보낼 경우 → export.변수 의 개별 속성으로 할당
2. 딱 하나의 객체를 내보낼 경우 → module.exports = 객체 자체에 할당

require

const obj = require('./exportFile.js');

obj.num; // 100
obj.sum(10, 20); // 30
obj.extract(10, 20); // -10

3.ES6의 export default 구문이 CommonJS의 module.exports =와 같다

4.ES6의 Import와 CommonJS의 require차이

  • require()는 CommonJS를 사용하는 node.js문이지만 import()는 ES6에서만 사용

  • require()는 파일 (어휘가 아님)에 들어있는 곳에 남아 있으며 import()는 항상 맨 위로 이동

  • require()는 프로그램의 어느 지점에서나 호출 할 수 있지만 import()는 파일의 시작 부분에서만 실행할 수 있다. (그렇지만 import 전용 비동기 문법으로 파일 중간에 모듈 불러오기를 할 수 있다.

  • 하나의 프로그램에서 두 키워드를 동시에 사용할 수 없다

  • 일반적으로 import()는 사용자가 필요한 모듈 부분 만 선택하고 로드 할 수 있기 때문에 더 선호된다. 또한 require()보다 성능이 우수하며 메모리를 절약한다.

5.exports와 module.exports의 차이

1.기본적으로 exports와 module.exports 는 같다

2.그러나 exports만으로는 프로퍼티를 참조하는 방식으로 밖에 사용을 못한다

3.그러므로 module.exports가 더 활용성이 높다. module.exports를 사용하자

var  template = { a: 'a', b: 'b'};

module.exports.foo = template; //(o)
module.exports = template; //(o)
module.exports = { a: 'a', b: 'b'} // (o)
exports.foo = template; //(o) // 프로퍼티를 참조하는 방식
exports = template; //(x)
exports = { a: 'a', b: 'b'} // (x)

6.NodeJS에서 ES6의 Import를 사용하기 위해 해야하는 설정

pacakage.json의 type에 module

// package.json
{
	"type": "module"
}


참조

https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-require-%E2%9A%94%EF%B8%8F-import-CommonJs%EC%99%80-ES6-%EC%B0%A8%EC%9D%B4-1

Apr 15, 2023 Views 97