3.3 모듈로 만들기
포스트
취소

3.3 모듈로 만들기

기존 블로그에 작성했던 포스트를 이전한 글입니다.

해당 포스트는 NODEJS를 학습하며 정리한 내용에 대한 포스트입니다.




🌈 모듈로 만들기

💻 모듈

노드는 자바스크립트 코드를 모듈로 만들 수 있음

  • 모듈: 특정한 기능을 하는 함수나 변수들의 집합

  • 모듈로 만들면 여러 프로그램에서 재사용 가능

모듈


💻 모듈 만들어보기

같은 폴더 내에 var.js, func.js, index.js 만들기

  • 파일 끝에 module.exports로 모듈로 만들 값을 지정

  • 다른 파일에서 require(파일 경로)로 그 모듈의 내용 가져올 수 있음

🔻var.js

1
2
3
4
5
6
7
const odd = '홀수입니다';
const even = '짝수입니다';

module.exports = {
  odd,
  even,
};

🔻func.js

1
2
3
4
5
6
7
8
9
10
const { odd, even } = require('./var');

function checkOddOrEven(num) {
  if (num % 2) { // 홀수면
    return odd;
  }
  return even;
}

module.exports = checkOddOrEven;

🔻index.js

1
2
3
4
5
6
7
8
9
10
11
12
const { odd, even } = require('./var');
const checkNumber = require('./func');

function checkStringOddOrEven(str) {
  if (str.length % 2) { // 홀수면
    return odd;
  }
  return even;
}

console.log(checkNumber(10));
console.log(checkStringOddOrEven('hello'));

💻 파일 간의 모듈 관계

node index로 실행

  • const { odd, even } 부분은 module.exports를 구조분해 할당한 것임

require와 module.export


💻 ECMAScript 모듈

자바스크립트 자체 모듈 시스템 문법이 생김

  • 아직 노드에서의 지원은 완벽하지 않음. mjs 확장자를 사용해야 함.

  • 크게는 require 대신 import, module.exports 대신 export default를 쓰는 것으로 바뀜

🔻func.mjs

1
2
3
4
5
6
7
8
9
10
import { odd, even } from './var';

function checkOddOrEven(num) {
  if (num % 2) { // 홀수면
    return odd;
  }
  return even;
}

export default checkOddOrEven;
1
2
3
$ node index.mjs
MJS 짝수입니다
MJS 홀수입니다

mjs 확장자 대신 js 확장자를 사용하면서 ES 모듈을 사용하려면 package.json에 type: “module” 속성을 넣으면 된다.

CommonJS 모듈과는 다르게 import 시 파일 경로에서 js, mjs 같은 확장자는 생략할 수 없다.

또한, 폴더 내부에서 index.js도 생략할 수 없다.

🔻CommonJS 모듈과 ECMAScript 모듈의 차이

차이점CommenJS 모듈ECMAScript 모듈
문법require(‘./a’);
module.exports = A;
const A = require(‘./a’);
exports.C = D;
const E = F; exports.E = E;
const { C, E } = require (‘./b’);
import ‘./a.mjs’;
export default A;
import A from ‘./a.mjs’;
export const C = D;
const E = F; export { E };
import { C, E } from ‘./b.mjs’;
확장자js
cjs
js(package.json에 type: “module” 필요)
mjs
확장자 생략가능불가능
다이내믹 임포트가능불가능
인덱스(index) 생략가능
(require(‘./folder’))
불가능
(import ‘./folder/index.mjs’)
top level await불가능가능
__filename,
__dirname,
require,
module.exports,
exports
사용 가능사용 불가능
(__filename 대신 import.meta.url 사용)
서로 간 호출가능가능

💻 다이내믹 임포트

조건부로 모듈을 불러오는 것을 다이내믹 임포트

🔻dynamic.js

1
2
3
4
5
const a = false;
if (a) {
    require('./func');
}
console.log('성공');
1
2
node dynamic
성공

하지만 ES 모듈은 if문 안에서 import하는 것이 불가능

이럴 때 다이내믹 임포트를 사용

1
2
3
4
5
6
7
const a = true;
if (a) {
    const m1 = await import('./func.mjs');
    console.log(m1);
    const m2 = await import('./var.mjs');
    console.log(m2);
}
1
2
3
$ node dynamic.mjs
[Module: null prototype] { default: [Function: checkOddOrEven] }
[Module: null prototype] { even: 'MJS 짝수입니다', odd: 'MJS 홀수입니다' }

import라는 함수를 사용해서 모듈을 동적으로 불러올 수 있다.

import는 Promise를 반환하기에 await이나 then을 붙여야 한다.

위 코드에서는 async 함수를 사용하지 않았는데, ES 모듈의 최상위 스코프에서는 async 함수 없이도 await할 수 있다. CommonJS 모듈에서는 안 된다.




📚 레퍼런스

조현영. Node.js 교과서 = Node.js Textbook / 조현영 지음 (2022). Print.

[리뉴얼] Node.js 교과서 - 기본부터 프로젝트 실습까지

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.