기존 블로그에 작성했던 포스트를 이전한 글입니다.
해당 포스트는
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를 구조분해 할당한 것임
💻 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.