① 모듈
② 노드는 코드를 모듈로 만들 수 있다.
① CommonJS 모듈
② CommonJS 형식으로 모듈 만들기
const odd = 'CJS 홀수입니다';
const even = 'CJS 짝수입니다';
module.exports = {
odd,
even,
};
const { odd, even } = require('./var');
function checkOddOrEven(num) {
if (num % 2) {
return odd;
}
return even;
}
module.exports = checkOddOrEven;
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'));
exports.odd = 'CJS 홀수입니다';
exports.even = 'CJS 짝수입니다';
③ 순환 참조(circular dependency)
const dep2 = require('./dep2');
console.log('require dep2', dep2);
module.exports = () => {
console.log('dep2', dep2);
};
const dep1 = require('./dep1');
console.log('require dep1', dep1);
module.exports = () => {
console.log('dep1', dep1);
};
const dep1 = require('./dep1');
console.log('require dep1', dep1);
module.exports = () => {
console.log('dep1', dep1);
};
① ECMAScript 모듈(ES 모듈)
② ECMAScript 모듈 사용법
export const odd = 'MJS 홀수입니다';
export const even = 'MJS 짝수입니다';
import { odd, even } from './var.mjs';
function checkOddOrEven(num) {
if (num % 2) { // 홀수이면
return odd;
}
return even;
}
export default checkOddOrEven;
import { odd, even } from './var.mjs';
import checkNumber from './func.mjs';
function checkStringOddOrEven(str) {
if (str.length % 2) { // 홀수이면
return odd;
}
return even;
}
console.log(checkNumber(10));
console.log(checkStringOddOrEven('hello'));
③ CommonJS vs ES 모듈
CommonJS 모듈 | 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 |
mjs js(package.json - type: "module") |
확장자 생략 | 가능 | 불가능 |
다이내믹 임포트 | 가능 | 불가능 |
인덱스(index) 생략 | 가능 ex) require('./folder')) |
불가능 ex) import './folder/index.mjs') |
top level await | 불가능 | 가능 |
__filename, __dirname, require, module.exports, exports |
사용 가능 | 사용 불가능 (import.meta.url 사용) |
서로 간 호출 | 가능 |
** 서로 간에 호환되지 않는 경우가 많으므로 한 가지 형식만 사용하는 것을 권장한다.
const a = true;
if (a) {
const m1 = await import('./func.mjs');
console.log(m1);
const m2 = await import('./var.mjs');
console.log(m2);
}
console.log(__filename); // C:\Users\user_name\Desktop\filename.js
console.log(__dirname); // C:\Users\user_name\Desktop
console.log(import.meta.url); // file:///C:/Users/user_name/Desktop/filename.mjs
console.log(__filename); // ReferenceError: __filename is not defined in ES module scope
1. CommonJS 형식으로 작성된 코드를 ECMAScript 모듈 형식으로 변경하시오.
const { name, number } = require('./var');
function getInfo() {
return `${name} ${number} Team`;
}
module.exports = getInfo;
정답
1. node, node [파일 경로]
2. CommonJS, ECMAScript
3. require
4. import.meta.url
1번
import { name, number } from './var.mjs';
function getInfo() {
return `${name} ${number} Team`;
}
export default getInfo;
출처 : 조현영, 『 Node.js 교과서 개정 3판』, 길벗(2022)
Corner Node.js 1
Editor : Snoopy
[노드 1팀] 3장. 노드 기능 알아보기 (2) (0) | 2024.11.08 |
---|---|
[노드 1팀] 2장. 알아둬야 할 JavaScript (0) | 2024.10.11 |
[노드 1팀] 1장. 노드 시작하기 (0) | 2024.10.11 |
[노드 1팀] 2주차. JavaScript 반복문(Loop), 반복자(Iterator), 객체(Object) (2) | 2024.10.04 |
[노드 1팀] 1주차. JavaScript 조건문(conditionals), 함수(functions), 배열(array) (0) | 2024.10.04 |